55#include "intctl.h"
66#include "io.h"
77#include "krlibc.h"
8- #include "apic.h"
98#include "lock.h"
109#include "mem/frame.h"
1110#include "mem/page.h"
@@ -19,14 +18,12 @@ spin_t tsc_lock = SPIN_INIT;
1918
2019__attribute__((naked , noreturn )) void
2120arch_run_on_kernel_stack (uint64_t stack_top , arch_stack_entry_t entry , void * arg ) {
22- __asm__ volatile (
23- "mov %rdi, %rsp\n\t"
24- "andq $-16, %rsp\n\t"
25- "xorq %rbp, %rbp\n\t"
26- "mov %rdx, %rdi\n\t"
27- "call *%rsi\n\t"
28- "ud2\n\t"
29- );
21+ __asm__ volatile ("mov %rdi, %rsp\n\t"
22+ "andq $-16, %rsp\n\t"
23+ "xorq %rbp, %rbp\n\t"
24+ "mov %rdx, %rdi\n\t"
25+ "call *%rsi\n\t"
26+ "ud2\n\t" );
3027}
3128
3229void cpuid (uint32_t code , uint32_t * a , uint32_t * b , uint32_t * c , uint32_t * d ) {
@@ -90,15 +87,15 @@ void calibrate_tsc_with_hpet() {
9087}
9188
9289void arch_context_init (tcb_t thread , struct arch_context_ * context ) {
93- context -> kernel_stack = (uint64_t )thread + STACK_SIZE ;
94- context -> user_stack = context -> kernel_stack ;
90+ context -> kernel_stack = (uint64_t )thread + STACK_SIZE ;
91+ context -> user_stack = context -> kernel_stack ;
9592 context -> user_stack_top = context -> kernel_stack ;
96- context -> regs .rsp = context -> kernel_stack ;
97- context -> regs .rflags = get_rflags ();
98- context -> regs .cs = 0x8 ;
99- context -> regs .ss = 0x10 ;
100- context -> regs .es = 0x10 ;
101- context -> regs .ds = 0x10 ;
93+ context -> regs .rsp = context -> kernel_stack ;
94+ context -> regs .rflags = get_rflags ();
95+ context -> regs .cs = 0x8 ;
96+ context -> regs .ss = 0x10 ;
97+ context -> regs .es = 0x10 ;
98+ context -> regs .ds = 0x10 ;
10299 set_kernel_stack (context -> kernel_stack );
103100 context -> fs_base = read_fsbase ();
104101 context -> gs_base = read_gsbase ();
@@ -201,7 +198,7 @@ void arch_task_switch(tcb_t current, tcb_t next, struct pt_regs *regs) {
201198static uint64_t push_slice (uint64_t ustack , uint8_t * slice , uint64_t len ) {
202199 uint64_t tmp_stack = ustack ;
203200 tmp_stack -= len ;
204- tmp_stack -= ( tmp_stack % 0x08 ) ;
201+ tmp_stack -= tmp_stack % 0x08 ;
205202 memcpy ((void * )tmp_stack , slice , len );
206203 return tmp_stack ;
207204}
@@ -231,9 +228,9 @@ static uint64_t build_user_stack(
231228
232229 uint64_t execfn_ptr = tmp_stack ;
233230
234- uint64_t * envps = ( uint64_t * ) malloc (1024 );
231+ uint64_t * envps = malloc (1024 );
235232 memset (envps , 0 , 1024 );
236- uint64_t * argvps = ( uint64_t * ) malloc (1024 );
233+ uint64_t * argvps = malloc (1024 );
237234 memset (argvps , 0 , 1024 );
238235
239236 if (envp != NULL ) {
@@ -254,35 +251,18 @@ static uint64_t build_user_stack(
254251 tmp_stack -= (tmp_stack - total_length ) % 0x10 ;
255252
256253 uint8_t random_bytes [16 ];
257- for (int i = 0 ; i < 16 ; i ++ )
254+ for (int i = 0 ; i < 16 ; i ++ ) {
258255 random_bytes [i ] = (uint8_t )(i * 17 + 42 );
256+ }
259257 tmp_stack = push_slice (tmp_stack , random_bytes , 16 );
260258 uint64_t random_addr = tmp_stack ;
261259
262260 // push auxv
263- uint8_t * tmp = ( uint8_t * ) malloc (2 * sizeof (uint64_t ));
261+ uint8_t * tmp = malloc (2 * sizeof (uint64_t ));
264262 memset (tmp , 0 , 2 * sizeof (uint64_t ));
265263 tmp_stack = push_slice (tmp_stack , tmp , 2 * sizeof (uint64_t ));
266264
267- page_map_range_to_random (
268- task -> process -> directory ,
269- EHDR_START_ADDR ,
270- task -> process -> exec -> size ,
271- PTE_PRESENT | PTE_WRITEABLE | PTE_USER
272- );
273- memcpy ((void * )EHDR_START_ADDR , src_data , task -> process -> exec -> size );
274-
275- if (link_data != NULL ) {
276- page_map_range_to_random (
277- task -> process -> directory ,
278- INTERPRETER_EHDR_ADDR ,
279- link_size ,
280- PTE_PRESENT | PTE_WRITEABLE | PTE_USER
281- );
282- memcpy ((void * )INTERPRETER_EHDR_ADDR , link_data , link_size );
283- }
284-
285- Elf64_Ehdr * ehdr = (Elf64_Ehdr * )EHDR_START_ADDR ;
265+ Elf64_Ehdr * ehdr = (Elf64_Ehdr * )src_data ;
286266 // CP_Kernel 将用户程序本体从 0 地址加载故不加phdrs的偏移
287267 Elf64_Phdr * phdrs = (Elf64_Phdr * )(ehdr -> e_phoff + load_start );
288268
@@ -363,7 +343,6 @@ static uint64_t build_user_stack(
363343 }
364344 free_argv (argv );
365345
366-
367346 return tmp_stack ;
368347}
369348
@@ -373,7 +352,7 @@ _Noreturn void arch_switch_to_user_mode() {
373352 tcb_t current = get_current_task ();
374353 current -> context .regs .rflags = 0 << 12 | 0b10 | 1 << 9 ;
375354
376- pcb_t process = current -> process ;
355+ pcb_t process = current -> process ;
377356 uint64_t data_phys = 0 ;
378357 size_t data_pages = 0 ;
379358 uint8_t * data = NULL ;
@@ -404,8 +383,7 @@ _Noreturn void arch_switch_to_user_mode() {
404383 Elf64_Ehdr * ehdr = (Elf64_Ehdr * )data ;
405384 uint64_t executor_start = ehdr -> e_type == ET_DYN ? EXECUTOR_BASE_ADDR : 0 ;
406385 uint64_t load_start = 0 ;
407- void * entry =
408- load_executor_elf (data , process -> directory , executor_start , & load_start , process );
386+ void * entry = load_executor_elf (data , process -> directory , executor_start , & load_start , process );
409387 if (entry != NULL && ehdr -> e_type == ET_DYN ) {
410388 entry = (void * )((uint64_t )entry + load_start );
411389 }
0 commit comments