UbixOS  2.0
ap-boot.S
Go to the documentation of this file.
1 /*-
2  * Copyright (c) 2002-2018 The UbixOS Project.
3  * All rights reserved.
4  *
5  * This was developed by Christopher W. Olsen for the UbixOS Project.
6  *
7  * Redistribution and use in source and binary forms, with or without modification, are permitted
8  * provided that the following conditions are met:
9  *
10  * 1) Redistributions of source code must retain the above copyright notice, this list of
11  * conditions, the following disclaimer and the list of authors.
12  * 2) Redistributions in binary form must reproduce the above copyright notice, this list of
13  * conditions, the following disclaimer and the list of authors in the documentation and/or
14  * other materials provided with the distribution.
15  * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to
16  * endorse or promote products derived from this software without specific prior written
17  * permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
20  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
22  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
24  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
26  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /*
30  * Okay, this file contains the code that's going to bootstrap the AP cpus
31  */
32 
33 
34  .globl ap_trampoline_start,ap_trampoline_end
35  .text
36  .code16
37 ap_trampoline_start:
38  cli
39  cld
40 
41  movw %cs,%ax // The CPU knows its CS already, so lets use it for the other segments
42  movw %ax,%ds
43  movw %ax,%es
44  movw %ax,%ss
45 
46  // Do some bochs-specific bullshit
47  mov $0x31,%al // '1'
48  mov $0xe9,%dx
49  outb %al,%dx
50  //lgdt ap_gdt;
51  lgdt ap_trampoline_gdt_limit - ap_trampoline_start
52  movl %cr0,%eax
53  orl $0x1,%eax
54  movl %eax,%cr0 // PMODE!
55 
56 .code32
57  .byte 0x66
58  ljmp $0x08,$(ap_trampoline_32 - ap_trampoline_start) // 0x08 == KERNEL_CS
59 
60 ap_trampoline_32:
61  mov $0x32,%al // '2'
62  mov $0xe9,%dx
63  outb %al,%dx
64 
65  mov $0x10,%ax
66  mov %ax,%ds
67  mov %ax,%es
68  mov %ax,%fs
69  mov %ax,%gs
70  mov %ax,%ss
71 
72  // Spinlock
73  mov ap_trampoline_spl - ap_trampoline_start,%edi
74 ap_spl:
75  //cmp $1,(%edi)
76  //je ap_spl
77 
78  mov $1,%eax // Value to be set
79  xchgl (%edi),%eax
80  cmp $0,%eax
81  je ap_spl
82  // /Spinlock
83 
84  mov $0x30,%al // '0'
85  mov $0xe9,%dx
86  outb %al,%dx
87 
88  mov ap_trampoline_stackptr - ap_trampoline_start,%ebx
89  mov %ebx,%esp
90  add $0x1000,%ebx
91  mov %ebx,ap_trampoline_stackptr - ap_trampoline_start
92 
93  mov $0x31,%al // '1'
94  mov $0xe9,%dx
95  outb %al,%dx
96 
97  // spinunlock
98  mov $0,%eax
99  mov ap_trampoline_spl - ap_trampoline_start,%edi
100  xchgl (%edi),%eax
101  // /spinunlock
102 
103  mov $0x33,%al // '3'
104  mov $0xe9,%dx
105  outb %al,%dx
106 
107  mov ap_trampoline_epoint,%eax
108  call *%eax
109 1:
110  hlt
111  jmp 1b // Halt if we ever get here somehow
112 
113  // Stack.. This sucks, since CPU initialization isn't serialized
114 ap_trampoline_stackptr:
115  .long 0x10000 // 256KB
116 ap_trampoline_epoint:
117  .long c_ap_boot
118 
119 ap_trampoline_spl:
120  .long 0
121 ap_gdt:
122  .long ubixGDT
123 
124  // GDT
125 ap_trampoline_gdt:
126  .word 0
127 ap_trampoline_gdt_limit:
128  .word 128 // Room for 32 descriptors
129 ap_trampoline_gdt_base:
130  .long 0x20000 // 128KB (move this later)
131 
132 
133 ap_trampoline_end: