Messages in this thread | | | Date | Thu, 21 Dec 2006 07:56:01 +0530 | From | Vivek Goyal <> | Subject | Re: Patch "i386: Relocatable kernel support" causes instant reboot |
| |
On Thu, Dec 21, 2006 at 05:32:56AM -0700, Eric W. Biederman wrote: > > Take a look at the diff for commit 968de4f02621db35b8ae5239c8cfc6664fb872d8 > of setup.S there are very few candidate instructions. > > I suspect with a few minutes of review we should be able to see what the > assembler is doing wrong and decide if we want to blacklist that assembler > or work around it's bug. > > diff --git a/arch/i386/boot/setup.S b/arch/i386/boot/setup.S > index 3aec453..9aa8b05 100644 > --- a/arch/i386/boot/setup.S > +++ b/arch/i386/boot/setup.S > @@ -588,11 +588,6 @@ rmodeswtch_normal: > call default_switch > > rmodeswtch_end: > -# we get the code32 start address and modify the below 'jmpi' > -# (loader may have changed it) > - movl %cs:code32_start, %eax > - movl %eax, %cs:code32 > - > # Now we move the system to its rightful place ... but we check if we have a > # big-kernel. In that case we *must* not move it ... > testb $LOADED_HIGH, %cs:loadflags > @@ -788,11 +783,12 @@ a20_err_msg: > a20_done: > > #endif /* CONFIG_X86_VOYAGER */ > -# set up gdt and idt > +# set up gdt and idt and 32bit start address > lidt idt_48 # load idt with 0,0 > xorl %eax, %eax # Compute gdt_base > movw %ds, %ax # (Convert %ds:gdt to a linear ptr) > shll $4, %eax > + addl %eax, code32 > addl $gdt, %eax > movl %eax, (gdt_48+2) > lgdt gdt_48 # load gdt with whatever is > @@ -851,9 +847,26 @@ flush_instr: > # Manual, Mixing 16-bit and 32-bit code, page 16-6) > > .byte 0x66, 0xea # prefix + jmpi-opcode > -code32: .long 0x1000 # will be set to 0x100000 > - # for big kernels > +code32: .long startup_32 # will be set to %cs+startup_32 > .word __BOOT_CS > +.code32 > +startup_32: > + movl $(__BOOT_DS), %eax > + movl %eax, %ds > + movl %eax, %es > + movl %eax, %fs > + movl %eax, %gs > + movl %eax, %ss > + > + xorl %eax, %eax > +1: incl %eax # check that A20 really IS enabled > + movl %eax, 0x00000000 # loop forever if it isn't > + cmpl %eax, 0x00100000 > + je 1b > + > + # Jump to the 32bit entry point > + jmpl *(code32_start - start + (DELTA_INITSEG << 4))(%esi)
Hi Eric,
I got a basic query. Why have we introduced this additional jump to startup_32 in the same file? Won't it work if we stick to old method of enabling protected mode and then directly taking a jmp to startup_32 in arch/i386/kernel/head.S. Am I missing something obivious?
Thanks Vivek - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |