@@ -30,6 +30,9 @@ pub mod time;
30
30
pub mod tls;
31
31
pub mod user_copy;
32
32
33
+ mod asm_macros;
34
+
35
+ use core:: cell:: SyncUnsafeCell ;
33
36
use core:: sync:: atomic:: Ordering ;
34
37
35
38
use crate :: acpi:: aml;
@@ -42,32 +45,31 @@ use crate::{drivers, logger, rendy};
42
45
43
46
use raw_cpuid:: CpuId ;
44
47
45
- use limine:: * ;
48
+ use limine:: request:: * ;
49
+ use limine:: smp:: Cpu ;
50
+
46
51
use spin:: Once ;
47
52
48
53
use self :: interrupts:: INTERRUPT_CONTROLLER ;
49
54
50
- static MEMMAP : MemmapRequest = MemmapRequest :: new ( 0 ) ;
51
- static SMP : SmpRequest = SmpRequest :: new ( 0 ) ;
52
- static KERNEL_FILE : KernelFileRequest = KernelFileRequest :: new ( 0 ) ;
53
- static MODULES : ModuleRequest = ModuleRequest :: new ( 0 ) ;
54
- static FRAMEBUFFER : FramebufferRequest = FramebufferRequest :: new ( 0 ) ;
55
- static RSDP : RsdpRequest = RsdpRequest :: new ( 0 ) ;
56
- static BOOT_TIME : BootTimeRequest = BootTimeRequest :: new ( 0 ) ;
57
- static STACK : StackSizeRequest = StackSizeRequest :: new ( 0 ) . stack_size ( 0x1000 * 32 ) ; // 16KiB of stack for both the BSP and the APs
58
- static HHDM : HhdmRequest = HhdmRequest :: new ( 0 ) ;
55
+ static SMP : SyncUnsafeCell < SmpRequest > = SyncUnsafeCell :: new ( SmpRequest :: new ( ) ) ;
56
+ static MEMMAP : SyncUnsafeCell < MemoryMapRequest > = SyncUnsafeCell :: new ( MemoryMapRequest :: new ( ) ) ;
57
+
58
+ static KERNEL_FILE : KernelFileRequest = KernelFileRequest :: new ( ) ;
59
+ static MODULES : ModuleRequest = ModuleRequest :: new ( ) ;
60
+ static FRAMEBUFFER : FramebufferRequest = FramebufferRequest :: new ( ) ;
61
+ static RSDP : RsdpRequest = RsdpRequest :: new ( ) ;
62
+ static BOOT_TIME : BootTimeRequest = BootTimeRequest :: new ( ) ;
63
+ static STACK : StackSizeRequest = StackSizeRequest :: new ( ) . with_size ( 0x1000 * 32 ) ; // 16KiB of stack for both the BSP and the APs
64
+ static HHDM : HhdmRequest = HhdmRequest :: new ( ) ;
59
65
60
66
#[ no_mangle]
61
67
extern "C" fn arch_aero_main ( ) -> ! {
62
68
let kernel_file_resp = KERNEL_FILE
63
69
. get_response ( )
64
- . get ( )
65
70
. expect ( "limine: invalid kernel file response" ) ;
66
71
67
- let kernel_file = kernel_file_resp
68
- . kernel_file
69
- . get ( )
70
- . expect ( "limine: invalid kernel file pointer" ) ;
72
+ let kernel_file = kernel_file_resp. file ( ) ;
71
73
72
74
// Before we start the initialization process, we need to make sure
73
75
// the unwind info is available; just in case if there is a kernel
@@ -76,13 +78,10 @@ extern "C" fn arch_aero_main() -> ! {
76
78
use crate :: unwind:: UnwindInfo ;
77
79
use xmas_elf:: ElfFile ;
78
80
79
- let start = kernel_file
80
- . base
81
- . as_ptr ( )
82
- . expect ( "limine: invalid kernel file base" ) ;
81
+ let start = kernel_file. addr ( ) ;
83
82
84
83
// SAFETY: The bootloader will provide a valid pointer to the kernel file.
85
- let elf_slice = unsafe { core:: slice:: from_raw_parts ( start, kernel_file. length as usize ) } ;
84
+ let elf_slice = unsafe { core:: slice:: from_raw_parts ( start, kernel_file. size ( ) as usize ) } ;
86
85
let elf = ElfFile :: new ( elf_slice) . expect ( "limine: invalid kernel file" ) ;
87
86
88
87
UnwindInfo :: new ( elf)
@@ -91,22 +90,18 @@ extern "C" fn arch_aero_main() -> ! {
91
90
crate :: relocate_self ( ) ;
92
91
93
92
unsafe {
94
- core:: ptr:: read_volatile ( STACK . get_response ( ) . as_ptr ( ) . unwrap ( ) ) ;
93
+ core:: ptr:: read_volatile ( STACK . get_response ( ) . unwrap ( ) ) ;
95
94
}
96
95
97
96
// SAFETY: We have exclusive access to the memory map.
98
- let memmap = MEMMAP
99
- . get_response ( )
100
- . get_mut ( )
101
- . expect ( "limine: invalid memmap response" )
102
- . memmap_mut ( ) ;
97
+ let memmap = unsafe { & mut * MEMMAP . get ( ) } . get_response_mut ( ) . unwrap ( ) ;
103
98
104
99
unsafe {
105
100
interrupts:: disable_interrupts ( ) ;
106
101
}
107
102
108
103
unsafe {
109
- crate :: PHYSICAL_MEMORY_OFFSET = VirtAddr :: new ( HHDM . get_response ( ) . get ( ) . unwrap ( ) . offset ) ;
104
+ crate :: PHYSICAL_MEMORY_OFFSET = VirtAddr :: new ( HHDM . get_response ( ) . unwrap ( ) . offset ( ) ) ;
110
105
}
111
106
112
107
// Now that we have unwind info, we can initialize the COM ports. This
@@ -120,23 +115,11 @@ extern "C" fn arch_aero_main() -> ! {
120
115
121
116
let modules = MODULES
122
117
. get_response ( )
123
- . get ( )
124
118
. expect ( "limine: invalid modules response" )
125
119
. modules ( ) ;
126
120
127
- // Now, we need to parse the kernel command line so we can
128
- // setup the debug renderer.
129
- //
130
- // SAFETY: The `cmdline` is a valid, aligned, and NULL terminated string.
131
- let command_line = kernel_file
132
- . cmdline
133
- . to_str ( )
134
- . expect ( "limine: bad command line" ) ;
135
-
136
- let command_line = cmdline:: parse (
137
- command_line. to_str ( ) . expect ( "cmdline: invalid utf8" ) ,
138
- modules,
139
- ) ;
121
+ let command_line = core:: str:: from_utf8 ( kernel_file. cmdline ( ) ) . unwrap ( ) ;
122
+ let command_line = cmdline:: parse ( command_line, modules) ;
140
123
141
124
paging:: init ( memmap) . unwrap ( ) ;
142
125
log:: info!( "loaded paging" ) ;
@@ -145,17 +128,17 @@ extern "C" fn arch_aero_main() -> ! {
145
128
log:: info!( "loaded heap" ) ;
146
129
147
130
// SMP initialization.
148
- let smp_response = SMP . get_response ( ) . get_mut ( ) . unwrap ( ) ;
149
- let bsp_lapic_id = smp_response. bsp_lapic_id ;
131
+ let smp_response = unsafe { & mut * SMP . get ( ) } . get_response_mut ( ) . unwrap ( ) ;
132
+ let bsp_lapic_id = smp_response. bsp_lapic_id ( ) ;
150
133
151
- for cpu in smp_response. cpus ( ) . iter_mut ( ) {
134
+ for cpu in smp_response. cpus_mut ( ) {
152
135
apic:: CPU_COUNT . fetch_add ( 1 , Ordering :: SeqCst ) ;
153
136
154
137
if cpu. lapic_id == bsp_lapic_id {
155
138
continue ;
156
139
}
157
140
158
- cpu. goto_address = x86_64_aero_ap_main;
141
+ cpu. goto_address . write ( x86_64_aero_ap_main) ;
159
142
}
160
143
161
144
gdt:: init_boot ( ) ;
@@ -165,10 +148,9 @@ extern "C" fn arch_aero_main() -> ! {
165
148
166
149
let framebuffer = FRAMEBUFFER
167
150
. get_response ( )
168
- . get ( )
169
151
. expect ( "limine: invalid framebuffer response" )
170
152
. framebuffers ( )
171
- . first ( )
153
+ . next ( )
172
154
. expect ( "limine: no framebuffer found!" ) ;
173
155
174
156
rendy:: init ( framebuffer, & command_line) ;
@@ -180,7 +162,7 @@ extern "C" fn arch_aero_main() -> ! {
180
162
apic:: init ( ) ;
181
163
log:: info!( "loaded APIC" ) ;
182
164
183
- let rsdp = VirtAddr :: new ( RSDP . get_response ( ) . get ( ) . unwrap ( ) . address . as_ptr ( ) . unwrap ( ) as u64 ) ;
165
+ let rsdp = VirtAddr :: new ( RSDP . get_response ( ) . unwrap ( ) . address ( ) . addr ( ) as u64 ) ;
184
166
185
167
acpi:: init ( rsdp) ;
186
168
log:: info!( "loaded ACPI" ) ;
@@ -196,18 +178,16 @@ extern "C" fn arch_aero_main() -> ! {
196
178
197
179
syscall:: init ( ) ;
198
180
199
- let boot_time = BOOT_TIME . get_response ( ) . get ( ) . unwrap ( ) ;
200
- time:: EPOCH . store ( boot_time. boot_time as _ , Ordering :: SeqCst ) ;
181
+ let boot_time = BOOT_TIME . get_response ( ) . unwrap ( ) ;
182
+ time:: EPOCH . store ( boot_time. boot_time ( ) . as_secs ( ) as usize , Ordering :: SeqCst ) ;
201
183
202
184
// Architecture init is done. Now we can initialize and start the init
203
185
// process in the non-architecture specific part of the kernel.
204
186
crate :: aero_main ( ) ;
205
187
}
206
188
207
- #[ no_mangle]
208
- extern "C" fn x86_64_aero_ap_main ( boot_info : * const SmpInfo ) -> ! {
209
- let boot_info = unsafe { & * boot_info } ;
210
- let ap_id = boot_info. processor_id as usize ;
189
+ extern "C" fn x86_64_aero_ap_main ( cpu : & Cpu ) -> ! {
190
+ let ap_id = cpu. id as usize ;
211
191
212
192
log:: debug!( "booting CPU {}" , ap_id) ;
213
193
0 commit comments