Skip to content

Commit

Permalink
[PATCH] i386: paravirt unhandled fallthrough
Browse files Browse the repository at this point in the history
The current code simply calls "start_kernel" directly if we're under a
hypervisor and no paravirt_ops backend wants us, because paravirt.c
registers that as a backend.

This was always a vain hope; start_kernel won't get far without setup.
It's also impossible for paravirt_ops backends which don't sit in the
arch/i386/kernel directory: they can't link before paravirt.o anyway.

Keep it simple: if we pass all the registered paravirt probes, BUG().

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: Andi Kleen <ak@suse.de>
  • Loading branch information
Rusty Russell authored and Andi Kleen committed Feb 13, 2007
1 parent 9af3cf0 commit 992af68
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 6 deletions.
2 changes: 0 additions & 2 deletions arch/i386/kernel/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,6 @@ obj-$(CONFIG_HPET_TIMER) += hpet.o
obj-$(CONFIG_K8_NB) += k8.o

obj-$(CONFIG_VMI) += vmi.o vmitime.o

# Make sure this is linked after any other paravirt_ops structs: see head.S
obj-$(CONFIG_PARAVIRT) += paravirt.o

EXTRA_AFLAGS := -traditional
Expand Down
7 changes: 6 additions & 1 deletion arch/i386/kernel/head.S
Original file line number Diff line number Diff line change
Expand Up @@ -513,10 +513,11 @@ startup_paravirt:
pushl %ecx
pushl %eax

/* paravirt.o is last in link, and that probe fn never returns */
pushl $__start_paravirtprobe
1:
movl 0(%esp), %eax
cmpl $__stop_paravirtprobe, %eax
je unhandled_paravirt
pushl (%eax)
movl 8(%esp), %eax
call *(%esp)
Expand All @@ -528,6 +529,10 @@ startup_paravirt:

addl $4, (%esp)
jmp 1b

unhandled_paravirt:
/* Nothing wanted us: we're screwed. */
ud2
#endif

/*
Expand Down
3 changes: 0 additions & 3 deletions arch/i386/kernel/paravirt.c
Original file line number Diff line number Diff line change
Expand Up @@ -482,9 +482,6 @@ static int __init print_banner(void)
}
core_initcall(print_banner);

/* We simply declare start_kernel to be the paravirt probe of last resort. */
paravirt_probe(start_kernel);

struct paravirt_ops paravirt_ops = {
.name = "bare hardware",
.paravirt_enabled = 0,
Expand Down

0 comments on commit 992af68

Please sign in to comment.