Skip to content

Commit 4967dac

Browse files
committed
修复 riscv64 因 AP CPU 栈异常问题导致无法加载 cpio.
1 parent 4dc480e commit 4967dac

File tree

5 files changed

+20
-8
lines changed

5 files changed

+20
-8
lines changed

src/arch/riscv64/include/nr.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@ typedef uint64_t (*syscall_t)(
1111
uint64_t arg6,
1212
struct pt_regs *regs
1313
);
14+
15+

src/arch/riscv64/initrd.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@ extern uint64_t fdt_get_initrd(const void *fdt, size_t *out_size);
88
extern void *opensbi_dtb_vaddr;
99
extern boot_module_t opensbi_modules[MAX_LOAD_MODULE];
1010

11+
static _Atomic(bool) has_initrd = false;
12+
13+
bool is_initrd() {
14+
return has_initrd;
15+
}
16+
1117
void initrd_setup() {
1218
size_t size;
13-
uint64_t buffer = fdt_get_initrd(opensbi_dtb_vaddr, &size);
19+
const uint64_t buffer = fdt_get_initrd(opensbi_dtb_vaddr, &size);
1420
if (buffer == 0) {
1521
kerror("cannot find initrd file.");
16-
arch_close_interrupt();
17-
arch_wait_for_interrupt();
22+
return;
1823
}
1924
opensbi_modules[0].size = size;
2025
opensbi_modules[0].data = phys_to_virt(buffer);
@@ -24,4 +29,5 @@ void initrd_setup() {
2429

2530
strcpy(opensbi_modules[0].name, "initramfs");
2631
strcpy(opensbi_modules[0].path, "/initramfs.img");
32+
has_initrd = true;
2733
}

src/arch/riscv64/main.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
extern void arch_cpu_init();
2828
extern void initrd_setup();
29+
extern bool is_initrd();
2930

3031
USED _Noreturn void kmain() {
3132
size_t boot_argc = boot_parse_cmdline(get_kernel_cmdline());
@@ -58,13 +59,16 @@ USED _Noreturn void kmain() {
5859
futex_init();
5960
setup_task();
6061
smp_init();
61-
// cpio_init();
62+
if (is_initrd()) {
63+
cpio_init();
64+
}
6265
ksuccess("Kernel load done!");
6366
scheduler_enable();
6467
arch_open_interrupt();
6568

6669
// launch_init_process();
6770

68-
while (true)
71+
while (true) {
6972
arch_wait_for_interrupt();
70-
}
73+
}
74+
}

src/arch/riscv64/task/smp_rv64.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ void smp_cpu_init(uint64_t *cpu_count0, uint64_t *bsp_cpu_id, cpu_local_t *cpu_l
108108
uint64_t cpu_id = cpu_count++;
109109
cpuid_to_hartids[cpu_id] = hartid;
110110

111-
apu_arg[cpu_id].sp = (uint64_t)aligned_alloc(PAGE_SIZE, 32768);
111+
apu_arg[cpu_id].sp = (uint64_t)aligned_alloc(PAGE_SIZE, STACK_SIZE) + STACK_SIZE;
112112
apu_arg[cpu_id].satp =
113113
MAKE_SATP_PADDR(SATP_MODE_SV48, 0, virt_to_phys(get_kernel_pagedir()->table));
114114
uint64_t rv = sbi_ecall(

src/include/task/smp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ typedef struct cpu_local_info {
2828
#if defined(__x86_64__) || defined(__amd64__)
2929
bool x2apic_mode_supported();
3030
#endif
31-
void arch_ap_cpu_entry();
31+
void arch_ap_cpu_entry(uint64_t hartid);
3232
cpu_local_t *get_min_task_count_cpu();
3333
cpu_local_t *get_cpu_local(size_t id);
3434
uint64_t get_bsp_cpu_id();

0 commit comments

Comments
 (0)