Date: Sat, 21 Apr 2007 04:26:07 GMT From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 118512 for review Message-ID: <200704210426.l3L4Q7Fb029129@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=118512 Change 118512 by marcel@marcel_xcllnt on 2007/04/21 04:25:39 Add OF_start_cpu() to start a CPU. Affected files ... .. //depot/projects/powerpc/sys/powerpc/include/ofw_machdep.h#2 edit .. //depot/projects/powerpc/sys/powerpc/powerpc/locore.S#2 edit .. //depot/projects/powerpc/sys/powerpc/powerpc/mp_machdep.c#10 edit .. //depot/projects/powerpc/sys/powerpc/powerpc/ofw_machdep.c#8 edit Differences ... ==== //depot/projects/powerpc/sys/powerpc/include/ofw_machdep.h#2 (text+ko) ==== @@ -32,5 +32,6 @@ int OF_decode_addr(phandle_t, int, bus_space_tag_t *, bus_space_handle_t *); void OF_getetheraddr(device_t dev, u_char *addr); +void OF_start_cpu(phandle_t, void (*)(void *), void *); #endif /* _MACHINE_OFW_MACHDEP_H_ */ ==== //depot/projects/powerpc/sys/powerpc/powerpc/locore.S#2 (text+ko) ==== @@ -183,6 +183,28 @@ b OF_exit /* + * Kernel entry point for application/auxiliary + * processors (APs). + */ + .globl __start_ap +__start_ap: + li 8,0 + li 9,0x100 + mtctr 9 +1: + dcbf 0,8 + icbi 0,8 + addi 8,8,0x20 + bdnz 1b + + sync + isync + + bl mi_startup +9: + b 9b + +/* * int setfault() * * Similar to setjmp to setup for handling faults on accesses to user memory. ==== //depot/projects/powerpc/sys/powerpc/powerpc/mp_machdep.c#10 (text+ko) ==== @@ -33,9 +33,13 @@ #include <sys/pcpu.h> #include <sys/smp.h> +#include <machine/bus.h> #include <machine/smp.h> #include <dev/ofw/openfirm.h> +#include <machine/ofw_machdep.h> + +extern void __start_ap(void *); MALLOC_DEFINE(M_SMP, "smp", "SMP specific datastructures"); @@ -103,11 +107,8 @@ /* Get the p-handle of the BSP. */ chosen = OF_finddevice("/chosen"); - if (chosen != -1) { - res = OF_getprop(chosen, "cpu", &inst, sizeof(inst)); - bsp = (res > 0) ? OF_instance_to_package(inst) : -1; - } else - bsp = -1; + res = OF_getprop(chosen, "cpu", &inst, sizeof(inst)); + bsp = (res > 0) ? OF_instance_to_package(inst) : -1; root = OF_peer(0); dev = OF_child(root); @@ -145,6 +146,11 @@ pc->pc_bsp = 1; } all_cpus |= 1 << cpuid; + if (pc->pc_bsp) + continue; + + /* Start AP */ + OF_start_cpu(dev, __start_ap, pc); } } ==== //depot/projects/powerpc/sys/powerpc/powerpc/ofw_machdep.c#8 (text+ko) ==== @@ -278,6 +278,33 @@ } void +OF_start_cpu(phandle_t cpu, void (*entry)(void *), void *arg) +{ + static struct { + cell_t name; + cell_t nargs; + cell_t nreturns; + cell_t cpu; + cell_t entry; + cell_t arg; + } args = { + (cell_t)"start-cpu", + 3, + 0 + }; + + printf("XXX: %s: cpu=%x, entry=%p, arg=%p...", __func__, cpu, + entry, arg); + + args.cpu = (cell_t)cpu; + args.entry = (cell_t)entry; + args.arg = (cell_t)arg; + openfirmware(&args); + + printf(" ok\n"); +} + +void OF_getetheraddr(device_t dev, u_char *addr) { phandle_t node;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200704210426.l3L4Q7Fb029129>