* [PATCH kvm-unit-tests 0/3] Fix apic.flat
@ 2011-09-06 14:11 Avi Kivity
2011-09-06 14:11 ` [PATCH kvm-unit-tests 1/3] x86/desc: switch to using boot_idt Avi Kivity
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Avi Kivity @ 2011-09-06 14:11 UTC (permalink / raw)
To: Marcelo Tosatti, Lucas Meneghel Rodrigues; +Cc: kvm
apic.flat is failing due to an IPI hitting an uninitialized IDT entry.
This patchset fixes the issue.
Avi Kivity (3):
x86/desc: switch to using boot_idt
x86/desc: allow multiple initializations
x86/smp: use desc.c for setting up IPI handler
lib/x86/desc.c | 23 +++++++++--------------
lib/x86/smp.c | 23 ++---------------------
2 files changed, 11 insertions(+), 35 deletions(-)
--
1.7.6.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH kvm-unit-tests 1/3] x86/desc: switch to using boot_idt
2011-09-06 14:11 [PATCH kvm-unit-tests 0/3] Fix apic.flat Avi Kivity
@ 2011-09-06 14:11 ` Avi Kivity
2011-09-06 14:11 ` [PATCH kvm-unit-tests 2/3] x86/desc: allow multiple initializations Avi Kivity
2011-09-06 14:11 ` [PATCH kvm-unit-tests 3/3] x86/smp: use desc.c for setting up IPI handler Avi Kivity
2 siblings, 0 replies; 4+ messages in thread
From: Avi Kivity @ 2011-09-06 14:11 UTC (permalink / raw)
To: Marcelo Tosatti, Lucas Meneghel Rodrigues; +Cc: kvm
boot_idt is set up an all cpus by the startup code, unlike
the idt local to desc.c.
Signed-off-by: Avi Kivity <avi@redhat.com>
---
lib/x86/desc.c | 17 +++--------------
1 files changed, 3 insertions(+), 14 deletions(-)
diff --git a/lib/x86/desc.c b/lib/x86/desc.c
index 11bd2a2..0ed8c22 100644
--- a/lib/x86/desc.c
+++ b/lib/x86/desc.c
@@ -62,21 +62,11 @@ typedef struct {
u16 iomap_base;
} tss32_t;
-static idt_entry_t idt[256] __attribute__((aligned(4096)));
-
-void load_lidt(idt_entry_t *idt, int nentries)
-{
- struct descriptor_table_ptr dt;
-
- dt.limit = nentries * sizeof(*idt) - 1;
- dt.base = (unsigned long)idt;
- lidt(&dt);
- asm volatile ("lidt %0" : : "m"(dt));
-}
+extern idt_entry_t boot_idt[256];
void set_idt_entry(int vec, void *addr, int dpl)
{
- idt_entry_t *e = &idt[vec];
+ idt_entry_t *e = &boot_idt[vec];
memset(e, 0, sizeof *e);
e->offset0 = (unsigned long)addr;
e->selector = read_cs();
@@ -92,7 +82,7 @@ void set_idt_entry(int vec, void *addr, int dpl)
void set_idt_sel(int vec, u16 sel)
{
- idt_entry_t *e = &idt[vec];
+ idt_entry_t *e = &boot_idt[vec];
e->selector = sel;
}
@@ -239,7 +229,6 @@ static void *idt_handlers[32] = {
void setup_idt(void)
{
int i;
- load_lidt(idt, 256);
for (i = 0; i < 32; i++)
if (idt_handlers[i])
set_idt_entry(i, idt_handlers[i], 0);
--
1.7.6.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH kvm-unit-tests 2/3] x86/desc: allow multiple initializations
2011-09-06 14:11 [PATCH kvm-unit-tests 0/3] Fix apic.flat Avi Kivity
2011-09-06 14:11 ` [PATCH kvm-unit-tests 1/3] x86/desc: switch to using boot_idt Avi Kivity
@ 2011-09-06 14:11 ` Avi Kivity
2011-09-06 14:11 ` [PATCH kvm-unit-tests 3/3] x86/smp: use desc.c for setting up IPI handler Avi Kivity
2 siblings, 0 replies; 4+ messages in thread
From: Avi Kivity @ 2011-09-06 14:11 UTC (permalink / raw)
To: Marcelo Tosatti, Lucas Meneghel Rodrigues; +Cc: kvm
There are multiple callers, so be forgiving.
Signed-off-by: Avi Kivity <avi@redhat.com>
---
lib/x86/desc.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/lib/x86/desc.c b/lib/x86/desc.c
index 0ed8c22..c268955 100644
--- a/lib/x86/desc.c
+++ b/lib/x86/desc.c
@@ -229,6 +229,12 @@ static void *idt_handlers[32] = {
void setup_idt(void)
{
int i;
+ static bool idt_initialized = false;
+
+ if (idt_initialized) {
+ return;
+ }
+ idt_initialized = true;
for (i = 0; i < 32; i++)
if (idt_handlers[i])
set_idt_entry(i, idt_handlers[i], 0);
--
1.7.6.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH kvm-unit-tests 3/3] x86/smp: use desc.c for setting up IPI handler
2011-09-06 14:11 [PATCH kvm-unit-tests 0/3] Fix apic.flat Avi Kivity
2011-09-06 14:11 ` [PATCH kvm-unit-tests 1/3] x86/desc: switch to using boot_idt Avi Kivity
2011-09-06 14:11 ` [PATCH kvm-unit-tests 2/3] x86/desc: allow multiple initializations Avi Kivity
@ 2011-09-06 14:11 ` Avi Kivity
2 siblings, 0 replies; 4+ messages in thread
From: Avi Kivity @ 2011-09-06 14:11 UTC (permalink / raw)
To: Marcelo Tosatti, Lucas Meneghel Rodrigues; +Cc: kvm
This allows other callers to use desc.c without conflict. Fixes
apic.flat failure with -smp 2.
Signed-off-by: Avi Kivity <avi@redhat.com>
---
lib/x86/smp.c | 23 ++---------------------
1 files changed, 2 insertions(+), 21 deletions(-)
diff --git a/lib/x86/smp.c b/lib/x86/smp.c
index 0d8bae8..d4c8106 100644
--- a/lib/x86/smp.c
+++ b/lib/x86/smp.c
@@ -42,26 +42,6 @@ asm (
#endif
);
-
-static void set_ipi_descriptor(void (*ipi_entry)(void))
-{
- unsigned short *desc = (void *)(IPI_VECTOR * sizeof(long) * 2);
- unsigned short cs;
- unsigned long ipi = (unsigned long)ipi_entry;
-
- asm ("mov %%cs, %0" : "=r"(cs));
- desc[0] = ipi;
- desc[1] = cs;
- desc[2] = 0x8e00;
- desc[3] = ipi >> 16;
-#ifdef __x86_64__
- desc[4] = ipi >> 32;
- desc[5] = ipi >> 48;
- desc[6] = 0;
- desc[7] = 0;
-#endif
-}
-
void spin_lock(struct spinlock *lock)
{
int v = 1;
@@ -134,7 +114,8 @@ void smp_init(void)
_cpu_count = fwcfg_get_nb_cpus();
- set_ipi_descriptor(ipi_entry);
+ setup_idt();
+ set_idt_entry(IPI_VECTOR, ipi_entry, 0);
setup_smp_id(0);
for (i = 1; i < cpu_count(); ++i)
--
1.7.6.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-09-06 14:11 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-06 14:11 [PATCH kvm-unit-tests 0/3] Fix apic.flat Avi Kivity
2011-09-06 14:11 ` [PATCH kvm-unit-tests 1/3] x86/desc: switch to using boot_idt Avi Kivity
2011-09-06 14:11 ` [PATCH kvm-unit-tests 2/3] x86/desc: allow multiple initializations Avi Kivity
2011-09-06 14:11 ` [PATCH kvm-unit-tests 3/3] x86/smp: use desc.c for setting up IPI handler Avi Kivity
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox