Hi, we don't have SMP, but there are a few things one could start with already. For instance allowing the code to work/compile, even though not all components are there yet.
This diff allows allocating the idle pcb / kernelstack. Rename of idlepcb to idle_pcb to be comparable with amd64. ok? Patrick diff --git a/sys/arch/arm/arm/cpu.c b/sys/arch/arm/arm/cpu.c index 66596231528..91dd49bb00c 100644 --- a/sys/arch/arm/arm/cpu.c +++ b/sys/arch/arm/arm/cpu.c @@ -48,6 +48,7 @@ #include <sys/systm.h> #include <sys/malloc.h> #include <sys/device.h> +#include <sys/user.h> #include <sys/proc.h> #include <sys/conf.h> #include <sys/sched.h> @@ -293,24 +294,23 @@ identify_arm_cpu(struct device *dv, struct cpu_info *ci) #ifdef MULTIPROCESSOR int -cpu_alloc_idlepcb(struct cpu_info *ci) +cpu_alloc_idle_pcb(struct cpu_info *ci) { vaddr_t uaddr; struct pcb *pcb; struct trapframe *tf; - int error; /* * Generate a kernel stack and PCB (in essence, a u-area) for the * new CPU. */ - if (uvm_uarea_alloc(&uaddr)) { - error = uvm_fault_wire(kernel_map, uaddr, uaddr + USPACE, - VM_FAULT_WIRE, PROT_READ | PROT_WRITE); - if (error) - return error; + uaddr = (vaddr_t)km_alloc(USPACE, &kv_any, &kp_zero, &kd_nowait); + if (uaddr == 0) { + printf("%s: unable to allocate idle stack\n", + __func__); + return ENOMEM; } - ci->ci_idlepcb = pcb = (struct pcb *)uaddr; + ci->ci_idle_pcb = pcb = (struct pcb *)uaddr; /* * This code is largely derived from cpu_fork(), with which it diff --git a/sys/arch/arm/include/cpu.h b/sys/arch/arm/include/cpu.h index f56c12b7d90..aa8360abcfb 100644 --- a/sys/arch/arm/include/cpu.h +++ b/sys/arch/arm/include/cpu.h @@ -187,6 +187,7 @@ struct cpu_info { u_int32_t ci_randseed; struct pcb *ci_curpcb; + struct pcb *ci_idle_pcb; u_int32_t ci_arm_cpuid; /* aggregate CPU id */ u_int32_t ci_arm_cputype; /* CPU type */ @@ -283,8 +284,8 @@ extern int want_resched; /* resched() was called */ */ struct device; -void cpu_attach (struct device *); -int cpu_alloc_idlepcb (struct cpu_info *); +void cpu_attach(struct device *); +int cpu_alloc_idle_pcb(struct cpu_info *); /* * Random cruft