diff options
author | Glauber de Oliveira Costa <gcosta@redhat.com> | 2008-01-17 16:14:46 -0500 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2008-01-30 06:50:17 -0500 |
commit | ae3749dcd8c31dcfbab14ea28c68a944c93f418f (patch) | |
tree | bdbbe9207bb7c50e9aeb7afc5b5653b79501c03f /drivers | |
parent | f34f8c5fea079065671163c37d98328cff31980b (diff) |
lguest: move changed bitmap to lg_cpu
events represented in the 'changed' bitmap are per-cpu, not per-guest.
move it to the lg_cpu structure
Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/lguest/interrupts_and_traps.c | 2 | ||||
-rw-r--r-- | drivers/lguest/lg.h | 6 | ||||
-rw-r--r-- | drivers/lguest/segments.c | 4 | ||||
-rw-r--r-- | drivers/lguest/x86/core.c | 11 |
4 files changed, 11 insertions, 12 deletions
diff --git a/drivers/lguest/interrupts_and_traps.c b/drivers/lguest/interrupts_and_traps.c index 6bbfce4e5987..9ac7455ec7fb 100644 --- a/drivers/lguest/interrupts_and_traps.c +++ b/drivers/lguest/interrupts_and_traps.c | |||
@@ -395,7 +395,7 @@ void load_guest_idt_entry(struct lg_cpu *cpu, unsigned int num, u32 lo, u32 hi) | |||
395 | 395 | ||
396 | /* Mark the IDT as changed: next time the Guest runs we'll know we have | 396 | /* Mark the IDT as changed: next time the Guest runs we'll know we have |
397 | * to copy this again. */ | 397 | * to copy this again. */ |
398 | cpu->lg->changed |= CHANGED_IDT; | 398 | cpu->changed |= CHANGED_IDT; |
399 | 399 | ||
400 | /* Check that the Guest doesn't try to step outside the bounds. */ | 400 | /* Check that the Guest doesn't try to step outside the bounds. */ |
401 | if (num >= ARRAY_SIZE(cpu->arch.idt)) | 401 | if (num >= ARRAY_SIZE(cpu->arch.idt)) |
diff --git a/drivers/lguest/lg.h b/drivers/lguest/lg.h index f1c4c33e4153..0d6f6435d72c 100644 --- a/drivers/lguest/lg.h +++ b/drivers/lguest/lg.h | |||
@@ -51,6 +51,9 @@ struct lg_cpu { | |||
51 | u32 esp1; | 51 | u32 esp1; |
52 | u8 ss1; | 52 | u8 ss1; |
53 | 53 | ||
54 | /* Bitmap of what has changed: see CHANGED_* above. */ | ||
55 | int changed; | ||
56 | |||
54 | unsigned long pending_notify; /* pfn from LHCALL_NOTIFY */ | 57 | unsigned long pending_notify; /* pfn from LHCALL_NOTIFY */ |
55 | 58 | ||
56 | /* At end of a page shared mapped over lguest_pages in guest. */ | 59 | /* At end of a page shared mapped over lguest_pages in guest. */ |
@@ -92,9 +95,6 @@ struct lguest | |||
92 | void __user *mem_base; | 95 | void __user *mem_base; |
93 | unsigned long kernel_address; | 96 | unsigned long kernel_address; |
94 | 97 | ||
95 | /* Bitmap of what has changed: see CHANGED_* above. */ | ||
96 | int changed; | ||
97 | |||
98 | struct pgdir pgdirs[4]; | 98 | struct pgdir pgdirs[4]; |
99 | 99 | ||
100 | unsigned long noirq_start, noirq_end; | 100 | unsigned long noirq_start, noirq_end; |
diff --git a/drivers/lguest/segments.c b/drivers/lguest/segments.c index 02138450ecf5..635f54c719ae 100644 --- a/drivers/lguest/segments.c +++ b/drivers/lguest/segments.c | |||
@@ -159,7 +159,7 @@ void load_guest_gdt(struct lg_cpu *cpu, unsigned long table, u32 num) | |||
159 | fixup_gdt_table(cpu, 0, ARRAY_SIZE(cpu->arch.gdt)); | 159 | fixup_gdt_table(cpu, 0, ARRAY_SIZE(cpu->arch.gdt)); |
160 | /* Mark that the GDT changed so the core knows it has to copy it again, | 160 | /* Mark that the GDT changed so the core knows it has to copy it again, |
161 | * even if the Guest is run on the same CPU. */ | 161 | * even if the Guest is run on the same CPU. */ |
162 | lg->changed |= CHANGED_GDT; | 162 | cpu->changed |= CHANGED_GDT; |
163 | } | 163 | } |
164 | 164 | ||
165 | /* This is the fast-track version for just changing the three TLS entries. | 165 | /* This is the fast-track version for just changing the three TLS entries. |
@@ -174,7 +174,7 @@ void guest_load_tls(struct lg_cpu *cpu, unsigned long gtls) | |||
174 | __lgread(lg, tls, gtls, sizeof(*tls)*GDT_ENTRY_TLS_ENTRIES); | 174 | __lgread(lg, tls, gtls, sizeof(*tls)*GDT_ENTRY_TLS_ENTRIES); |
175 | fixup_gdt_table(cpu, GDT_ENTRY_TLS_MIN, GDT_ENTRY_TLS_MAX+1); | 175 | fixup_gdt_table(cpu, GDT_ENTRY_TLS_MIN, GDT_ENTRY_TLS_MAX+1); |
176 | /* Note that just the TLS entries have changed. */ | 176 | /* Note that just the TLS entries have changed. */ |
177 | lg->changed |= CHANGED_GDT_TLS; | 177 | cpu->changed |= CHANGED_GDT_TLS; |
178 | } | 178 | } |
179 | /*:*/ | 179 | /*:*/ |
180 | 180 | ||
diff --git a/drivers/lguest/x86/core.c b/drivers/lguest/x86/core.c index f8dfdc9a3e5b..fd6a8512443c 100644 --- a/drivers/lguest/x86/core.c +++ b/drivers/lguest/x86/core.c | |||
@@ -75,7 +75,6 @@ static DEFINE_PER_CPU(struct lg_cpu *, last_cpu); | |||
75 | */ | 75 | */ |
76 | static void copy_in_guest_info(struct lg_cpu *cpu, struct lguest_pages *pages) | 76 | static void copy_in_guest_info(struct lg_cpu *cpu, struct lguest_pages *pages) |
77 | { | 77 | { |
78 | struct lguest *lg = cpu->lg; | ||
79 | /* Copying all this data can be quite expensive. We usually run the | 78 | /* Copying all this data can be quite expensive. We usually run the |
80 | * same Guest we ran last time (and that Guest hasn't run anywhere else | 79 | * same Guest we ran last time (and that Guest hasn't run anywhere else |
81 | * meanwhile). If that's not the case, we pretend everything in the | 80 | * meanwhile). If that's not the case, we pretend everything in the |
@@ -83,7 +82,7 @@ static void copy_in_guest_info(struct lg_cpu *cpu, struct lguest_pages *pages) | |||
83 | if (__get_cpu_var(last_cpu) != cpu || cpu->last_pages != pages) { | 82 | if (__get_cpu_var(last_cpu) != cpu || cpu->last_pages != pages) { |
84 | __get_cpu_var(last_cpu) = cpu; | 83 | __get_cpu_var(last_cpu) = cpu; |
85 | cpu->last_pages = pages; | 84 | cpu->last_pages = pages; |
86 | lg->changed = CHANGED_ALL; | 85 | cpu->changed = CHANGED_ALL; |
87 | } | 86 | } |
88 | 87 | ||
89 | /* These copies are pretty cheap, so we do them unconditionally: */ | 88 | /* These copies are pretty cheap, so we do them unconditionally: */ |
@@ -99,18 +98,18 @@ static void copy_in_guest_info(struct lg_cpu *cpu, struct lguest_pages *pages) | |||
99 | pages->state.guest_tss.ss1 = cpu->ss1; | 98 | pages->state.guest_tss.ss1 = cpu->ss1; |
100 | 99 | ||
101 | /* Copy direct-to-Guest trap entries. */ | 100 | /* Copy direct-to-Guest trap entries. */ |
102 | if (lg->changed & CHANGED_IDT) | 101 | if (cpu->changed & CHANGED_IDT) |
103 | copy_traps(cpu, pages->state.guest_idt, default_idt_entries); | 102 | copy_traps(cpu, pages->state.guest_idt, default_idt_entries); |
104 | 103 | ||
105 | /* Copy all GDT entries which the Guest can change. */ | 104 | /* Copy all GDT entries which the Guest can change. */ |
106 | if (lg->changed & CHANGED_GDT) | 105 | if (cpu->changed & CHANGED_GDT) |
107 | copy_gdt(cpu, pages->state.guest_gdt); | 106 | copy_gdt(cpu, pages->state.guest_gdt); |
108 | /* If only the TLS entries have changed, copy them. */ | 107 | /* If only the TLS entries have changed, copy them. */ |
109 | else if (lg->changed & CHANGED_GDT_TLS) | 108 | else if (cpu->changed & CHANGED_GDT_TLS) |
110 | copy_gdt_tls(cpu, pages->state.guest_gdt); | 109 | copy_gdt_tls(cpu, pages->state.guest_gdt); |
111 | 110 | ||
112 | /* Mark the Guest as unchanged for next time. */ | 111 | /* Mark the Guest as unchanged for next time. */ |
113 | lg->changed = 0; | 112 | cpu->changed = 0; |
114 | } | 113 | } |
115 | 114 | ||
116 | /* Finally: the code to actually call into the Switcher to run the Guest. */ | 115 | /* Finally: the code to actually call into the Switcher to run the Guest. */ |