[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Help regarding booting application processor
From: |
Swapnil Pimpale |
Subject: |
Re: Help regarding booting application processor |
Date: |
Wed, 24 Feb 2010 14:32:56 +0530 |
Thanks for your quick reply.
On Wed, Feb 24, 2010 at 1:00 PM, address@hidden
<address@hidden> wrote:
> On Wed, Feb 24, 2010 at 12:57 AM, Swapnil Pimpale
> <address@hidden> 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 <grub/symbol.h>
>> #include <grub/i386/pc/memory.h>
>>
>>
>> .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 0xFFFF, 0
>> .byte 0, 0x9A, 0xCF, 0
>>
>> .word 0xFFFF, 0
>> .byte 0, 0x92, 0xCF, 0
>>
>> .word 0xFFFF, 0
>> .byte 0, 0x9E, 0, 0
>>
>> .word 0xFFFF, 0
>> .byte 0, 0x92, 0, 0
>>
>> gdtdesc:
>> .word 0x27
>> .long gdt
>>
>> idtdesc:
>> .word 0
>> .long 0
>> FUNCTION(TRAMPOLINE_END)
>>
>>
>> _______________________________________________
>> Grub-devel mailing list
>> address@hidden
>> http://lists.gnu.org/mailman/listinfo/grub-devel
>>
>
>
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/grub-devel
>