Re: Help regarding booting application processor
> Ok, I will think in this direction. I just wanted to verify whether > the code in the trampoline.S is correct or not. Well, I'm not qualified to review your trampoline, I read x86 assembler but I'm not familiar with the details of the boot sequence. I think you're in the right place to find someone who is, though. ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel
Re: Help regarding booting application processor
Thanks for your quick reply. On Wed, Feb 24, 2010 at 1:00 PM, richardvo...@gmail.com wrote: > On Wed, Feb 24, 2010 at 12:57 AM, Swapnil Pimpale > wrote: >> Hi all, >> >> I am a final year engineering student and I am doing my project in >> GRUB-1.97~beta4 and Linux Kernel 2.6.24.7. >> >> I am working on Intel Core 2 Duo architecture. I want to boot a >> separate kernel on the second core. >> As of now, I have brought up the halted AP from the GRUB by sending >> IPIs in the INIT-SIPI-SIPI sequence. I have also allocated a 4KB page >> below 1MB and asked the AP to jump to that address. >> >> I am trying to put the BSP in while(1) loop and I want the AP to >> switch from real to protected mode and then jump to start of kernel. >> But whenever I do a jump to 1MB the system reboots. > > Remember that the RAM physical address space is shared between both > processors. You'll need to tell Linux not to touch the second core > and not to touch the memory used by your second OS. I think you can > accomplish both of these goals using the right kernel command line. > Then you'll have to divide up other hardware, like PCI devices, so > that only one OS accesses any given device. For example, the second > OS won't be able to use a hard disk connected to a SATA controller > visible to the first one. Especially the second kernel needs to be > written not to address the PCI bus controller(s), including > enumeration of bus devices. > > If you can't partition the hardware like this then you'll need a > hypervisor, which uses protected mode to intercept and virtualize > attempted hardware access from the other OS. > I have considered these issues in the design. >> I am using the following code as the trampoline code for the AP. >> >> Can someone please let me know what is wrong in the following code. > > Probably you've stomped on a shared resource being used by the first > processor. Even if you run an infinite while loop on the first core, > it can still execute interrupt service routines installed by grub (or > by the second kernel, if not careful about interrupt-processor masks) > which would access grub global data structures. If you overwrite > anything you may end up with a protection fault or invalid instruction > exception, both of which would probably vector back to BIOS startup > code. > Ok, I will think in this direction. I just wanted to verify whether the code in the trampoline.S is correct or not. >> Awaiting your reply, >> >> Thanks, >> Swapnil Pimpale >> >> - trampoline.S - >> /* Tell GAS to generate 16-bit instructions so that this code works >> in real mode. */ >> >> #include >> #include >> >> >> .align 4096 >> .code16 >> FUNCTION(TRAMPOLINE_CODE) >> initial: >> >> mov %cs, %ax >> mov %ax, %ds >> cli >> >> lidtl idtdesc - initial >> lgdtl gdtdesc - initial >> >> mov $0x9e00, %bx // 9e00 is the cs >> shl $4, %ebx >> movl $(gdt - initial + 8), %eax >> movl %ebx, %eax >> >> mov $0x10, %bx >> xor %ecx, %ecx >> mov $0xb800, %cx // address of video RAM in %cx >> shl $4, %ecx >> mov $0x0744, %dx // for printing D >> xor %eax, %eax >> pushw %ax >> mov $0x08, %ax >> pushw %ax >> xor %eax, %eax >> mov $0x9e00, %ax >> shl $4, %eax >> add protcseg - initial, %eax >> pushl %eax >> >> xor %eax, %eax >> movl %cr0, %eax // turn on the PE bit >> orl $0x1, %eax >> movl %eax, %cr0 >> >> jmp l1 >> >> l1: >> >> mov %bx, %ds >> mov %dx, (%ecx) // Print D >> add $2, %ecx >> add $1, %dx >> >> ADDR32 ljmpl $0x8,$((protcseg - initial) + (0x9e00 << 4)) >> >> .align 256 >> .code32 >> protcseg: >> >> l3: >> mov %dx, (%ecx) >> >> movw %bx, %es >> movw %bx, %fs >> movw %bx, %gs >> movw %bx, %ss >> >> l4: >> // The following is the code used by /loader/i386/linux.c for entering Linux >> mov $0x8c000, %esi >> xor %ebx, %ebx >> mov $0x8c000, %eax >> jmp *0x214(%eax) // System reboots here >> >> l5: >> jmp l5 >> >> >> .p2align 2 >> gdt: >> .word 0, 0 >> .byte 0, 0, 0, 0 >> >> .word 0x, 0 >> .byte 0, 0x9A, 0xCF, 0 >> >> .word 0x, 0 >> .byte 0, 0x92, 0xCF, 0 >> >> .word 0x, 0 >> .byte 0, 0x9E, 0, 0 >> >> .word 0x, 0 >> .byte 0, 0x92, 0, 0 >> >> gdtdesc: >> .word 0x27 >> .long gdt >> >> idtdesc: >> .word 0 >> .long 0 >> FUNCTION(TRAMPOLINE_END) >> >> >> ___ >> Grub-devel mailing list >> Grub-devel@gnu.org >> http://lists.gnu.org/mailman/listinfo/grub-devel >> > > > ___ > Grub-devel mailing list > Grub-devel@gnu.org > http://lists.gnu.org/mailman/listinfo/grub-devel >
Re: Help regarding booting application processor
On Wed, Feb 24, 2010 at 12:57 AM, Swapnil Pimpale wrote: > Hi all, > > I am a final year engineering student and I am doing my project in > GRUB-1.97~beta4 and Linux Kernel 2.6.24.7. > > I am working on Intel Core 2 Duo architecture. I want to boot a > separate kernel on the second core. > As of now, I have brought up the halted AP from the GRUB by sending > IPIs in the INIT-SIPI-SIPI sequence. I have also allocated a 4KB page > below 1MB and asked the AP to jump to that address. > > I am trying to put the BSP in while(1) loop and I want the AP to > switch from real to protected mode and then jump to start of kernel. > But whenever I do a jump to 1MB the system reboots. Remember that the RAM physical address space is shared between both processors. You'll need to tell Linux not to touch the second core and not to touch the memory used by your second OS. I think you can accomplish both of these goals using the right kernel command line. Then you'll have to divide up other hardware, like PCI devices, so that only one OS accesses any given device. For example, the second OS won't be able to use a hard disk connected to a SATA controller visible to the first one. Especially the second kernel needs to be written not to address the PCI bus controller(s), including enumeration of bus devices. If you can't partition the hardware like this then you'll need a hypervisor, which uses protected mode to intercept and virtualize attempted hardware access from the other OS. > I am using the following code as the trampoline code for the AP. > > Can someone please let me know what is wrong in the following code. Probably you've stomped on a shared resource being used by the first processor. Even if you run an infinite while loop on the first core, it can still execute interrupt service routines installed by grub (or by the second kernel, if not careful about interrupt-processor masks) which would access grub global data structures. If you overwrite anything you may end up with a protection fault or invalid instruction exception, both of which would probably vector back to BIOS startup code. > Awaiting your reply, > > Thanks, > Swapnil Pimpale > > - trampoline.S - > /* Tell GAS to generate 16-bit instructions so that this code works > in real mode. */ > > #include > #include > > > .align 4096 > .code16 > FUNCTION(TRAMPOLINE_CODE) > initial: > > mov %cs, %ax > mov %ax, %ds > cli > > lidtl idtdesc - initial > lgdtl gdtdesc - initial > > mov $0x9e00, %bx // 9e00 is the cs > shl $4, %ebx > movl $(gdt - initial + 8), %eax > movl %ebx, %eax > > mov $0x10, %bx > xor %ecx, %ecx > mov $0xb800, %cx // address of video RAM in %cx > shl $4, %ecx > mov $0x0744, %dx // for printing D > xor %eax, %eax > pushw %ax > mov $0x08, %ax > pushw %ax > xor %eax, %eax > mov $0x9e00, %ax > shl $4, %eax > add protcseg - initial, %eax > pushl %eax > > xor %eax, %eax > movl %cr0, %eax // turn on the PE bit > orl $0x1, %eax > movl %eax, %cr0 > > jmp l1 > > l1: > > mov %bx, %ds > mov %dx, (%ecx) // Print D > add $2, %ecx > add $1, %dx > > ADDR32 ljmpl $0x8,$((protcseg - initial) + (0x9e00 << 4)) > > .align 256 > .code32 > protcseg: > > l3: > mov %dx, (%ecx) > > movw %bx, %es > movw %bx, %fs > movw %bx, %gs > movw %bx, %ss > > l4: > // The following is the code used by /loader/i386/linux.c for entering Linux > mov $0x8c000, %esi > xor %ebx, %ebx > mov $0x8c000, %eax > jmp *0x214(%eax) // System reboots here > > l5: > jmp l5 > > > .p2align 2 > gdt: > .word 0, 0 > .byte 0, 0, 0, 0 > > .word 0x, 0 > .byte 0, 0x9A, 0xCF, 0 > > .word 0x, 0 > .byte 0, 0x92, 0xCF, 0 > > .word 0x, 0 > .byte 0, 0x9E, 0, 0 > > .word 0x, 0 > .byte 0, 0x92, 0, 0 > > gdtdesc: > .word 0x27 > .long gdt > > idtdesc: > .word 0 > .long 0 > FUNCTION(TRAMPOLINE_END) > > > ___ > Grub-devel mailing list > Grub-devel@gnu.org > http://lists.gnu.org/mailman/listinfo/grub-devel > ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel
Help regarding booting application processor
Hi all, I am a final year engineering student and I am doing my project in GRUB-1.97~beta4 and Linux Kernel 2.6.24.7. I am working on Intel Core 2 Duo architecture. I want to boot a separate kernel on the second core. As of now, I have brought up the halted AP from the GRUB by sending IPIs in the INIT-SIPI-SIPI sequence. I have also allocated a 4KB page below 1MB and asked the AP to jump to that address. I am trying to put the BSP in while(1) loop and I want the AP to switch from real to protected mode and then jump to start of kernel. But whenever I do a jump to 1MB the system reboots. I am using the following code as the trampoline code for the AP. Can someone please let me know what is wrong in the following code. Awaiting your reply, Thanks, Swapnil Pimpale - trampoline.S - /* Tell GAS to generate 16-bit instructions so that this code works in real mode. */ #include #include .align 4096 .code16 FUNCTION(TRAMPOLINE_CODE) initial: mov %cs, %ax mov %ax, %ds cli lidtl idtdesc - initial lgdtl gdtdesc - initial mov $0x9e00, %bx // 9e00 is the cs shl $4, %ebx movl $(gdt - initial + 8), %eax movl %ebx, %eax mov $0x10, %bx xor %ecx, %ecx mov $0xb800, %cx // address of video RAM in %cx shl $4, %ecx mov $0x0744, %dx // for printing D xor %eax, %eax pushw %ax mov $0x08, %ax pushw %ax xor %eax, %eax mov $0x9e00, %ax shl $4, %eax add protcseg - initial, %eax pushl %eax xor %eax, %eax movl %cr0, %eax // turn on the PE bit orl $0x1, %eax movl %eax, %cr0 jmp l1 l1: mov %bx, %ds mov %dx, (%ecx) // Print D add $2, %ecx add $1, %dx ADDR32 ljmpl $0x8,$((protcseg - initial) + (0x9e00 << 4)) .align 256 .code32 protcseg: l3: mov %dx, (%ecx) movw %bx, %es movw %bx, %fs movw %bx, %gs movw %bx, %ss l4: // The following is the code used by /loader/i386/linux.c for entering Linux mov $0x8c000, %esi xor %ebx, %ebx mov $0x8c000, %eax jmp *0x214(%eax) // System reboots here l5: jmp l5 .p2align 2 gdt: .word 0, 0 .byte 0, 0, 0, 0 .word 0x, 0 .byte 0, 0x9A, 0xCF, 0 .word 0x, 0 .byte 0, 0x92, 0xCF, 0 .word 0x, 0 .byte 0, 0x9E, 0, 0 .word 0x, 0 .byte 0, 0x92, 0, 0 gdtdesc: .word 0x27 .long gdt idtdesc: .word 0 .long 0 FUNCTION(TRAMPOLINE_END) ___ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel