ap-boot.S

Go to the documentation of this file.
00001 /*
00002  * Okay, this file contains the code that's going to bootstrap the AP cpus
00003  */
00004 
00005 
00006         .globl  ap_trampoline_start,ap_trampoline_end
00007         .text
00008         .code16
00009 ap_trampoline_start:
00010         cli
00011         cld
00012 
00013         movw    %cs,%ax         // The CPU knows its CS already, so lets use it for the other segments
00014         movw    %ax,%ds
00015         movw    %ax,%es
00016         movw    %ax,%ss
00017 
00018         // Do some bochs-specific bullshit
00019         mov     $0x31,%al // '1'
00020         mov     $0xe9,%dx
00021         outb    %al,%dx
00022         //lgdt    ap_gdt;       
00023         lgdt    ap_trampoline_gdt_limit - ap_trampoline_start
00024         movl    %cr0,%eax
00025         orl     $0x1,%eax
00026         movl    %eax,%cr0       // PMODE!
00027 
00028 .code32
00029         .byte 0x66
00030         ljmp    $0x08,$(ap_trampoline_32 - ap_trampoline_start)         // 0x08 == KERNEL_CS
00031 
00032 ap_trampoline_32:
00033         mov     $0x32,%al // '2'
00034         mov     $0xe9,%dx
00035         outb    %al,%dx
00036 
00037         mov     $0x10,%ax
00038         mov     %ax,%ds
00039         mov     %ax,%es
00040         mov     %ax,%fs
00041         mov     %ax,%gs
00042         mov     %ax,%ss
00043 
00044         // Spinlock
00045         mov     ap_trampoline_spl - ap_trampoline_start,%edi
00046 ap_spl:
00047         //cmp   $1,(%edi)
00048         //je    ap_spl
00049 
00050         mov     $1,%eax      // Value to be set
00051         xchgl   (%edi),%eax
00052         cmp     $0,%eax
00053         je      ap_spl
00054         // /Spinlock
00055 
00056         mov     $0x30,%al // '0'
00057         mov     $0xe9,%dx
00058         outb    %al,%dx
00059                 
00060         mov     ap_trampoline_stackptr - ap_trampoline_start,%ebx
00061         mov     %ebx,%esp
00062         add     $0x1000,%ebx
00063         mov     %ebx,ap_trampoline_stackptr - ap_trampoline_start
00064 
00065         mov     $0x31,%al // '1'
00066         mov     $0xe9,%dx
00067         outb    %al,%dx
00068 
00069         // spinunlock
00070         mov     $0,%eax
00071         mov     ap_trampoline_spl - ap_trampoline_start,%edi
00072         xchgl   (%edi),%eax
00073         // /spinunlock
00074 
00075         mov     $0x33,%al // '3'
00076         mov     $0xe9,%dx
00077         outb    %al,%dx
00078 
00079         mov     ap_trampoline_epoint,%eax
00080         call    *%eax
00081 1:
00082         hlt
00083         jmp     1b              // Halt if we ever get here somehow
00084 
00085         // Stack.. This sucks, since CPU initialization isn't serialized
00086 ap_trampoline_stackptr:
00087         .long   0x10000         // 256KB
00088 ap_trampoline_epoint:
00089         .long   c_ap_boot
00090 
00091 ap_trampoline_spl:
00092         .long   0
00093 ap_gdt:
00094         .long ubixGDT
00095         
00096         // GDT
00097 ap_trampoline_gdt:
00098         .word   0
00099 ap_trampoline_gdt_limit:
00100         .word   128     // Room for 32 descriptors
00101 ap_trampoline_gdt_base:
00102         .long   0x20000         // 128KB (move this later)
00103 
00104 
00105 ap_trampoline_end:

Generated on Fri Dec 15 11:18:55 2006 for UbixOS V2 by  doxygen 1.4.7