diff options
Diffstat (limited to 'arch/x86/xen/setup.c')
-rw-r--r-- | arch/x86/xen/setup.c | 53 |
1 files changed, 15 insertions, 38 deletions
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index 769c4b01fa32..b5a7f928234b 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
@@ -23,7 +23,6 @@ | |||
23 | #include <xen/interface/callback.h> | 23 | #include <xen/interface/callback.h> |
24 | #include <xen/interface/memory.h> | 24 | #include <xen/interface/memory.h> |
25 | #include <xen/interface/physdev.h> | 25 | #include <xen/interface/physdev.h> |
26 | #include <xen/interface/memory.h> | ||
27 | #include <xen/features.h> | 26 | #include <xen/features.h> |
28 | 27 | ||
29 | #include "xen-ops.h" | 28 | #include "xen-ops.h" |
@@ -182,24 +181,21 @@ char * __init xen_memory_setup(void) | |||
182 | for (i = 0; i < memmap.nr_entries; i++) { | 181 | for (i = 0; i < memmap.nr_entries; i++) { |
183 | unsigned long long end = map[i].addr + map[i].size; | 182 | unsigned long long end = map[i].addr + map[i].size; |
184 | 183 | ||
185 | if (map[i].type == E820_RAM) { | 184 | if (map[i].type == E820_RAM && end > mem_end) { |
186 | if (map[i].addr < mem_end && end > mem_end) { | 185 | /* RAM off the end - may be partially included */ |
187 | /* Truncate region to max_mem. */ | 186 | u64 delta = min(map[i].size, end - mem_end); |
188 | u64 delta = end - mem_end; | ||
189 | 187 | ||
190 | map[i].size -= delta; | 188 | map[i].size -= delta; |
191 | extra_pages += PFN_DOWN(delta); | 189 | end -= delta; |
192 | 190 | ||
193 | end = mem_end; | 191 | extra_pages += PFN_DOWN(delta); |
194 | } | ||
195 | } | 192 | } |
196 | 193 | ||
197 | if (end > xen_extra_mem_start) | 194 | if (map[i].size > 0 && end > xen_extra_mem_start) |
198 | xen_extra_mem_start = end; | 195 | xen_extra_mem_start = end; |
199 | 196 | ||
200 | /* If region is non-RAM or below mem_end, add what remains */ | 197 | /* Add region if any remains */ |
201 | if ((map[i].type != E820_RAM || map[i].addr < mem_end) && | 198 | if (map[i].size > 0) |
202 | map[i].size > 0) | ||
203 | e820_add_region(map[i].addr, map[i].size, map[i].type); | 199 | e820_add_region(map[i].addr, map[i].size, map[i].type); |
204 | } | 200 | } |
205 | 201 | ||
@@ -248,26 +244,11 @@ char * __init xen_memory_setup(void) | |||
248 | else | 244 | else |
249 | extra_pages = 0; | 245 | extra_pages = 0; |
250 | 246 | ||
251 | if (!xen_initial_domain()) | 247 | xen_add_extra_mem(extra_pages); |
252 | xen_add_extra_mem(extra_pages); | ||
253 | 248 | ||
254 | return "Xen"; | 249 | return "Xen"; |
255 | } | 250 | } |
256 | 251 | ||
257 | static void xen_idle(void) | ||
258 | { | ||
259 | local_irq_disable(); | ||
260 | |||
261 | if (need_resched()) | ||
262 | local_irq_enable(); | ||
263 | else { | ||
264 | current_thread_info()->status &= ~TS_POLLING; | ||
265 | smp_mb__after_clear_bit(); | ||
266 | safe_halt(); | ||
267 | current_thread_info()->status |= TS_POLLING; | ||
268 | } | ||
269 | } | ||
270 | |||
271 | /* | 252 | /* |
272 | * Set the bit indicating "nosegneg" library variants should be used. | 253 | * Set the bit indicating "nosegneg" library variants should be used. |
273 | * We only need to bother in pure 32-bit mode; compat 32-bit processes | 254 | * We only need to bother in pure 32-bit mode; compat 32-bit processes |
@@ -337,9 +318,6 @@ void __cpuinit xen_enable_syscall(void) | |||
337 | 318 | ||
338 | void __init xen_arch_setup(void) | 319 | void __init xen_arch_setup(void) |
339 | { | 320 | { |
340 | struct physdev_set_iopl set_iopl; | ||
341 | int rc; | ||
342 | |||
343 | xen_panic_handler_init(); | 321 | xen_panic_handler_init(); |
344 | 322 | ||
345 | HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments); | 323 | HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments); |
@@ -356,11 +334,6 @@ void __init xen_arch_setup(void) | |||
356 | xen_enable_sysenter(); | 334 | xen_enable_sysenter(); |
357 | xen_enable_syscall(); | 335 | xen_enable_syscall(); |
358 | 336 | ||
359 | set_iopl.iopl = 1; | ||
360 | rc = HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl); | ||
361 | if (rc != 0) | ||
362 | printk(KERN_INFO "physdev_op failed %d\n", rc); | ||
363 | |||
364 | #ifdef CONFIG_ACPI | 337 | #ifdef CONFIG_ACPI |
365 | if (!(xen_start_info->flags & SIF_INITDOMAIN)) { | 338 | if (!(xen_start_info->flags & SIF_INITDOMAIN)) { |
366 | printk(KERN_INFO "ACPI in unprivileged domain disabled\n"); | 339 | printk(KERN_INFO "ACPI in unprivileged domain disabled\n"); |
@@ -372,7 +345,11 @@ void __init xen_arch_setup(void) | |||
372 | MAX_GUEST_CMDLINE > COMMAND_LINE_SIZE ? | 345 | MAX_GUEST_CMDLINE > COMMAND_LINE_SIZE ? |
373 | COMMAND_LINE_SIZE : MAX_GUEST_CMDLINE); | 346 | COMMAND_LINE_SIZE : MAX_GUEST_CMDLINE); |
374 | 347 | ||
375 | pm_idle = xen_idle; | 348 | /* Set up idle, making sure it calls safe_halt() pvop */ |
349 | #ifdef CONFIG_X86_32 | ||
350 | boot_cpu_data.hlt_works_ok = 1; | ||
351 | #endif | ||
352 | pm_idle = default_idle; | ||
376 | 353 | ||
377 | fiddle_vdso(); | 354 | fiddle_vdso(); |
378 | } | 355 | } |