qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] cpu_regs in target-i386


From: Andreas Färber
Subject: Re: [Qemu-devel] cpu_regs in target-i386
Date: Sun, 27 Nov 2011 17:10:34 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:8.0) Gecko/20111105 Thunderbird/8.0

Am 27.11.2011 16:23, schrieb Xin Tong:
> This is a bit confusing then
> 
> in target-i386/translate.c
> 
> void optimize_flags_init(void)
> {
>   ...
>   cpu_regs[15] = tcg_global_mem_new_i64(TCG_AREG0,
>                                           offsetof(CPUState, regs[15]), 
> "r15");
>   printf("offsetof(CPUState, regs[15]) is %ld\n", offsetof(CPUState, 
> regs[15]));
> 
>   ...
> }
> 
> output is cpu_regs[15] is 20, offsetof(CPUState, regs[15]) is 120,
> should not cpu_regs[15] == 120 ?

Please don't top-post, your reply is out of context then. See below.

> On Sun, Nov 27, 2011 at 9:53 AM, Andreas Färber <address@hidden> wrote:
>> Am 27.11.2011 15:36, schrieb Xin Tong:
>>> If i understand correctly here, those are just array of offsets for
>>> the emulated registers such that the tcg can easily get access to the
>>> address of the emulated registers. This is, however, different from
>>> the env (CPUx86State) variable which will always have a host register
>>> pointing to it ( host register is made to point to env in the tb enter
>>> prologue).
>>
>> Yes:
>>
>> host register pointed to by cpu_env contains address of env
>> +
>> offset stored in cpu_* variable

Note that "variable" refers to TCG variable (TCGv), not C variable, cf.
tcg/README. If you do printf("%d", cpu_xyz), you will only see the
internal ID of that variable that points to data stored elsewhere. In
this case the ID happens to be constant because these are set up once
during target initialization.

>> =
>> address of corresponding struct member in env

When playing with TCG, configure with --enable-debug-tcg, then the
definitions are changed so that the compiler can make you aware of such
mixups.

Andreas

>>> On Sun, Nov 27, 2011 at 9:12 AM, Andreas Färber <address@hidden> wrote:
>>>> Am 27.11.2011 14:46, schrieb Xin Tong:
>>>>> When the x86 vcpu is initialized, a CPUX86State is qemu_mallocz'ed.
>>>>> env is used to point to it and modifications to the CPUX86State can
>>>>> thereby be done via the register that contains the env. I do not get
>>>>> what the cpu_regs[CPU_NB_REGS] are for, do not we already have a set
>>>>> of emulated x86 registers when we allocate the CPUX86State ?
>>>>
>>>> I assume in i386, too, it will be a TCGv array and will be initialized
>>>> to point to individual memory offsets inside CPU*State.
>>>> So they're for convenience and readability.


-- 
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg



reply via email to

[Prev in Thread] Current Thread [Next in Thread]