Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-lguest-and-virtio

* git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-lguest-and-virtio:
lguest: document 32-bit and PAE requirements
lguest: tell git to ignore Documentation/lguest/lguest
virtio: fix suspend when using virtio_balloon
lguest: fix guest crash on non-linear addresses in gdt pvops
lguest: fix crash on vmlinux images

+35 -23
+1
Documentation/lguest/.gitignore
···
··· 1 + lguest
+6 -5
Documentation/lguest/lguest.txt
··· 3 /, /` - or, A Young Coder's Illustrated Hypervisor 4 \\"--\\ http://lguest.ozlabs.org 5 6 - Lguest is designed to be a minimal hypervisor for the Linux kernel, for 7 - Linux developers and users to experiment with virtualization with the 8 - minimum of complexity. Nonetheless, it should have sufficient 9 - features to make it useful for specific tasks, and, of course, you are 10 - encouraged to fork and enhance it (see drivers/lguest/README). 11 12 Features: 13 ··· 37 "Paravirtualized guest support" = Y 38 "Lguest guest support" = Y 39 "High Memory Support" = off/4GB 40 "Alignment value to which kernel should be aligned" = 0x100000 41 (CONFIG_PARAVIRT=y, CONFIG_LGUEST_GUEST=y, CONFIG_HIGHMEM64G=n and 42 CONFIG_PHYSICAL_ALIGN=0x100000)
··· 3 /, /` - or, A Young Coder's Illustrated Hypervisor 4 \\"--\\ http://lguest.ozlabs.org 5 6 + Lguest is designed to be a minimal 32-bit x86 hypervisor for the Linux kernel, 7 + for Linux developers and users to experiment with virtualization with the 8 + minimum of complexity. Nonetheless, it should have sufficient features to 9 + make it useful for specific tasks, and, of course, you are encouraged to fork 10 + and enhance it (see drivers/lguest/README). 11 12 Features: 13 ··· 37 "Paravirtualized guest support" = Y 38 "Lguest guest support" = Y 39 "High Memory Support" = off/4GB 40 + "PAE (Physical Address Extension) Support" = N 41 "Alignment value to which kernel should be aligned" = 0x100000 42 (CONFIG_PARAVIRT=y, CONFIG_LGUEST_GUEST=y, CONFIG_HIGHMEM64G=n and 43 CONFIG_PHYSICAL_ALIGN=0x100000)
+1 -1
arch/x86/include/asm/lguest_hcall.h
··· 5 #define LHCALL_FLUSH_ASYNC 0 6 #define LHCALL_LGUEST_INIT 1 7 #define LHCALL_SHUTDOWN 2 8 - #define LHCALL_LOAD_GDT 3 9 #define LHCALL_NEW_PGTABLE 4 10 #define LHCALL_FLUSH_TLB 5 11 #define LHCALL_LOAD_IDT_ENTRY 6 ··· 16 #define LHCALL_SET_PMD 15 17 #define LHCALL_LOAD_TLS 16 18 #define LHCALL_NOTIFY 17 19 20 #define LGUEST_TRAP_ENTRY 0x1F 21
··· 5 #define LHCALL_FLUSH_ASYNC 0 6 #define LHCALL_LGUEST_INIT 1 7 #define LHCALL_SHUTDOWN 2 8 #define LHCALL_NEW_PGTABLE 4 9 #define LHCALL_FLUSH_TLB 5 10 #define LHCALL_LOAD_IDT_ENTRY 6 ··· 17 #define LHCALL_SET_PMD 15 18 #define LHCALL_LOAD_TLS 16 19 #define LHCALL_NOTIFY 17 20 + #define LHCALL_LOAD_GDT_ENTRY 18 21 22 #define LGUEST_TRAP_ENTRY 0x1F 23
+9 -7
arch/x86/lguest/boot.c
··· 273 * controls the entire thing and the Guest asks it to make changes using the 274 * LOAD_GDT hypercall. 275 * 276 - * This is the opposite of the IDT code where we have a LOAD_IDT_ENTRY 277 - * hypercall and use that repeatedly to load a new IDT. I don't think it 278 - * really matters, but wouldn't it be nice if they were the same? Wouldn't 279 - * it be even better if you were the one to send the patch to fix it? 280 */ 281 static void lguest_load_gdt(const struct desc_ptr *desc) 282 { 283 - BUG_ON((desc->size + 1) / 8 != GDT_ENTRIES); 284 - kvm_hypercall2(LHCALL_LOAD_GDT, __pa(desc->address), GDT_ENTRIES); 285 } 286 287 /* For a single GDT entry which changes, we do the lazy thing: alter our GDT, ··· 291 const void *desc, int type) 292 { 293 native_write_gdt_entry(dt, entrynum, desc, type); 294 - kvm_hypercall2(LHCALL_LOAD_GDT, __pa(dt), GDT_ENTRIES); 295 } 296 297 /* OK, I lied. There are three "thread local storage" GDT entries which change
··· 273 * controls the entire thing and the Guest asks it to make changes using the 274 * LOAD_GDT hypercall. 275 * 276 + * This is the exactly like the IDT code. 277 */ 278 static void lguest_load_gdt(const struct desc_ptr *desc) 279 { 280 + unsigned int i; 281 + struct desc_struct *gdt = (void *)desc->address; 282 + 283 + for (i = 0; i < (desc->size+1)/8; i++) 284 + kvm_hypercall3(LHCALL_LOAD_GDT_ENTRY, i, gdt[i].a, gdt[i].b); 285 } 286 287 /* For a single GDT entry which changes, we do the lazy thing: alter our GDT, ··· 291 const void *desc, int type) 292 { 293 native_write_gdt_entry(dt, entrynum, desc, type); 294 + /* Tell Host about this new entry. */ 295 + kvm_hypercall3(LHCALL_LOAD_GDT_ENTRY, entrynum, 296 + dt[entrynum].a, dt[entrynum].b); 297 } 298 299 /* OK, I lied. There are three "thread local storage" GDT entries which change
+2 -1
drivers/lguest/lg.h
··· 158 /* segments.c: */ 159 void setup_default_gdt_entries(struct lguest_ro_state *state); 160 void setup_guest_gdt(struct lg_cpu *cpu); 161 - void load_guest_gdt(struct lg_cpu *cpu, unsigned long table, u32 num); 162 void guest_load_tls(struct lg_cpu *cpu, unsigned long tls_array); 163 void copy_gdt(const struct lg_cpu *cpu, struct desc_struct *gdt); 164 void copy_gdt_tls(const struct lg_cpu *cpu, struct desc_struct *gdt);
··· 158 /* segments.c: */ 159 void setup_default_gdt_entries(struct lguest_ro_state *state); 160 void setup_guest_gdt(struct lg_cpu *cpu); 161 + void load_guest_gdt_entry(struct lg_cpu *cpu, unsigned int i, 162 + u32 low, u32 hi); 163 void guest_load_tls(struct lg_cpu *cpu, unsigned long tls_array); 164 void copy_gdt(const struct lg_cpu *cpu, struct desc_struct *gdt); 165 void copy_gdt_tls(const struct lg_cpu *cpu, struct desc_struct *gdt);
+7 -6
drivers/lguest/segments.c
··· 144 gdt[i] = cpu->arch.gdt[i]; 145 } 146 147 - /*H:620 This is where the Guest asks us to load a new GDT (LHCALL_LOAD_GDT). 148 - * We copy it from the Guest and tweak the entries. */ 149 - void load_guest_gdt(struct lg_cpu *cpu, unsigned long table, u32 num) 150 { 151 /* We assume the Guest has the same number of GDT entries as the 152 * Host, otherwise we'd have to dynamically allocate the Guest GDT. */ 153 if (num > ARRAY_SIZE(cpu->arch.gdt)) 154 kill_guest(cpu, "too many gdt entries %i", num); 155 156 - /* We read the whole thing in, then fix it up. */ 157 - __lgread(cpu, cpu->arch.gdt, table, num * sizeof(cpu->arch.gdt[0])); 158 - fixup_gdt_table(cpu, 0, ARRAY_SIZE(cpu->arch.gdt)); 159 /* Mark that the GDT changed so the core knows it has to copy it again, 160 * even if the Guest is run on the same CPU. */ 161 cpu->changed |= CHANGED_GDT;
··· 144 gdt[i] = cpu->arch.gdt[i]; 145 } 146 147 + /*H:620 This is where the Guest asks us to load a new GDT entry 148 + * (LHCALL_LOAD_GDT_ENTRY). We tweak the entry and copy it in. */ 149 + void load_guest_gdt_entry(struct lg_cpu *cpu, u32 num, u32 lo, u32 hi) 150 { 151 /* We assume the Guest has the same number of GDT entries as the 152 * Host, otherwise we'd have to dynamically allocate the Guest GDT. */ 153 if (num > ARRAY_SIZE(cpu->arch.gdt)) 154 kill_guest(cpu, "too many gdt entries %i", num); 155 156 + /* Set it up, then fix it. */ 157 + cpu->arch.gdt[num].a = lo; 158 + cpu->arch.gdt[num].b = hi; 159 + fixup_gdt_table(cpu, num, num+1); 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. */ 162 cpu->changed |= CHANGED_GDT;
+7 -2
drivers/lguest/x86/core.c
··· 324 u8 insn[3] = {0xcd, 0x1f, 0x90}; 325 326 __lgwrite(cpu, guest_pa(cpu, cpu->regs->eip), insn, sizeof(insn)); 327 } 328 329 static bool is_hypercall(struct lg_cpu *cpu) ··· 568 int lguest_arch_do_hcall(struct lg_cpu *cpu, struct hcall_args *args) 569 { 570 switch (args->arg0) { 571 - case LHCALL_LOAD_GDT: 572 - load_guest_gdt(cpu, args->arg1, args->arg2); 573 break; 574 case LHCALL_LOAD_IDT_ENTRY: 575 load_guest_idt_entry(cpu, args->arg1, args->arg2, args->arg3);
··· 324 u8 insn[3] = {0xcd, 0x1f, 0x90}; 325 326 __lgwrite(cpu, guest_pa(cpu, cpu->regs->eip), insn, sizeof(insn)); 327 + /* The above write might have caused a copy of that page to be made 328 + * (if it was read-only). We need to make sure the Guest has 329 + * up-to-date pagetables. As this doesn't happen often, we can just 330 + * drop them all. */ 331 + guest_pagetable_clear_all(cpu); 332 } 333 334 static bool is_hypercall(struct lg_cpu *cpu) ··· 563 int lguest_arch_do_hcall(struct lg_cpu *cpu, struct hcall_args *args) 564 { 565 switch (args->arg0) { 566 + case LHCALL_LOAD_GDT_ENTRY: 567 + load_guest_gdt_entry(cpu, args->arg1, args->arg2, args->arg3); 568 break; 569 case LHCALL_LOAD_IDT_ENTRY: 570 load_guest_idt_entry(cpu, args->arg1, args->arg2, args->arg3);
+2 -1
drivers/virtio/virtio_balloon.c
··· 190 try_to_freeze(); 191 wait_event_interruptible(vb->config_change, 192 (diff = towards_target(vb)) != 0 193 - || kthread_should_stop()); 194 if (diff > 0) 195 fill_balloon(vb, diff); 196 else if (diff < 0)
··· 190 try_to_freeze(); 191 wait_event_interruptible(vb->config_change, 192 (diff = towards_target(vb)) != 0 193 + || kthread_should_stop() 194 + || freezing(current)); 195 if (diff > 0) 196 fill_balloon(vb, diff); 197 else if (diff < 0)