Patchwork qemu log function to print out the registers of the guest

login
register
mail settings
Submitter Max Filippov
Date Aug. 16, 2012, 6:31 p.m.
Message ID <CAMo8BfLPgCbfRnHCfJpTvgeEie0nhSf5TiCX+xi9Y+LpM-FuZg@mail.gmail.com>
Download mbox | patch
Permalink /patch/178071/
State New
Headers show

Comments

Max Filippov - Aug. 16, 2012, 6:31 p.m.
On Thu, Aug 16, 2012 at 9:49 PM, Steven <wangwangkang@gmail.com> wrote:
> On Thu, Aug 16, 2012 at 1:43 PM, Max Filippov <jcmvbkbc@gmail.com> wrote:
>> On Thu, Aug 16, 2012 at 9:37 PM, Max Filippov <jcmvbkbc@gmail.com> wrote:
>>> On Thu, Aug 16, 2012 at 9:29 PM, Steven <wangwangkang@gmail.com> wrote:
>>>> On Thu, Aug 16, 2012 at 1:00 PM, Max Filippov <jcmvbkbc@gmail.com> wrote:
>>>>> On Thu, Aug 16, 2012 at 8:36 PM, Steven <wangwangkang@gmail.com> wrote:
>>>>>> On Thu, Aug 16, 2012 at 4:02 AM, 陳韋任 (Wei-Ren Chen)
>>>>>> <chenwj@iis.sinica.edu.tw> wrote:
>>>>>>>> I would like to is there any function that could log the register
>>>>>>>> content of the guest machine, like "info registers" in the qemu
>>>>>>>> monitor mode.
>>>>>>>
>>>>>>>   Why not check how "info registes" be implemented in QEMU? ;)
>>>>>>> I guess you just have to log env->regs or something like that.
>>>>>> Thanks for pointing this out.
>>>>>> I would like to get a trace of guest memory access. So I can not use
>>>>>> "info registers".
>>>>>> What I want to do is that when tcg fetches a load instruction at
>>>>>> disas_insns(), the guest memory address should be calculated. For
>>>>>
>>>>> No, you don't want this, because the same translated code may be
>>>>> invoked multiple times with different values in registers.
>>>>>
>>>>>> example, the tb has an instruction of mov 0x4(%ebx)  %eax.
>>>>>> To calculate the address of 0x4(%ebx), I need to know the value of %ebx.
>>>>>> Is this correct? Thanks.
>>>>>
>>>>> Why don't you just instrument actual memory access functions in
>>>>> softmmu_template.h ?
>>>> But this code only touches the s->pc. For registers in the load
>>>> instruction, it won't generate the memory access code. So I need to
>>>> add code to some function to get the guest memory address access.
>>>
>>> Take a close look at
>>>
>>> DATA_TYPE
>>> glue(glue(glue(HELPER_PREFIX, ld), SUFFIX), MMUSUFFIX)(ENV_PARAM
>>>                                                        target_ulong addr,
>>>                                                        int mmu_idx)
>>>
>>> and
>>>
>>> void glue(glue(glue(HELPER_PREFIX, st), SUFFIX), MMUSUFFIX)(ENV_PARAM
>>>                                                             target_ulong addr,
>>>                                                             DATA_TYPE val,
>>>                                                             int mmu_idx)
>>>
>>> At runtime they get addr, this is the virtual address of the memory access.
>>> This file is included several times to instantiate these functions for
>>> different memory access types.
>>> A set of macros manipulates access size and whether it is code or data access.
>>
>> But maybe I got you wrong and by
>>
>>   What I want to do is that when tcg fetches a load instruction at
>>   disas_insns(), the guest memory address should be calculated.
>>
>> you meant that you need to record code address that made an access,
>> not the accessed data address?
>>
> I want to get the guest memory address in the instruction mov
> 0x4(%ebx)  %eax, whic is 0x4(%ebx).
> Since %ebx is not resolved until the execution time, the code in
> softmmu_header.h does not generate any hit or miss information.
> Do you know any place that I could resolve the memory access address? Thanks.

I see that with the following patch

     index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);

I get some memory accesses logged, but not all. That's due to fast
path in tcg_out_qemu_ld
in case there's TLB hit. I guess you can play with tcg_out_qemu_ld and
make it produce a call
to a helper function, like qemu_ld_helpers, that will print addresses
for all memory access
attempts.

Patch

diff --git a/softmmu_template.h b/softmmu_template.h
index b8bd700..2d02133 100644
--- a/softmmu_template.h
+++ b/softmmu_template.h
@@ -114,6 +114,7 @@  glue(glue(glue(HELPER_PREFIX, ld), SUFFIX),
MMUSUFFIX)(ENV_PARAM
     target_phys_addr_t ioaddr;
     uintptr_t retaddr;

+    fprintf(stderr, "%s: %08x\n", __func__, addr);
     /* test if there is match for unaligned or IO access */
     /* XXX: could done more in memory macro in a non portable way */