From owner-p4-projects@FreeBSD.ORG Sat Apr 21 04:26:07 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B60AB16A403; Sat, 21 Apr 2007 04:26:07 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 6E95416A401 for ; Sat, 21 Apr 2007 04:26:07 +0000 (UTC) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 5F0E213C448 for ; Sat, 21 Apr 2007 04:26:07 +0000 (UTC) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l3L4Q7NC029139 for ; Sat, 21 Apr 2007 04:26:07 GMT (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l3L4Q7Fb029129 for perforce@freebsd.org; Sat, 21 Apr 2007 04:26:07 GMT (envelope-from marcel@freebsd.org) Date: Sat, 21 Apr 2007 04:26:07 GMT Message-Id: <200704210426.l3L4Q7Fb029129@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Cc: Subject: PERFORCE change 118512 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Apr 2007 04:26:08 -0000 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 #include +#include #include #include +#include + +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;