mirror of
https://github.com/qemu/qemu.git
synced 2024-11-25 11:53:39 +08:00
X86 queue 2015-06-02
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJVbgItAAoJECgHk2+YTcWmGhYP/RMNvcoOQzfRZ1xqztQlm2cp WRSnsQm2+16omGypuEGTgjr/pojlD/xRllhFMJqYPGt0ZSmwsd6AgZtU5hLnHGRb HJdq1js7GPsduR8/DPoBCAD6nA8wsrdjBt5WZkCf35WU4CaPFDTx1w35KdekdzVS 0guhSypAQdrxIULvPteJw/S6u6OA42nads2xClfvmzE3kKnedeBcLLE/GzrrkIc3 5aFjS1ndVK9rtOBldnIqq10q89c7ug60wuZi0SFqf1r4Do9cZqQgmXU7c0OiJu1G 05F0racvGaCMNp1JyH6z5pvPVjImZfu06Wz0+433hKSHvNqh25mJ4lZVGcqfHFoB Ek2+iam6xej1+I2Wbt3NOBR8K0ldDMtnVpUiXMUvT2j4AUQBc2Cs79rXBgY8Qz3P 48fI2xMlOY0TFIQTra38ZomX4Jkukhu38BRixed2/CGi1mo6N9GT5OCYBBsy2MgW o4yFmnzJD8eCopWXFXc93Pvdvrpn5/NJsmiNDFO66lxfQr+VfqzlG6eWpxQ7wXpR /JY8k21R0gHB02v7B2Kyqdj9UXmunYWS28P6LJ/z5UtCCivr/+szUTdKDOvKXt42 HrVGgpEscs0huvsUPzJRtCYYsgKIEZB7UTxOxHiAPmBOBBnB/pLiOrkoZuQIiQee KxjJWNd9wMOyx90t54AI =VKFL -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/ehabkost/tags/x86-pull-request' into staging X86 queue 2015-06-02 # gpg: Signature made Tue Jun 2 20:21:17 2015 BST using RSA key ID 984DC5A6 # gpg: Good signature from "Eduardo Habkost <ehabkost@redhat.com>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 5A32 2FD5 ABC4 D3DB ACCF D1AA 2807 936F 984D C5A6 * remotes/ehabkost/tags/x86-pull-request: arch_init: Drop target-x86_64.conf target-i386: Register QOM properties for feature flags apic: convert ->busdev.qdev casts to C casts target-i386: Fix signedness of MSR_IA32_APICBASE_BASE pc: Ensure non-zero CPU ref count after attaching to ICC bus Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
6fa6b31276
7
Makefile
7
Makefile
@ -389,13 +389,8 @@ ifneq (,$(findstring qemu-ga,$(TOOLS)))
|
||||
endif
|
||||
endif
|
||||
|
||||
install-confdir:
|
||||
$(INSTALL_DIR) "$(DESTDIR)$(qemu_confdir)"
|
||||
|
||||
install-sysconfig: install-datadir install-confdir
|
||||
$(INSTALL_DATA) $(SRC_PATH)/sysconfigs/target/target-x86_64.conf "$(DESTDIR)$(qemu_confdir)"
|
||||
|
||||
install: all $(if $(BUILD_DOCS),install-doc) install-sysconfig \
|
||||
install: all $(if $(BUILD_DOCS),install-doc) \
|
||||
install-datadir install-localstatedir
|
||||
ifneq ($(TOOLS),)
|
||||
$(call install-prog,$(TOOLS),$(DESTDIR)$(bindir))
|
||||
|
@ -136,7 +136,6 @@ static struct defconfig_file {
|
||||
bool userconfig;
|
||||
} default_config_files[] = {
|
||||
{ CONFIG_QEMU_CONFDIR "/qemu.conf", true },
|
||||
{ CONFIG_QEMU_CONFDIR "/target-" TARGET_NAME ".conf", true },
|
||||
{ NULL }, /* end of list */
|
||||
};
|
||||
|
||||
|
11
hw/i386/pc.c
11
hw/i386/pc.c
@ -1006,7 +1006,6 @@ static X86CPU *pc_new_cpu(const char *cpu_model, int64_t apic_id,
|
||||
}
|
||||
|
||||
qdev_set_parent_bus(DEVICE(cpu), qdev_get_child_bus(icc_bridge, "icc"));
|
||||
object_unref(OBJECT(cpu));
|
||||
|
||||
object_property_set_int(OBJECT(cpu), apic_id, "apic-id", &local_err);
|
||||
object_property_set_bool(OBJECT(cpu), true, "realized", &local_err);
|
||||
@ -1025,7 +1024,9 @@ static const char *current_cpu_model;
|
||||
void pc_hot_add_cpu(const int64_t id, Error **errp)
|
||||
{
|
||||
DeviceState *icc_bridge;
|
||||
X86CPU *cpu;
|
||||
int64_t apic_id = x86_cpu_apic_id_from_index(id);
|
||||
Error *local_err = NULL;
|
||||
|
||||
if (id < 0) {
|
||||
error_setg(errp, "Invalid CPU id: %" PRIi64, id);
|
||||
@ -1053,7 +1054,12 @@ void pc_hot_add_cpu(const int64_t id, Error **errp)
|
||||
|
||||
icc_bridge = DEVICE(object_resolve_path_type("icc-bridge",
|
||||
TYPE_ICC_BRIDGE, NULL));
|
||||
pc_new_cpu(current_cpu_model, apic_id, icc_bridge, errp);
|
||||
cpu = pc_new_cpu(current_cpu_model, apic_id, icc_bridge, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
object_unref(OBJECT(cpu));
|
||||
}
|
||||
|
||||
void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge)
|
||||
@ -1087,6 +1093,7 @@ void pc_cpus_init(const char *cpu_model, DeviceState *icc_bridge)
|
||||
error_report_err(error);
|
||||
exit(1);
|
||||
}
|
||||
object_unref(OBJECT(cpu));
|
||||
}
|
||||
|
||||
/* map APIC MMIO area if CPU has APIC */
|
||||
|
@ -370,13 +370,14 @@ static int apic_irq_pending(APICCommonState *s)
|
||||
static void apic_update_irq(APICCommonState *s)
|
||||
{
|
||||
CPUState *cpu;
|
||||
DeviceState *dev = (DeviceState *)s;
|
||||
|
||||
cpu = CPU(s->cpu);
|
||||
if (!qemu_cpu_is_self(cpu)) {
|
||||
cpu_interrupt(cpu, CPU_INTERRUPT_POLL);
|
||||
} else if (apic_irq_pending(s) > 0) {
|
||||
cpu_interrupt(cpu, CPU_INTERRUPT_HARD);
|
||||
} else if (!apic_accept_pic_intr(&s->busdev.qdev) || !pic_get_output(isa_pic)) {
|
||||
} else if (!apic_accept_pic_intr(dev) || !pic_get_output(isa_pic)) {
|
||||
cpu_reset_interrupt(cpu, CPU_INTERRUPT_HARD);
|
||||
}
|
||||
}
|
||||
@ -549,10 +550,12 @@ static void apic_deliver(DeviceState *dev, uint8_t dest, uint8_t dest_mode,
|
||||
|
||||
static bool apic_check_pic(APICCommonState *s)
|
||||
{
|
||||
if (!apic_accept_pic_intr(&s->busdev.qdev) || !pic_get_output(isa_pic)) {
|
||||
DeviceState *dev = (DeviceState *)s;
|
||||
|
||||
if (!apic_accept_pic_intr(dev) || !pic_get_output(isa_pic)) {
|
||||
return false;
|
||||
}
|
||||
apic_deliver_pic_intr(&s->busdev.qdev, 1);
|
||||
apic_deliver_pic_intr(dev, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2841,12 +2841,126 @@ out:
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct BitProperty {
|
||||
uint32_t *ptr;
|
||||
uint32_t mask;
|
||||
} BitProperty;
|
||||
|
||||
static void x86_cpu_get_bit_prop(Object *obj,
|
||||
struct Visitor *v,
|
||||
void *opaque,
|
||||
const char *name,
|
||||
Error **errp)
|
||||
{
|
||||
BitProperty *fp = opaque;
|
||||
bool value = (*fp->ptr & fp->mask) == fp->mask;
|
||||
visit_type_bool(v, &value, name, errp);
|
||||
}
|
||||
|
||||
static void x86_cpu_set_bit_prop(Object *obj,
|
||||
struct Visitor *v,
|
||||
void *opaque,
|
||||
const char *name,
|
||||
Error **errp)
|
||||
{
|
||||
DeviceState *dev = DEVICE(obj);
|
||||
BitProperty *fp = opaque;
|
||||
Error *local_err = NULL;
|
||||
bool value;
|
||||
|
||||
if (dev->realized) {
|
||||
qdev_prop_set_after_realize(dev, name, errp);
|
||||
return;
|
||||
}
|
||||
|
||||
visit_type_bool(v, &value, name, &local_err);
|
||||
if (local_err) {
|
||||
error_propagate(errp, local_err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value) {
|
||||
*fp->ptr |= fp->mask;
|
||||
} else {
|
||||
*fp->ptr &= ~fp->mask;
|
||||
}
|
||||
}
|
||||
|
||||
static void x86_cpu_release_bit_prop(Object *obj, const char *name,
|
||||
void *opaque)
|
||||
{
|
||||
BitProperty *prop = opaque;
|
||||
g_free(prop);
|
||||
}
|
||||
|
||||
/* Register a boolean property to get/set a single bit in a uint32_t field.
|
||||
*
|
||||
* The same property name can be registered multiple times to make it affect
|
||||
* multiple bits in the same FeatureWord. In that case, the getter will return
|
||||
* true only if all bits are set.
|
||||
*/
|
||||
static void x86_cpu_register_bit_prop(X86CPU *cpu,
|
||||
const char *prop_name,
|
||||
uint32_t *field,
|
||||
int bitnr)
|
||||
{
|
||||
BitProperty *fp;
|
||||
ObjectProperty *op;
|
||||
uint32_t mask = (1UL << bitnr);
|
||||
|
||||
op = object_property_find(OBJECT(cpu), prop_name, NULL);
|
||||
if (op) {
|
||||
fp = op->opaque;
|
||||
assert(fp->ptr == field);
|
||||
fp->mask |= mask;
|
||||
} else {
|
||||
fp = g_new0(BitProperty, 1);
|
||||
fp->ptr = field;
|
||||
fp->mask = mask;
|
||||
object_property_add(OBJECT(cpu), prop_name, "bool",
|
||||
x86_cpu_get_bit_prop,
|
||||
x86_cpu_set_bit_prop,
|
||||
x86_cpu_release_bit_prop, fp, &error_abort);
|
||||
}
|
||||
}
|
||||
|
||||
static void x86_cpu_register_feature_bit_props(X86CPU *cpu,
|
||||
FeatureWord w,
|
||||
int bitnr)
|
||||
{
|
||||
Object *obj = OBJECT(cpu);
|
||||
int i;
|
||||
char **names;
|
||||
FeatureWordInfo *fi = &feature_word_info[w];
|
||||
|
||||
if (!fi->feat_names) {
|
||||
return;
|
||||
}
|
||||
if (!fi->feat_names[bitnr]) {
|
||||
return;
|
||||
}
|
||||
|
||||
names = g_strsplit(fi->feat_names[bitnr], "|", 0);
|
||||
|
||||
feat2prop(names[0]);
|
||||
x86_cpu_register_bit_prop(cpu, names[0], &cpu->env.features[w], bitnr);
|
||||
|
||||
for (i = 1; names[i]; i++) {
|
||||
feat2prop(names[i]);
|
||||
object_property_add_alias(obj, names[i], obj, g_strdup(names[0]),
|
||||
&error_abort);
|
||||
}
|
||||
|
||||
g_strfreev(names);
|
||||
}
|
||||
|
||||
static void x86_cpu_initfn(Object *obj)
|
||||
{
|
||||
CPUState *cs = CPU(obj);
|
||||
X86CPU *cpu = X86_CPU(obj);
|
||||
X86CPUClass *xcc = X86_CPU_GET_CLASS(obj);
|
||||
CPUX86State *env = &cpu->env;
|
||||
FeatureWord w;
|
||||
static int inited;
|
||||
|
||||
cs->env_ptr = env;
|
||||
@ -2887,6 +3001,14 @@ static void x86_cpu_initfn(Object *obj)
|
||||
cpu->apic_id = -1;
|
||||
#endif
|
||||
|
||||
for (w = 0; w < FEATURE_WORDS; w++) {
|
||||
int bitnr;
|
||||
|
||||
for (bitnr = 0; bitnr < 32; bitnr++) {
|
||||
x86_cpu_register_feature_bit_props(cpu, w, bitnr);
|
||||
}
|
||||
}
|
||||
|
||||
x86_cpu_load_def(cpu, xcc->cpu_def, &error_abort);
|
||||
|
||||
/* init various static tables used in TCG mode */
|
||||
|
@ -305,7 +305,7 @@
|
||||
#define MSR_IA32_APICBASE 0x1b
|
||||
#define MSR_IA32_APICBASE_BSP (1<<8)
|
||||
#define MSR_IA32_APICBASE_ENABLE (1<<11)
|
||||
#define MSR_IA32_APICBASE_BASE (0xfffff<<12)
|
||||
#define MSR_IA32_APICBASE_BASE (0xfffffU<<12)
|
||||
#define MSR_IA32_FEATURE_CONTROL 0x0000003a
|
||||
#define MSR_TSC_ADJUST 0x0000003b
|
||||
#define MSR_IA32_TSCDEADLINE 0x6e0
|
||||
|
Loading…
Reference in New Issue
Block a user