qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH qom-next 11/12] target-i386: initialize APIC at


From: Igor Mammedov
Subject: Re: [Qemu-devel] [PATCH qom-next 11/12] target-i386: initialize APIC at CPU level
Date: Wed, 30 May 2012 17:11:55 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20120430 Thunderbird/12.0.1

On 05/30/2012 04:55 PM, Jan Kiszka wrote:
On 2012-05-30 16:52, Igor Mammedov wrote:
On 05/30/2012 04:38 PM, Jan Kiszka wrote:
On 2012-05-30 16:27, Igor Mammedov wrote:
+
+#ifndef CONFIG_USER_ONLY
+#define MSI_ADDR_BASE 0xfee00000
+
+static void x86_cpu_apic_init(X86CPU *cpu, Error **errp)
+{
+    static int apic_mapped;
+    CPUX86State *env =&cpu->env;
+
+    if (env->apic_state == NULL) {
+        return;
+    }
+
+    if (qdev_init(env->apic_state)) {
+        error_set(errp, QERR_DEVICE_INIT_FAILED,
+                  object_get_typename(OBJECT(env->apic_state)));
+        return;
+    }
+
+    /* XXX: mapping more APICs at the same memory location */
+    if (apic_mapped == 0) {
+        /* NOTE: the APIC is directly connected to the CPU - it is not
+           on the global memory bus. */
+        /* XXX: what if the base changes? */
+        sysbus_mmio_map(sysbus_from_qdev(env->apic_state), 0, MSI_ADDR_BASE);
+        apic_mapped = 1;
        }
    }
+#endif

    void x86_cpu_realize(Object *obj, Error **errp)
    {
        X86CPU *cpu = X86_CPU(obj);

+    x86_cpu_apic_init(cpu, errp);
+    if (error_is_set(errp)) {
+        return;
+    }
+

I guess you are lacking #ifndef CONFIG_USER_ONLY here already (for the
sake of bisectability). Or, likely better, let x86_cpu_apic_init do
nothing for usermode emulation.
initially x86_cpu_apic_init() was doing nothing for usermode, hence lack of
#ifndef CONFIG_USER_ONLY, but then for patch 12/12 #ifndef CONFIG_USER_ONLY
required here any way so I've removed usermode stub x86_cpu_apic_init() and
squashed change in wrong patch :(.

And since I need #ifndef in initfn anyway then probably there is no point
in having x86_cpu_apic_init(), I'll move its body in initfn then.

I think a function is cleaner, and we have some other examples for this
already in this context. Its body could easily be #ifdef'ed out (the
other reason for #ifdef in the initfn are temporary, no?).
Yes, is temporary.
However if Peter could be persuaded not to object for putting mapping of APIC 
base
into apic's initfn then x86_cpu_apic_init() would be temporary as well 
(qdev_init part
goes away with realize property and apic base mapping could be moved into it's
own property setter in apic object and default mapping set in its initfn).
Andreas seems liked putting it there.
Then overall code would look cleaner and with less ifdefs.

"Unfortunately", the mapping belongs to the CPU because it actually
performs it as we pointed out.
Intel SDM tells only about RE-mapping that could be done via msr, but I haven't 
found
any mention about what part of CPU does default initial mapping (it might be 
APIC itself).
Docs just state for external and internal APICs that they are mapped at default 
base
right after power on or reset. :(

Any way moving APIC mapping code in it's own setter inside apic_common object 
might
be good idea on its own even if it's called from CPU to set initial mapping.

PS:
May be Intel guys could tell us how it's done in real hardware if it's not a 
secret.



Jan


--
-----
 Igor



reply via email to

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