UbixOS V2 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: