@@ -22,6 +22,8 @@ smp_cpu_t cpus[MAX_CPU];
2222uint32_t bsp_processor_id ;
2323uint64_t cpu_count = 0 ;
2424
25+ static int16_t cpu_done_count = 0 ;
26+
2527static void apu_hlt (){
2628 cpu_hlt ;
2729}
@@ -91,7 +93,7 @@ static void apu_gdt_setup(){
9193void apu_entry (){
9294 __asm__ volatile ("lidt %0" : : "m" (idt_pointer ));
9395
94- ticket_trylock (& apu_lock );
96+ ticket_lock (& apu_lock );
9597 apu_gdt_setup ();
9698
9799 page_table_t * physical_table = virt_to_phys ((uint64_t )get_kernel_pagedir ()-> table );
@@ -126,6 +128,7 @@ void apu_entry(){
126128 smp_cpu_t * cpu = get_cpu_smp (get_current_cpuid ());
127129 if (cpu == NULL ){
128130 logkf ("Error: smp cpu info null %d\n" ,get_current_cpuid ());
131+ cpu -> flags = 0 ;
129132 cpu_hlt ;
130133 }
131134 cpu -> idle_pcb = apu_idle ;
@@ -135,7 +138,8 @@ void apu_entry(){
135138 logkf ("Error: scheduler null %d\n" ,get_current_cpuid ());
136139 cpu_hlt ;
137140 }
138- logkf ("APU %d started.\n" ,get_current_cpuid ());
141+ logkf ("APU %d: %p %p started.\n" ,get_current_cpuid (),cpu -> current_pcb ,cpu -> idle_pcb );
142+ cpu_done_count ++ ;
139143 ticket_unlock (& apu_lock );
140144 open_interrupt ;
141145 apu_hlt ();
@@ -149,6 +153,7 @@ smp_cpu_t *get_cpu_smp(uint32_t processor_id){
149153}
150154
151155void apu_startup (struct limine_smp_request smp_request ){
156+ ticket_init (& apu_lock );
152157 struct limine_smp_response * response = smp_request .response ;
153158 cpu_count = response -> cpu_count ;
154159 for (uint64_t i = 0 ; i < cpu_count && i < MAX_CPU - 1 ; i ++ ){
@@ -165,13 +170,21 @@ void apu_startup(struct limine_smp_request smp_request){
165170 info -> goto_address = (void * )apu_entry ;
166171 }
167172 }
173+
174+ while (cpu_done_count < cpu_count && cpu_done_count < (MAX_CPU - 1 )) __asm__ volatile ("pause" ::: "memory" );
175+ logkf ("APU %d processors have been enabled.\n" ,cpu_count );
176+
168177 smp_cpu_t * cpu = get_cpu_smp (get_current_cpuid ());
169178 if (cpu == NULL ){
170179 return ;
171180 }
181+ cpu -> idle_pcb = kernel_head_task ;
172182 kernel_head_task -> queue_index = queue_enqueue (cpu -> scheduler_queue ,kernel_head_task );
173183 if (kernel_head_task -> queue_index == -1 ){
174184 logkf ("Error: scheduler null %d\n" ,get_current_cpuid ());
175185 }
186+
187+
188+
176189 kinfo ("%d processors have been enabled." ,cpu_count );
177190}
0 commit comments