qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c
@ 2015-02-03 19:39 Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 1/9] target-i386: Move topology.h to include/hw/i386 Eduardo Habkost
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Eduardo Habkost @ 2015-02-03 19:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gu Zheng, Igor Mammedov, Paolo Bonzini

This series removes the APIC ID initialization code from x86_cpu_initfn()
(getting us one step closer to making object_new() of X86CPU have no dependency
on cpu_exec_init() and other global QEMU state), and moves the APIC ID
compatibility logic from target-i386/cpu.c to hw/i386/pc.c.

Changes v1 -> v2:
 * Move topology.h to include/hw/i386 instead of hw/i386
 * Instead of adding an apic_id_set field, make apic_id a int64_t field
   and set it to -1 by default
 * Check for cpu_init() errors on linux-user

Eduardo Habkost (9):
  target-i386: Move topology.h to include/hw/i386
  target-i386: Rename cpu_x86_init() to cpu_x86_init_user()
  target-i386: Eliminate cpu_init() function
  target-i386: Simplify error handling on cpu_x86_init_user()
  target-i386: Move CPUX86State.cpuid_apic_id to X86CPU.apic_id
  linux-user: Check for cpu_init() errors
  target-i386: Set APIC ID using cpu_index on CONFIG_USER
  target-i386: Require APIC ID to be explicitly set before CPU realize
  target-i386: Move APIC ID compatibility code to pc.c

 hw/i386/pc.c                                | 35 ++++++++++++
 {target-i386 => include/hw/i386}/topology.h |  6 +-
 linux-user/main.c                           |  9 ++-
 target-i386/cpu-qom.h                       |  1 +
 target-i386/cpu.c                           | 86 +++++++++++------------------
 target-i386/cpu.h                           | 13 +----
 target-i386/kvm.c                           |  2 +-
 tests/Makefile                              |  2 -
 tests/test-x86-cpuid.c                      |  2 +-
 9 files changed, 84 insertions(+), 72 deletions(-)
 rename {target-i386 => include/hw/i386}/topology.h (97%)

-- 
2.1.0

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH v2 1/9] target-i386: Move topology.h to include/hw/i386
  2015-02-03 19:39 [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c Eduardo Habkost
@ 2015-02-03 19:39 ` Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 2/9] target-i386: Rename cpu_x86_init() to cpu_x86_init_user() Eduardo Habkost
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Eduardo Habkost @ 2015-02-03 19:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gu Zheng, Igor Mammedov, Paolo Bonzini

This will allow the PC code to use the header, and lets us eliminate the
QEMU_INCLUDES hack inside tests/Makefile.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
Change v2:
 * Move it to include/hw/i386 instead of hw/i386
---
 {target-i386 => include/hw/i386}/topology.h | 6 +++---
 target-i386/cpu.c                           | 2 +-
 tests/Makefile                              | 2 --
 tests/test-x86-cpuid.c                      | 2 +-
 4 files changed, 5 insertions(+), 7 deletions(-)
 rename {target-i386 => include/hw/i386}/topology.h (97%)

diff --git a/target-i386/topology.h b/include/hw/i386/topology.h
similarity index 97%
rename from target-i386/topology.h
rename to include/hw/i386/topology.h
index 07a6c5f..9c6f3a9 100644
--- a/target-i386/topology.h
+++ b/include/hw/i386/topology.h
@@ -21,8 +21,8 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  * THE SOFTWARE.
  */
-#ifndef TARGET_I386_TOPOLOGY_H
-#define TARGET_I386_TOPOLOGY_H
+#ifndef HW_I386_TOPOLOGY_H
+#define HW_I386_TOPOLOGY_H
 
 /* This file implements the APIC-ID-based CPU topology enumeration logic,
  * documented at the following document:
@@ -131,4 +131,4 @@ static inline apic_id_t x86_apicid_from_cpu_idx(unsigned nr_cores,
     return apicid_from_topo_ids(nr_cores, nr_threads, pkg_id, core_id, smt_id);
 }
 
-#endif /* TARGET_I386_TOPOLOGY_H */
+#endif /* HW_I386_TOPOLOGY_H */
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 3a9b32e..c45c9b1 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -25,7 +25,7 @@
 #include "sysemu/kvm.h"
 #include "sysemu/cpus.h"
 #include "kvm_i386.h"
-#include "topology.h"
+#include "hw/i386/topology.h"
 
 #include "qemu/option.h"
 #include "qemu/config-file.h"
diff --git a/tests/Makefile b/tests/Makefile
index db5b3c3..85ac501 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -235,8 +235,6 @@ $(test-obj-y): QEMU_INCLUDES += -Itests
 QEMU_CFLAGS += -I$(SRC_PATH)/tests
 qom-core-obj = qom/object.o qom/qom-qobject.o qom/container.o
 
-tests/test-x86-cpuid.o: QEMU_INCLUDES += -I$(SRC_PATH)/target-i386
-
 tests/check-qint$(EXESUF): tests/check-qint.o libqemuutil.a
 tests/check-qstring$(EXESUF): tests/check-qstring.o libqemuutil.a
 tests/check-qdict$(EXESUF): tests/check-qdict.o libqemuutil.a
diff --git a/tests/test-x86-cpuid.c b/tests/test-x86-cpuid.c
index 8d9f96a..6cd20d4 100644
--- a/tests/test-x86-cpuid.c
+++ b/tests/test-x86-cpuid.c
@@ -24,7 +24,7 @@
 
 #include <glib.h>
 
-#include "topology.h"
+#include "hw/i386/topology.h"
 
 static void test_topo_bits(void)
 {
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH v2 2/9] target-i386: Rename cpu_x86_init() to cpu_x86_init_user()
  2015-02-03 19:39 [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 1/9] target-i386: Move topology.h to include/hw/i386 Eduardo Habkost
@ 2015-02-03 19:39 ` Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 3/9] target-i386: Eliminate cpu_init() function Eduardo Habkost
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Eduardo Habkost @ 2015-02-03 19:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gu Zheng, Igor Mammedov, Paolo Bonzini

The function is used only for CONFIG_USER, so make its purpose clear.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 target-i386/cpu.c | 2 +-
 target-i386/cpu.h | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index c45c9b1..5e4010c 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2149,7 +2149,7 @@ out:
     return cpu;
 }
 
-X86CPU *cpu_x86_init(const char *cpu_model)
+X86CPU *cpu_x86_init_user(const char *cpu_model)
 {
     Error *error = NULL;
     X86CPU *cpu;
diff --git a/target-i386/cpu.h b/target-i386/cpu.h
index 478450c..41d7f0a 100644
--- a/target-i386/cpu.h
+++ b/target-i386/cpu.h
@@ -982,7 +982,7 @@ typedef struct CPUX86State {
 
 #include "cpu-qom.h"
 
-X86CPU *cpu_x86_init(const char *cpu_model);
+X86CPU *cpu_x86_init_user(const char *cpu_model);
 X86CPU *cpu_x86_create(const char *cpu_model, DeviceState *icc_bridge,
                        Error **errp);
 int cpu_x86_exec(CPUX86State *s);
@@ -1173,7 +1173,7 @@ uint64_t cpu_get_tsc(CPUX86State *env);
 
 static inline CPUX86State *cpu_init(const char *cpu_model)
 {
-    X86CPU *cpu = cpu_x86_init(cpu_model);
+    X86CPU *cpu = cpu_x86_init_user(cpu_model);
     if (cpu == NULL) {
         return NULL;
     }
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH v2 3/9] target-i386: Eliminate cpu_init() function
  2015-02-03 19:39 [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 1/9] target-i386: Move topology.h to include/hw/i386 Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 2/9] target-i386: Rename cpu_x86_init() to cpu_x86_init_user() Eduardo Habkost
@ 2015-02-03 19:39 ` Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 4/9] target-i386: Simplify error handling on cpu_x86_init_user() Eduardo Habkost
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Eduardo Habkost @ 2015-02-03 19:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gu Zheng, Igor Mammedov, Paolo Bonzini

Instead of putting extra logic inside cpu.h, just do everything inside
cpu_x86_init_user().

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 target-i386/cpu.c |  6 +++---
 target-i386/cpu.h | 12 +++---------
 2 files changed, 6 insertions(+), 12 deletions(-)

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 5e4010c..43d958e 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2149,7 +2149,7 @@ out:
     return cpu;
 }
 
-X86CPU *cpu_x86_init_user(const char *cpu_model)
+CPUX86State *cpu_x86_init_user(const char *cpu_model)
 {
     Error *error = NULL;
     X86CPU *cpu;
@@ -2167,10 +2167,10 @@ out:
         error_free(error);
         if (cpu != NULL) {
             object_unref(OBJECT(cpu));
-            cpu = NULL;
         }
+        return NULL;
     }
-    return cpu;
+    return &cpu->env;
 }
 
 static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
diff --git a/target-i386/cpu.h b/target-i386/cpu.h
index 41d7f0a..d5bd74e 100644
--- a/target-i386/cpu.h
+++ b/target-i386/cpu.h
@@ -982,7 +982,6 @@ typedef struct CPUX86State {
 
 #include "cpu-qom.h"
 
-X86CPU *cpu_x86_init_user(const char *cpu_model);
 X86CPU *cpu_x86_create(const char *cpu_model, DeviceState *icc_bridge,
                        Error **errp);
 int cpu_x86_exec(CPUX86State *s);
@@ -1171,14 +1170,9 @@ uint64_t cpu_get_tsc(CPUX86State *env);
 # define PHYS_ADDR_MASK 0xfffffffffLL
 # endif
 
-static inline CPUX86State *cpu_init(const char *cpu_model)
-{
-    X86CPU *cpu = cpu_x86_init_user(cpu_model);
-    if (cpu == NULL) {
-        return NULL;
-    }
-    return &cpu->env;
-}
+/* CPU creation function for *-user */
+CPUX86State *cpu_x86_init_user(const char *cpu_model);
+#define cpu_init cpu_x86_init_user
 
 #define cpu_exec cpu_x86_exec
 #define cpu_gen_code cpu_x86_gen_code
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH v2 4/9] target-i386: Simplify error handling on cpu_x86_init_user()
  2015-02-03 19:39 [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c Eduardo Habkost
                   ` (2 preceding siblings ...)
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 3/9] target-i386: Eliminate cpu_init() function Eduardo Habkost
@ 2015-02-03 19:39 ` Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 5/9] target-i386: Move CPUX86State.cpuid_apic_id to X86CPU.apic_id Eduardo Habkost
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Eduardo Habkost @ 2015-02-03 19:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gu Zheng, Igor Mammedov, Paolo Bonzini

Isolate error handling path from the "if (error)" checks.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 target-i386/cpu.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 43d958e..632a1ba 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2156,21 +2156,23 @@ CPUX86State *cpu_x86_init_user(const char *cpu_model)
 
     cpu = cpu_x86_create(cpu_model, NULL, &error);
     if (error) {
-        goto out;
+        goto error;
     }
 
     object_property_set_bool(OBJECT(cpu), true, "realized", &error);
-
-out:
     if (error) {
-        error_report("%s", error_get_pretty(error));
-        error_free(error);
-        if (cpu != NULL) {
-            object_unref(OBJECT(cpu));
-        }
-        return NULL;
+        goto error;
     }
+
     return &cpu->env;
+
+error:
+    error_report("%s", error_get_pretty(error));
+    error_free(error);
+    if (cpu != NULL) {
+        object_unref(OBJECT(cpu));
+    }
+    return NULL;
 }
 
 static void x86_cpu_cpudef_class_init(ObjectClass *oc, void *data)
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH v2 5/9] target-i386: Move CPUX86State.cpuid_apic_id to X86CPU.apic_id
  2015-02-03 19:39 [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c Eduardo Habkost
                   ` (3 preceding siblings ...)
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 4/9] target-i386: Simplify error handling on cpu_x86_init_user() Eduardo Habkost
@ 2015-02-03 19:39 ` Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 6/9] linux-user: Check for cpu_init() errors Eduardo Habkost
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Eduardo Habkost @ 2015-02-03 19:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gu Zheng, Igor Mammedov, Paolo Bonzini

The field doesn't need to be inside CPUState, and it is not specific for
the CPUID instruction, so move and rename it.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 target-i386/cpu-qom.h |  1 +
 target-i386/cpu.c     | 17 ++++++++---------
 target-i386/cpu.h     |  1 -
 target-i386/kvm.c     |  2 +-
 4 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h
index b557b61..4a6f48a 100644
--- a/target-i386/cpu-qom.h
+++ b/target-i386/cpu-qom.h
@@ -93,6 +93,7 @@ typedef struct X86CPU {
     bool expose_kvm;
     bool migratable;
     bool host_features;
+    uint32_t apic_id;
 
     /* if true the CPUID code directly forward host cache leaves to the guest */
     bool cache_info_passthrough;
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 632a1ba..1f01090 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1690,7 +1690,7 @@ static void x86_cpuid_get_apic_id(Object *obj, Visitor *v, void *opaque,
                                   const char *name, Error **errp)
 {
     X86CPU *cpu = X86_CPU(obj);
-    int64_t value = cpu->env.cpuid_apic_id;
+    int64_t value = cpu->apic_id;
 
     visit_type_int(v, &value, name, errp);
 }
@@ -1723,11 +1723,11 @@ static void x86_cpuid_set_apic_id(Object *obj, Visitor *v, void *opaque,
         return;
     }
 
-    if ((value != cpu->env.cpuid_apic_id) && cpu_exists(value)) {
+    if ((value != cpu->apic_id) && cpu_exists(value)) {
         error_setg(errp, "CPU with APIC ID %" PRIi64 " exists", value);
         return;
     }
-    cpu->env.cpuid_apic_id = value;
+    cpu->apic_id = value;
 }
 
 /* Generic getter for "feature-words" and "filtered-features" properties */
@@ -2275,7 +2275,8 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
         break;
     case 1:
         *eax = env->cpuid_version;
-        *ebx = (env->cpuid_apic_id << 24) | 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
+        *ebx = (cpu->apic_id << 24) |
+               8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
         *ecx = env->features[FEAT_1_ECX];
         *edx = env->features[FEAT_1_EDX];
         if (cs->nr_cores * cs->nr_threads > 1) {
@@ -2724,7 +2725,6 @@ static void mce_init(X86CPU *cpu)
 #ifndef CONFIG_USER_ONLY
 static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
 {
-    CPUX86State *env = &cpu->env;
     DeviceState *dev = DEVICE(cpu);
     APICCommonState *apic;
     const char *apic_type = "apic";
@@ -2743,7 +2743,7 @@ static void x86_cpu_apic_create(X86CPU *cpu, Error **errp)
 
     object_property_add_child(OBJECT(cpu), "apic",
                               OBJECT(cpu->apic_state), NULL);
-    qdev_prop_set_uint8(cpu->apic_state, "id", env->cpuid_apic_id);
+    qdev_prop_set_uint8(cpu->apic_state, "id", cpu->apic_id);
     /* TODO: convert to link<> */
     apic = APIC_COMMON(cpu->apic_state);
     apic->cpu = cpu;
@@ -2926,7 +2926,7 @@ static void x86_cpu_initfn(Object *obj)
                         NULL, NULL, (void *)cpu->filtered_features, NULL);
 
     cpu->hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY;
-    env->cpuid_apic_id = x86_cpu_apic_id_from_index(cs->cpu_index);
+    cpu->apic_id = x86_cpu_apic_id_from_index(cs->cpu_index);
 
     x86_cpu_load_def(cpu, xcc->cpu_def, &error_abort);
 
@@ -2940,9 +2940,8 @@ static void x86_cpu_initfn(Object *obj)
 static int64_t x86_cpu_get_arch_id(CPUState *cs)
 {
     X86CPU *cpu = X86_CPU(cs);
-    CPUX86State *env = &cpu->env;
 
-    return env->cpuid_apic_id;
+    return cpu->apic_id;
 }
 
 static bool x86_cpu_get_paging_enabled(const CPUState *cs)
diff --git a/target-i386/cpu.h b/target-i386/cpu.h
index d5bd74e..f0e6ca4 100644
--- a/target-i386/cpu.h
+++ b/target-i386/cpu.h
@@ -944,7 +944,6 @@ typedef struct CPUX86State {
     uint32_t cpuid_version;
     FeatureWordArray features;
     uint32_t cpuid_model[12];
-    uint32_t cpuid_apic_id;
 
     /* MTRRs */
     uint64_t mtrr_fixed[11];
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 40d6a14..27fe2be 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -430,7 +430,7 @@ static void cpu_update_state(void *opaque, int running, RunState state)
 unsigned long kvm_arch_vcpu_id(CPUState *cs)
 {
     X86CPU *cpu = X86_CPU(cs);
-    return cpu->env.cpuid_apic_id;
+    return cpu->apic_id;
 }
 
 #ifndef KVM_CPUID_SIGNATURE_NEXT
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH v2 6/9] linux-user: Check for cpu_init() errors
  2015-02-03 19:39 [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c Eduardo Habkost
                   ` (4 preceding siblings ...)
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 5/9] target-i386: Move CPUX86State.cpuid_apic_id to X86CPU.apic_id Eduardo Habkost
@ 2015-02-03 19:39 ` Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 7/9] target-i386: Set APIC ID using cpu_index on CONFIG_USER Eduardo Habkost
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Eduardo Habkost @ 2015-02-03 19:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gu Zheng, Igor Mammedov, Riku Voipio, Paolo Bonzini

This was the only caller of cpu_init() that was not checking for NULL
yet.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Cc: Riku Voipio <riku.voipio@iki.fi>
---
 linux-user/main.c | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/linux-user/main.c b/linux-user/main.c
index cfa7d07..d0ecde4 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -3453,10 +3453,17 @@ CPUArchState *cpu_copy(CPUArchState *env)
 {
     CPUState *cpu = ENV_GET_CPU(env);
     CPUArchState *new_env = cpu_init(cpu_model);
-    CPUState *new_cpu = ENV_GET_CPU(new_env);
+    CPUState *new_cpu;
     CPUBreakpoint *bp;
     CPUWatchpoint *wp;
 
+    if (!new_env) {
+        fprintf(stderr, "cpu_copy: Failed to create new CPU\n");
+        exit(1);
+    }
+
+    new_cpu = ENV_GET_CPU(new_env);
+
     /* Reset non arch specific state */
     cpu_reset(new_cpu);
 
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH v2 7/9] target-i386: Set APIC ID using cpu_index on CONFIG_USER
  2015-02-03 19:39 [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c Eduardo Habkost
                   ` (5 preceding siblings ...)
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 6/9] linux-user: Check for cpu_init() errors Eduardo Habkost
@ 2015-02-03 19:39 ` Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 8/9] target-i386: Require APIC ID to be explicitly set before CPU realize Eduardo Habkost
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: Eduardo Habkost @ 2015-02-03 19:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gu Zheng, Igor Mammedov, Paolo Bonzini

The PC CPU initialization code already sets apic-id based on the CPU
topology, and CONFIG_USER doesn't need the topology-based APIC ID
calculation code.

Make CONFIG_USER set apic-id before realizing the CPU (just like PC
already does), so we can simplify x86_cpu_initfn later. As there is no
CPU topology configuration in CONFIG_USER, just use cpu_index as the
APIC ID.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Cc: Gu Zheng <guz.fnst@cn.fujitsu.com>
---
 target-i386/cpu.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 1f01090..f17fd36 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2159,6 +2159,12 @@ CPUX86State *cpu_x86_init_user(const char *cpu_model)
         goto error;
     }
 
+    object_property_set_int(OBJECT(cpu), CPU(cpu)->cpu_index, "apic-id",
+                            &error);
+    if (error) {
+        goto error;
+    }
+
     object_property_set_bool(OBJECT(cpu), true, "realized", &error);
     if (error) {
         goto error;
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH v2 8/9] target-i386: Require APIC ID to be explicitly set before CPU realize
  2015-02-03 19:39 [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c Eduardo Habkost
                   ` (6 preceding siblings ...)
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 7/9] target-i386: Set APIC ID using cpu_index on CONFIG_USER Eduardo Habkost
@ 2015-02-03 19:39 ` Eduardo Habkost
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 9/9] target-i386: Move APIC ID compatibility code to pc.c Eduardo Habkost
  2015-02-04 16:28 ` [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat " Paolo Bonzini
  9 siblings, 0 replies; 11+ messages in thread
From: Eduardo Habkost @ 2015-02-03 19:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gu Zheng, Igor Mammedov, Paolo Bonzini

Instead of setting APIC ID automatically when creating a X86CPU, require
the property to be set before realizing the object (which all callers of
cpu_x86_create() already do).

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Cc: Gu Zheng <guz.fnst@cn.fujitsu.com>
---
 target-i386/cpu-qom.h | 2 +-
 target-i386/cpu.c     | 7 ++++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/target-i386/cpu-qom.h b/target-i386/cpu-qom.h
index 4a6f48a..31a0c1e 100644
--- a/target-i386/cpu-qom.h
+++ b/target-i386/cpu-qom.h
@@ -93,7 +93,7 @@ typedef struct X86CPU {
     bool expose_kvm;
     bool migratable;
     bool host_features;
-    uint32_t apic_id;
+    int64_t apic_id;
 
     /* if true the CPUID code directly forward host cache leaves to the guest */
     bool cache_info_passthrough;
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index f17fd36..029bfff 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -2789,6 +2789,11 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
     Error *local_err = NULL;
     static bool ht_warned;
 
+    if (cpu->apic_id < 0) {
+        error_setg(errp, "apic-id property was not initialized properly");
+        return;
+    }
+
     if (env->features[FEAT_7_0_EBX] && env->cpuid_level < 7) {
         env->cpuid_level = 7;
     }
@@ -2932,7 +2937,7 @@ static void x86_cpu_initfn(Object *obj)
                         NULL, NULL, (void *)cpu->filtered_features, NULL);
 
     cpu->hyperv_spinlock_attempts = HYPERV_SPINLOCK_NEVER_RETRY;
-    cpu->apic_id = x86_cpu_apic_id_from_index(cs->cpu_index);
+    cpu->apic_id = -1;
 
     x86_cpu_load_def(cpu, xcc->cpu_def, &error_abort);
 
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH v2 9/9] target-i386: Move APIC ID compatibility code to pc.c
  2015-02-03 19:39 [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c Eduardo Habkost
                   ` (7 preceding siblings ...)
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 8/9] target-i386: Require APIC ID to be explicitly set before CPU realize Eduardo Habkost
@ 2015-02-03 19:39 ` Eduardo Habkost
  2015-02-04 16:28 ` [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat " Paolo Bonzini
  9 siblings, 0 replies; 11+ messages in thread
From: Eduardo Habkost @ 2015-02-03 19:39 UTC (permalink / raw)
  To: qemu-devel; +Cc: Gu Zheng, Igor Mammedov, Paolo Bonzini

The APIC ID compatibility code is required only for PC, and now that
x86_cpu_initfn() doesn't use x86_cpu_apic_id_from_index() anymore, that
code can be moved to pc.c.

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 hw/i386/pc.c      | 35 +++++++++++++++++++++++++++++++++++
 target-i386/cpu.c | 34 ----------------------------------
 2 files changed, 35 insertions(+), 34 deletions(-)

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index c7af6aa..2519297 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -25,6 +25,8 @@
 #include "hw/i386/pc.h"
 #include "hw/char/serial.h"
 #include "hw/i386/apic.h"
+#include "hw/i386/topology.h"
+#include "sysemu/cpus.h"
 #include "hw/block/fdc.h"
 #include "hw/ide.h"
 #include "hw/pci/pci.h"
@@ -628,6 +630,39 @@ bool e820_get_entry(int idx, uint32_t type, uint64_t *address, uint64_t *length)
     return false;
 }
 
+/* Enables contiguous-apic-ID mode, for compatibility */
+static bool compat_apic_id_mode;
+
+void enable_compat_apic_id_mode(void)
+{
+    compat_apic_id_mode = true;
+}
+
+/* Calculates initial APIC ID for a specific CPU index
+ *
+ * Currently we need to be able to calculate the APIC ID from the CPU index
+ * alone (without requiring a CPU object), as the QEMU<->Seabios interfaces have
+ * no concept of "CPU index", and the NUMA tables on fw_cfg need the APIC ID of
+ * all CPUs up to max_cpus.
+ */
+uint32_t x86_cpu_apic_id_from_index(unsigned int cpu_index)
+{
+    uint32_t correct_id;
+    static bool warned;
+
+    correct_id = x86_apicid_from_cpu_idx(smp_cores, smp_threads, cpu_index);
+    if (compat_apic_id_mode) {
+        if (cpu_index != correct_id && !warned) {
+            error_report("APIC IDs set in compatibility mode, "
+                         "CPU topology won't match the configuration");
+            warned = true;
+        }
+        return cpu_index;
+    } else {
+        return correct_id;
+    }
+}
+
 /* Calculates the limit to CPU APIC ID values
  *
  * This function returns the limit for the APIC ID value, so that all
diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 029bfff..a5cf347 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -25,7 +25,6 @@
 #include "sysemu/kvm.h"
 #include "sysemu/cpus.h"
 #include "kvm_i386.h"
-#include "hw/i386/topology.h"
 
 #include "qemu/option.h"
 #include "qemu/config-file.h"
@@ -2858,39 +2857,6 @@ out:
     }
 }
 
-/* Enables contiguous-apic-ID mode, for compatibility */
-static bool compat_apic_id_mode;
-
-void enable_compat_apic_id_mode(void)
-{
-    compat_apic_id_mode = true;
-}
-
-/* Calculates initial APIC ID for a specific CPU index
- *
- * Currently we need to be able to calculate the APIC ID from the CPU index
- * alone (without requiring a CPU object), as the QEMU<->Seabios interfaces have
- * no concept of "CPU index", and the NUMA tables on fw_cfg need the APIC ID of
- * all CPUs up to max_cpus.
- */
-uint32_t x86_cpu_apic_id_from_index(unsigned int cpu_index)
-{
-    uint32_t correct_id;
-    static bool warned;
-
-    correct_id = x86_apicid_from_cpu_idx(smp_cores, smp_threads, cpu_index);
-    if (compat_apic_id_mode) {
-        if (cpu_index != correct_id && !warned) {
-            error_report("APIC IDs set in compatibility mode, "
-                         "CPU topology won't match the configuration");
-            warned = true;
-        }
-        return cpu_index;
-    } else {
-        return correct_id;
-    }
-}
-
 static void x86_cpu_initfn(Object *obj)
 {
     CPUState *cs = CPU(obj);
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c
  2015-02-03 19:39 [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c Eduardo Habkost
                   ` (8 preceding siblings ...)
  2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 9/9] target-i386: Move APIC ID compatibility code to pc.c Eduardo Habkost
@ 2015-02-04 16:28 ` Paolo Bonzini
  9 siblings, 0 replies; 11+ messages in thread
From: Paolo Bonzini @ 2015-02-04 16:28 UTC (permalink / raw)
  To: Eduardo Habkost, qemu-devel; +Cc: Gu Zheng, Igor Mammedov



On 03/02/2015 20:39, Eduardo Habkost wrote:
> This series removes the APIC ID initialization code from x86_cpu_initfn()
> (getting us one step closer to making object_new() of X86CPU have no dependency
> on cpu_exec_init() and other global QEMU state), and moves the APIC ID
> compatibility logic from target-i386/cpu.c to hw/i386/pc.c.
> 
> Changes v1 -> v2:
>  * Move topology.h to include/hw/i386 instead of hw/i386
>  * Instead of adding an apic_id_set field, make apic_id a int64_t field
>    and set it to -1 by default
>  * Check for cpu_init() errors on linux-user
> 
> Eduardo Habkost (9):
>   target-i386: Move topology.h to include/hw/i386
>   target-i386: Rename cpu_x86_init() to cpu_x86_init_user()
>   target-i386: Eliminate cpu_init() function
>   target-i386: Simplify error handling on cpu_x86_init_user()
>   target-i386: Move CPUX86State.cpuid_apic_id to X86CPU.apic_id
>   linux-user: Check for cpu_init() errors
>   target-i386: Set APIC ID using cpu_index on CONFIG_USER
>   target-i386: Require APIC ID to be explicitly set before CPU realize
>   target-i386: Move APIC ID compatibility code to pc.c
> 
>  hw/i386/pc.c                                | 35 ++++++++++++
>  {target-i386 => include/hw/i386}/topology.h |  6 +-
>  linux-user/main.c                           |  9 ++-
>  target-i386/cpu-qom.h                       |  1 +
>  target-i386/cpu.c                           | 86 +++++++++++------------------
>  target-i386/cpu.h                           | 13 +----
>  target-i386/kvm.c                           |  2 +-
>  tests/Makefile                              |  2 -
>  tests/test-x86-cpuid.c                      |  2 +-
>  9 files changed, 84 insertions(+), 72 deletions(-)
>  rename {target-i386 => include/hw/i386}/topology.h (97%)
> 

Nice...

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2015-02-04 16:28 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-03 19:39 [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat code to pc.c Eduardo Habkost
2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 1/9] target-i386: Move topology.h to include/hw/i386 Eduardo Habkost
2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 2/9] target-i386: Rename cpu_x86_init() to cpu_x86_init_user() Eduardo Habkost
2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 3/9] target-i386: Eliminate cpu_init() function Eduardo Habkost
2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 4/9] target-i386: Simplify error handling on cpu_x86_init_user() Eduardo Habkost
2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 5/9] target-i386: Move CPUX86State.cpuid_apic_id to X86CPU.apic_id Eduardo Habkost
2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 6/9] linux-user: Check for cpu_init() errors Eduardo Habkost
2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 7/9] target-i386: Set APIC ID using cpu_index on CONFIG_USER Eduardo Habkost
2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 8/9] target-i386: Require APIC ID to be explicitly set before CPU realize Eduardo Habkost
2015-02-03 19:39 ` [Qemu-devel] [PATCH v2 9/9] target-i386: Move APIC ID compatibility code to pc.c Eduardo Habkost
2015-02-04 16:28 ` [Qemu-devel] [PATCH v2 0/9] target-i386: Simplify APIC ID initialization, move compat " Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).