diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2005-12-03 14:30:07 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2005-12-03 14:30:07 +0000 |
commit | adafd44db90a04c4df796b4e345001a39a835287 (patch) | |
tree | afd1335287af4838d4497cf55be1c065f245442c /sys/arch | |
parent | 5652cf70d1907362b0d7f661c5edbbf19e021b8e (diff) |
Switch m88k ports to __HAVE_CPUINFO. Current cpu pointer is held in SR0
on all running processors.
Tested aoyama@ and I
Diffstat (limited to 'sys/arch')
27 files changed, 390 insertions, 458 deletions
diff --git a/sys/arch/luna88k/include/locore.h b/sys/arch/luna88k/include/locore.h index f31fd89595b..eeaacb50714 100644 --- a/sys/arch/luna88k/include/locore.h +++ b/sys/arch/luna88k/include/locore.h @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.h,v 1.5 2005/04/27 14:09:45 miod Exp $ */ +/* $OpenBSD: locore.h,v 1.6 2005/12/03 14:30:02 miod Exp $ */ #ifndef _MACHINE_LOCORE_H_ #define _MACHINE_LOCORE_H_ @@ -12,12 +12,12 @@ unsigned read_processor_identification_register(void); int badaddr(vaddr_t addr, int size); #define badwordaddr(x) badaddr(x, 4) -void set_cpu_number(unsigned number); void doboot(void); -/* locore_c_routines.c */ +/* machdep.c */ unsigned getipl(void); +void set_cpu_number(cpuid_t); /* eh.S */ diff --git a/sys/arch/luna88k/luna88k/eh.S b/sys/arch/luna88k/luna88k/eh.S index 2ac63b1b267..2924d40a308 100644 --- a/sys/arch/luna88k/luna88k/eh.S +++ b/sys/arch/luna88k/luna88k/eh.S @@ -1,4 +1,4 @@ -/* $OpenBSD: eh.S,v 1.5 2004/08/05 21:34:08 miod Exp $ */ +/* $OpenBSD: eh.S,v 1.6 2005/12/03 14:30:05 miod Exp $ */ /* * Mach Operating System * Copyright (c) 1993-1991 Carnegie Mellon University @@ -36,7 +36,8 @@ */ #define PFSR_SAVE \ - extu TMP, FLAGS, FLAG_CPU_FIELD_WIDTH<0>; /* TMP = cpu# */ \ + ldcr TMP, CPU; \ + ld TMP, TMP, CI_CPUID; /* TMP = cpu# */ \ cmp TMP2, TMP, 0x0; /* CPU0 ? */ \ bb1 eq, TMP2, 1f; \ cmp TMP2, TMP, 0x1; /* CPU1 ? */ \ diff --git a/sys/arch/luna88k/luna88k/locore.S b/sys/arch/luna88k/luna88k/locore.S index 79c0a1ebf04..73bb31395ed 100644 --- a/sys/arch/luna88k/luna88k/locore.S +++ b/sys/arch/luna88k/luna88k/locore.S @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.S,v 1.9 2005/10/12 19:32:17 miod Exp $ */ +/* $OpenBSD: locore.S,v 1.10 2005/12/03 14:30:05 miod Exp $ */ /* * Copyright (c) 1998 Steve Murphree, Jr. * Copyright (c) 1996 Nivas Madhur @@ -120,7 +120,7 @@ GLOBAL(start_text) or.u r13, r0, hi16(_C_LABEL(brdtyp)) st r8, r13, lo16(_C_LABEL(brdtyp)) - /* set _cputyp */ + /* set cputyp */ cmp r2, r8, BRD_197 /* r8 contains brdtyp */ bb1 ne, r2, 1f /* if it's a '197, CPU is 88110 */ or.u r13, r0, hi16(CPU_88110) @@ -157,12 +157,12 @@ GLOBAL(start_text) * The manual says not to disable interrupts and freeze shadowing * at the same time because interrupts are not actually disabled * until after the next instruction. Well, if an interrupt - * occurs now, we're in deep anyway, so I'm going to do + * occurs now, we're in deep trouble anyway, so I'm going to do * the two together. * * Upon a reset (or poweron, I guess), the PSR indicates: * supervisor mode - * interrupts, shadowing, FPU, missaligned exception: all disabled + * interrupts, shadowing, FPU, misaligned exception: all disabled * * We'll just construct our own turning on what we want. * @@ -170,7 +170,6 @@ GLOBAL(start_text) */ stcr r0, SSBR /* clear this for later */ - stcr r0, SR0 /* clear "current thread" */ stcr r0, SR1 /* clear the CPU flags */ set r11, r0, 1<PSR_SUPERVISOR_MODE_BIT> @@ -263,7 +262,6 @@ ASLOCAL(master_start) */ or.u r31, r0, hi16(_ASM_LABEL(intstack_end)) or r31, r31, lo16(_ASM_LABEL(intstack_end)) - clr r31, r31, 3<0> /* round down to 8-byte boundary */ or.u r3, r0, hi16(_C_LABEL(vector_list)) or r3, r3, lo16(_C_LABEL(vector_list)) @@ -320,8 +318,8 @@ ASLOCAL(master_start) /* * ...and we can switch to the u area stack now. */ - or.u r10, r0, hi16(_C_LABEL(curpcb)) - ld r31, r10, lo16(_C_LABEL(curpcb)) + ldcr r10, CPU + ld r31, r10, CI_CURPCB addu r31, r31, USIZE /* call main() - no arguments although main() still defines one */ @@ -382,12 +380,6 @@ GLOBAL(spin_cpu) * The processor loops (busy waits) for the given number of microseconds: * Thus, delay(1000000) will delay for one second. * (originally from Mach 2.5) - * - * REGISTER USAGE: - * IN r1 - return address - * IN r2 - number of microseconds - * r3 - cpu speed in MHz - * r4 - number of cycles to delay */ GLOBAL(delay) @@ -412,7 +404,7 @@ GLOBAL(kernel_sdt) /* SDT (segment descriptor table */ .align NBPG GLOBAL(intstack) - space INTSTACK_SIZE /* 16K, just to be safe */ + space USIZE ASGLOBAL(intstack_end) ASGLOBAL(slavestack) space NBPG /* 4K, small, interim stack */ @@ -429,7 +421,7 @@ ASGLOBAL(slavestack_end) */ .align NBPG GLOBAL(idle_u) - space UPAGES * NBPG + space USIZE /* * Process 0's u. @@ -439,6 +431,8 @@ GLOBAL(idle_u) .align NBPG ASLOCAL(u0) space UPAGES * NBPG +GLOBAL(proc0paddr) + word _ASM_LABEL(u0) /* KVA of proc0 uarea */ GLOBAL(ret_addr) word 0 @@ -454,21 +448,8 @@ ASLOCAL(master_processor_chosen) /* XMEM spin lock -- controls access to master_processor_chosen */ ASLOCAL(inter_processor_lock) word 0 + #if defined(DDB) || NKSYMS > 0 GLOBAL(esym) word 0 #endif /* DDB || NKSYMS > 0 */ -GLOBAL(proc0paddr) - word _ASM_LABEL(u0) /* KVA of proc0 uarea */ - -/* - * curpcb points to the current pcb (and hence u. area). - * Initially this is the special one. - */ -/* - * pcb is composed of kernel state + user state - * I may have to change curpcb to u0 + PCB_USER based on what - * other parts expect XXX nivas - */ -GLOBAL(curpcb) - word _ASM_LABEL(u0) /* curpcb = &u0 */ diff --git a/sys/arch/luna88k/luna88k/m8820x.c b/sys/arch/luna88k/luna88k/m8820x.c index fcaa0c8423f..adfa70058cb 100644 --- a/sys/arch/luna88k/luna88k/m8820x.c +++ b/sys/arch/luna88k/luna88k/m8820x.c @@ -1,4 +1,4 @@ -/* $OpenBSD: m8820x.c,v 1.8 2005/12/02 21:16:43 miod Exp $ */ +/* $OpenBSD: m8820x.c,v 1.9 2005/12/03 14:30:05 miod Exp $ */ /* * Copyright (c) 2004, Miodrag Vallat. * @@ -101,8 +101,6 @@ m8820x_setup_board_config() struct m8820x_cmmu *cmmu; int num; - master_cpu = 0; /* temp to get things going */ - m8820x_cmmu[0].cmmu_regs = (void *)CMMU_I0; m8820x_cmmu[1].cmmu_regs = (void *)CMMU_D0; m8820x_cmmu[2].cmmu_regs = (void *)CMMU_I1; @@ -150,7 +148,6 @@ m8820x_setup_board_config() for (num = 0; num < max_cpus; num++) { int type; - cpu_sets[num] = 1; /* This cpu installed... */ type = CMMU_TYPE(m8820x_cmmu[num << cmmu_shift]. cmmu_regs[CMMU_IDR]); diff --git a/sys/arch/luna88k/luna88k/machdep.c b/sys/arch/luna88k/luna88k/machdep.c index 2efd7c4b6e4..a0082c2bb82 100644 --- a/sys/arch/luna88k/luna88k/machdep.c +++ b/sys/arch/luna88k/luna88k/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.26 2005/12/01 22:14:52 miod Exp $ */ +/* $OpenBSD: machdep.c,v 1.27 2005/12/03 14:30:05 miod Exp $ */ /* * Copyright (c) 1998, 1999, 2000, 2001 Steve Murphree, Jr. * Copyright (c) 1996 Nivas Madhur @@ -200,7 +200,6 @@ struct nvram_t { vaddr_t obiova; int ssir; -int want_resched; int physmem; /* available physical memory, in pages */ @@ -261,7 +260,6 @@ vaddr_t last_addr; vaddr_t avail_start, avail_end; vaddr_t virtual_avail, virtual_end; -extern struct pcb *curpcb; extern struct user *proc0paddr; /* @@ -1106,16 +1104,9 @@ luna88k_bootstrap() extern struct consdev *cn_tab; extern struct cmmu_p cmmu8820x; extern char *end; - - /* - * Must initialize p_addr before autoconfig or - * the fault handler will get a NULL reference. - * Do this early so that we can take a data or - * instruction fault and survive it. - */ - proc0.p_addr = proc0paddr; - curproc = &proc0; - curpcb = &proc0paddr->u_pcb; +#ifndef MULTIPROCESSOR + u_int master_cpu; +#endif cmmu = &cmmu8820x; @@ -1143,6 +1134,16 @@ luna88k_bootstrap() set_cpu_number(master_cpu); /* + * Now that set_cpu_number() set us with a valid cpu_info pointer, + * we need to initialize p_addr and curpcb before autoconf, for the + * fault handler to behave properly [except for badaddr() faults, + * which can be taken care of without a valid curcpu()]. + */ + proc0.p_addr = proc0paddr; + curproc = &proc0; + curpcb = &proc0paddr->u_pcb; + + /* * We may have more than one CPU, so mention which one is the master. * We will also want to spin up slave CPUs on the long run... */ @@ -1441,8 +1442,10 @@ setlevel(unsigned int level) set_value = int_set_val[level]; +#ifdef MULTIPROCESSOR if (cpu != master_cpu) set_value &= INT_SLAVE_MASK; +#endif *int_mask_reg[cpu] = set_value; luna88k_curspl[cpu] = level; diff --git a/sys/arch/m88k/conf/files.m88k b/sys/arch/m88k/conf/files.m88k index 08e8d158101..924ea6f2662 100644 --- a/sys/arch/m88k/conf/files.m88k +++ b/sys/arch/m88k/conf/files.m88k @@ -1,6 +1,5 @@ -# $OpenBSD: files.m88k,v 1.14 2005/10/24 19:28:28 miod Exp $ +# $OpenBSD: files.m88k,v 1.15 2005/12/03 14:30:05 miod Exp $ -file arch/m88k/m88k/cmmu.c file arch/m88k/m88k/db_disasm.c ddb file arch/m88k/m88k/db_interface.c ddb file arch/m88k/m88k/db_sstep.c ddb diff --git a/sys/arch/m88k/include/asm.h b/sys/arch/m88k/include/asm.h index 20b21b078ca..536699246b4 100644 --- a/sys/arch/m88k/include/asm.h +++ b/sys/arch/m88k/include/asm.h @@ -1,4 +1,4 @@ -/* $OpenBSD: asm.h,v 1.6 2005/10/13 19:47:12 miod Exp $ */ +/* $OpenBSD: asm.h,v 1.7 2005/12/03 14:30:05 miod Exp $ */ /* * Mach Operating System @@ -160,12 +160,6 @@ #define RTE NOP ; rte /* - * Fields in cr18. More bits are used privately in the exception handling - * code. - */ -#define FLAG_CPU_FIELD_WIDTH 2 /* must match cpu_number() */ - -/* * Info about the PSR */ #define PSR_SHADOW_FREEZE_BIT 0 @@ -184,6 +178,8 @@ #define VECTOR(x) \ word _C_LABEL(x) +#define CPU SR0 + #endif /* _LOCORE */ #define FLUSH_PIPELINE_STRING "tb1 0, r0, 0" diff --git a/sys/arch/m88k/include/cmmu.h b/sys/arch/m88k/include/cmmu.h index cbaeb731f1e..632b9141474 100644 --- a/sys/arch/m88k/include/cmmu.h +++ b/sys/arch/m88k/include/cmmu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cmmu.h,v 1.11 2005/12/02 21:16:45 miod Exp $ */ +/* $OpenBSD: cmmu.h,v 1.12 2005/12/03 14:30:05 miod Exp $ */ /* * Mach Operating System * Copyright (c) 1993-1992 Carnegie Mellon University @@ -28,13 +28,10 @@ #ifndef _M88K_CMMU_H_ #define _M88K_CMMU_H_ -#if defined(_KERNEL) && !defined(_LOCORE) /* * Prototypes and stuff for cmmu.c. */ -extern unsigned cpu_sets[MAX_CPUS]; -extern unsigned master_cpu; -extern int max_cpus; +#if defined(_KERNEL) && !defined(_LOCORE) /* * This lock protects the cmmu SAR and SCR's; other ports diff --git a/sys/arch/m88k/include/cpu.h b/sys/arch/m88k/include/cpu.h index a69737ff09a..7e49360a207 100644 --- a/sys/arch/m88k/include/cpu.h +++ b/sys/arch/m88k/include/cpu.h @@ -1,4 +1,4 @@ -/* $OpenBSD: cpu.h,v 1.9 2005/11/28 22:22:51 miod Exp $ */ +/* $OpenBSD: cpu.h,v 1.10 2005/12/03 14:30:05 miod Exp $ */ /* * Copyright (c) 1996 Nivas Madhur * Copyright (c) 1992, 1993 @@ -54,24 +54,88 @@ #ifdef _KERNEL -#ifndef MAX_CPUS -#define MAX_CPUS 4 -#endif - #include <machine/pcb.h> #include <machine/psl.h> +#include <machine/intr.h> +#include <sys/sched.h> + +#if defined(MULTIPROCESSOR) +#if !defined(MAX_CPUS) || MAX_CPUS > 4 +#undef MAX_CPUS +#define MAX_CPUS 4 +#endif +#else +#undef MAX_CPUS +#define MAX_CPUS 1 +#endif #ifndef _LOCORE -static unsigned cpu_number(void); +extern u_int max_cpus; + +/* + * Per-CPU data structure + */ -static __inline__ unsigned cpu_number(void) -{ - unsigned cpu; +struct cpu_info { + u_int ci_alive; /* nonzero if CPU present */ - __asm__ __volatile__ ("ldcr %0, cr18" : "=r" (cpu)); - return (cpu & 3); -} + struct proc *ci_curproc; /* current process... */ + struct pcb *ci_curpcb; /* ...and its pcb */ + + u_int ci_cpuid; /* cpu number */ + u_int ci_primary; /* set if master cpu */ + + struct schedstate_percpu ci_schedstate; /* scheduling state */ + int ci_want_resched; /* need_resched() invoked */ + + struct pcb *ci_idle_pcb; /* idle pcb (and stack) */ + + u_int ci_intrdepth; /* interrupt depth */ + + u_long ci_spin_locks; /* spin locks counter */ + + /* XXX ddb state? */ +}; + +extern cpuid_t master_cpu; +extern struct cpu_info m88k_cpus[MAX_CPUS]; + +#define CPU_INFO_ITERATOR cpuid_t +#define CPU_INFO_FOREACH(cii, ci) \ + for ((cii) = 0; (cii) < MAX_CPUS; (cii)++) \ + if (((ci) = &m88k_cpus[cii])->ci_alive != 0) +#define CPU_INFO_UNIT(ci) ((ci)->ci_cpuid) + +#if defined(MULTIPROCESSOR) + +#define curcpu() \ +({ \ + struct cpu_info *cpuptr; \ + \ + __asm__ __volatile__ ("ldcr %0, cr17" : "=r" (cpuptr)); \ + cpuptr; \ +}) + +#define CPU_IS_PRIMARY(ci) ((ci)->ci_primary != 0) + +void cpu_boot_secondary_processors(void); + +#else /* MULTIPROCESSOR */ + +#define curcpu() (&m88k_cpus[0]) +#define CPU_IS_PRIMARY(ci) 1 + +#endif /* MULTIPROCESSOR */ + +/* + * The md code may hardcode this in some very specific situations. + */ +#if !defined(cpu_number) +#define cpu_number() curcpu()->ci_cpuid +#endif + +#define curpcb curcpu()->ci_curpcb #endif /* _LOCORE */ @@ -84,6 +148,11 @@ static __inline__ unsigned cpu_number(void) #define cpu_swapin(p) do { /* nothing */ } while (0) #define cpu_swapout(p) do { /* nothing */ } while (0) +#if defined(MULTIPROCESSOR) +#include <sys/lock.h> +#include <sys/mplock.h> +#endif + /* * Arguments to hardclock and gatherstats encapsulate the previous * machine state in an opaque clockframe. CLKF_INTR is only valid @@ -97,8 +166,8 @@ struct clockframe { #define CLKF_USERMODE(framep) (((framep)->tf.tf_epsr & PSR_MODE) == 0) #define CLKF_PC(framep) ((framep)->tf.tf_sxip & XIP_ADDR) -extern int intrdepth; -#define CLKF_INTR(framep) (intrdepth > 1) +#define CLKF_INTR(framep) \ + (((struct cpu_info *)(framep)->tf.tf_cpu)->ci_intrdepth > 1) /* * Get interrupt glue. @@ -122,17 +191,16 @@ extern int ssir; * Preempt the current process if in interrupt from user mode, * or after the current trap/syscall if in system mode. */ -extern int want_resched; /* resched() was called */ #define need_resched(ci) \ do { \ - want_resched = 1; \ - if (curproc != NULL) \ - aston(curproc); \ + ci->ci_want_resched = 1; \ + if (ci->ci_curproc != NULL) \ + aston(ci->ci_curproc); \ } while (0) /* * Give a profiling tick to the current process when the user profiling - * buffer pages are invalid. On the sparc, request an ast to send us + * buffer pages are invalid. On the m88k, request an ast to send us * through trap(), marking the proc as needing a profiling tick. */ #define need_proftick(p) ((p)->p_flag |= P_OWEUPC, aston(p)) diff --git a/sys/arch/m88k/include/pcb.h b/sys/arch/m88k/include/pcb.h index e6aaf9d9305..2ebb31accf0 100644 --- a/sys/arch/m88k/include/pcb.h +++ b/sys/arch/m88k/include/pcb.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pcb.h,v 1.1 2004/04/26 12:34:05 miod Exp $ */ +/* $OpenBSD: pcb.h,v 1.2 2005/12/03 14:30:05 miod Exp $ */ /* * Copyright (c) 1996 Nivas Madhur * Mach Operating System @@ -81,7 +81,7 @@ struct trapframe { register_t tf_scratch1; /* reserved for use by locore */ register_t tf_ipfsr; /* P BUS status */ register_t tf_dpfsr; /* P BUS status */ - register_t tf_cpu; /* cpu number */ + void *tf_cpu; /* cpu_info pointer */ }; #define tf_r tf_regs.r diff --git a/sys/arch/m88k/include/types.h b/sys/arch/m88k/include/types.h index 25dc0d1dc0d..a733ec54414 100644 --- a/sys/arch/m88k/include/types.h +++ b/sys/arch/m88k/include/types.h @@ -1,5 +1,5 @@ /* $NetBSD: types.h,v 1.7 1995/07/05 17:46:11 pk Exp $ */ -/* $OpenBSD: types.h,v 1.3 2004/11/26 21:23:05 miod Exp $ */ +/* $OpenBSD: types.h,v 1.4 2005/12/03 14:30:05 miod Exp $ */ /* * Copyright (c) 1992, 1993 @@ -77,4 +77,6 @@ typedef unsigned long long uint64_t; typedef int32_t register_t; +#define __HAVE_CPUINFO + #endif /* _M88K_TYPES_H_ */ diff --git a/sys/arch/m88k/m88k/cmmu.c b/sys/arch/m88k/m88k/cmmu.c deleted file mode 100644 index dbf6f223747..00000000000 --- a/sys/arch/m88k/m88k/cmmu.c +++ /dev/null @@ -1,80 +0,0 @@ -/* $OpenBSD: cmmu.c,v 1.4 2005/10/13 19:48:33 miod Exp $ */ -/* - * Copyright (c) 1998 Steve Murphree, Jr. - * Copyright (c) 1996 Nivas Madhur - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Nivas Madhur. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/* - * Mach Operating System - * Copyright (c) 1993-1991 Carnegie Mellon University - * Copyright (c) 1991 OMRON Corporation - * All Rights Reserved. - * - * Permission to use, copy, modify and distribute this software and its - * documentation is hereby granted, provided that both the copyright - * notice and this permission notice appear in all copies of the - * software, derivative works or modified versions, and any portions - * thereof, and that both notices appear in supporting documentation. - * - * CARNEGIE MELLON AND OMRON ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS IS" - * CONDITION. CARNEGIE MELLON AND OMRON DISCLAIM ANY LIABILITY OF ANY KIND - * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. - * - * Carnegie Mellon requests users of this software to return to - * - * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU - * School of Computer Science - * Carnegie Mellon University - * Pittsburgh PA 15213-3890 - * - * any improvements or extensions that they make and grant Carnegie the - * rights to redistribute these changes. - */ - -#include <sys/param.h> -#include <sys/types.h> -#include <sys/simplelock.h> - -#include <uvm/uvm_extern.h> - -#include <machine/cmmu.h> - -/* - * This lock protects the cmmu SAR and SCR's; other ports - * can be accessed without locking it. - * - * May be used from "db_interface.c". - */ -struct simplelock cmmu_cpu_lock; - -unsigned cpu_sets[MAX_CPUS]; -unsigned master_cpu = 0; -int max_cpus; - -struct cmmu_p *cmmu; diff --git a/sys/arch/m88k/m88k/eh_common.S b/sys/arch/m88k/m88k/eh_common.S index c85d9172c2b..df15ba03372 100644 --- a/sys/arch/m88k/m88k/eh_common.S +++ b/sys/arch/m88k/m88k/eh_common.S @@ -1,4 +1,4 @@ -/* $OpenBSD: eh_common.S,v 1.13 2005/11/28 22:21:15 miod Exp $ */ +/* $OpenBSD: eh_common.S,v 1.14 2005/12/03 14:30:06 miod Exp $ */ /* * Mach Operating System * Copyright (c) 1993-1991 Carnegie Mellon University @@ -133,7 +133,7 @@ * system will hang waiting for a bit to clear that will never. * * 3) If the exception is the privilege violation exception, the bounds - * violation exception, or the misaligned access exception, the + * check exception, or the misaligned access exception, the * destination register bit in the SSBR may need to be cleared. * * 4) If the exception is one of the floating exceptions, then the @@ -172,7 +172,6 @@ * register during the FPU restart (it could get overwritten by the FPU!), * we save it in a control register, SR3, during the restart. * - * * HOWEVER ..... * * Because other uncompleted actions in the FPU may fault when the FPU is @@ -211,10 +210,6 @@ /* * SR1 - CPU FLAGS REGISTER - * XXX clean this when the trap handler is reworked. Among the things - * I like to see is having the trap frame on the kernel stack instead - * of putting in the PCB. If done properly, we don't need SR1 for doing - * anything special. nivas * * SR1 contains flags about the current CPU status. * @@ -247,10 +242,10 @@ * * Also, if any are 'r2' or 'r3', be careful using with CALL above! */ -#define FLAGS r2 -#define TMP r3 -#define TMP2 r10 -#define TMP3 r11 +#define FLAGS r2 +#define TMP r3 +#define TMP2 r10 +#define TMP3 r11 #define SAVE_TMP2 st r10, r31, GENREG_OFF(10) #define SAVE_TMP3 st r11, r31, GENREG_OFF(11) #define RESTORE_TMP2 ld r10, r31, GENREG_OFF(10) @@ -611,7 +606,6 @@ GLOBAL(error_handler) GLOBAL(reset_handler) or r29, r0, 0 1: - /* pick up the slavestack */ or r26, r0, r31 /* save old stack */ or.u r31, r0, hi16(_ASM_LABEL(intstack_end)) or r31, r31, lo16(_ASM_LABEL(intstack_end)) @@ -743,7 +737,7 @@ ASLOCAL(m88100_ignore_data_exception) /* * SR1: previous FLAGS reg * SR2: free - * SR3: must presere + * SR3: must preserve * FLAGS: CPU status flags */ xcr FLAGS, FLAGS, SR1 /* replace SR1, FLAGS */ @@ -753,7 +747,7 @@ ASLOCAL(m88100_ignore_data_exception) * * We just want to jump to "badaddr__return_nonzero" below. * - * We don't worry about trashing R2 here because we're + * We don't worry about trashing r2 here because we're * jumping back to the function badaddr() where we're allowed * to blast r2..r9 as we see fit. */ @@ -1010,8 +1004,8 @@ ASLOCAL(m88100_use_SR3_pcb) * Consequently, we never picked up a stack. Do so now. * R1 is currently free (saved in the exception frame pointed at by * r30) */ - or.u r1, r0, hi16(_C_LABEL(curpcb)) - ld r1, r1, lo16(_C_LABEL(curpcb)) + ldcr r1, CPU + ld r1, r1, CI_CURPCB addu r1, r1, USIZE - SIZEOF_EF st FLAGS,r1, REG_OFF(EF_FLAGS) /* store flags */ st r31, r1, GENREG_OFF(31) /* store r31 - now free */ @@ -1038,8 +1032,8 @@ ASLOCAL(m88100_pickup_stack) stcr r31, SR3 /* save previous r31 */ /* switch to the process kernel stack. */ - or.u r31, r0, hi16(_C_LABEL(curpcb)) - ld r31, r31, lo16(_C_LABEL(curpcb)) + ldcr r31, CPU + ld r31, r31, CI_CURPCB addu r31, r31, PCB_USER_STATE /* point to user save area */ /* @@ -1082,8 +1076,8 @@ ASLOCAL(m88100_have_pcb) st TMP3, r31, REG_OFF(EF_SNIP) ldcr TMP2, SFIP st TMP2, r31, REG_OFF(EF_SFIP) - /* get and store the cpu number */ - extu TMP, FLAGS, FLAG_CPU_FIELD_WIDTH<0> /* TMP = cpu# */ + /* get and store the cpu_info pointer */ + ldcr TMP, CPU st TMP, r31, REG_OFF(EF_CPU) /* @@ -1531,8 +1525,8 @@ ASLOCAL(m88100_fpu_enable) ld r2, r31, REG_OFF(EF_EPSR) bb1 PSR_SUPERVISOR_MODE_BIT, r2, 1f /* if in kernel mode */ - or.u r31, r0, hi16(_C_LABEL(curpcb)) - ld r31, r31, lo16(_C_LABEL(curpcb)) + ldcr r31, CPU + ld r31, r31, CI_CURPCB addu r31, r31, USIZE /* point at proper end */ 1: @@ -1707,8 +1701,8 @@ ASLOCAL(no_softint) ld r2, FPTR, REG_OFF(EF_EPSR) bb1 PSR_SUPERVISOR_MODE_BIT, r2, _ASM_LABEL(no_ast) - or.u r2, r0, hi16(_C_LABEL(curproc)) - ld r3, r2, lo16(_C_LABEL(curproc)) + ldcr r2, CPU + ld r3, r2, CI_CURPROC bcnd.n eq0, r3, _ASM_LABEL(no_ast) /* no AST if no process! */ ld r2, r3, P_ASTPENDING bcnd.n eq0, r3, _ASM_LABEL(no_ast) /* .n safe since the first @@ -2020,7 +2014,6 @@ GLOBAL(m88110_error_handler) GLOBAL(m88110_reset_handler) or r29, r0, 0 1: - /* pick up the slavestack */ or r26, r0, r31 /* save old stack */ or.u r31, r0, hi16(_ASM_LABEL(intstack_end)) or r31, r31, lo16(_ASM_LABEL(intstack_end)) @@ -2269,8 +2262,8 @@ ASLOCAL(m88110_use_SR3_pcb) * R1 is currently free (saved in the exception frame pointed at by * r30) */ - or.u r1, r0, hi16(_C_LABEL(curpcb)) - ld r1, r1, lo16(_C_LABEL(curpcb)) + ldcr r1, CPU + ld r1, r1, CI_CURPCB addu r1, r1, USIZE - SIZEOF_EF st FLAGS,r1, REG_OFF(EF_FLAGS) /* store flags */ st r31, r1, GENREG_OFF(31) /* store r31 - now free */ @@ -2298,8 +2291,8 @@ ASLOCAL(m88110_pickup_stack) stcr r31, SR3 /* save previous r31 */ /* switch to the process kernel stack. */ - or.u r31, r0, hi16(_C_LABEL(curpcb)) - ld r31, r31, lo16(_C_LABEL(curpcb)) + ldcr r31, CPU + ld r31, r31, CI_CURPCB addu r31, r31, PCB_USER_STATE /* point to user save area */ /* @@ -2343,8 +2336,8 @@ ASLOCAL(m88110_have_pcb) st TMP2, r31, REG_OFF(EF_EXIP) st TMP3, r31, REG_OFF(EF_ENIP) - /* get and store the cpu number */ - extu TMP, FLAGS, FLAG_CPU_FIELD_WIDTH<0> /* TMP = cpu# */ + /* get and store the cpu_info pointer */ + ldcr TMP, CPU st TMP, r31, REG_OFF(EF_CPU) /* @@ -2533,8 +2526,8 @@ ASLOCAL(m88110_fpu_enable) ld r2, r31, REG_OFF(EF_EPSR) bb1 PSR_SUPERVISOR_MODE_BIT, r2, 1f /* if in kernel mode */ - or.u r31, r0, hi16(_C_LABEL(curpcb)) - ld r31, r31, lo16(_C_LABEL(curpcb)) + ldcr r31, CPU + ld r31, r31, CI_CURPCB addu r31, r31, USIZE /* point at proper end */ 1: diff --git a/sys/arch/m88k/m88k/genassym.cf b/sys/arch/m88k/m88k/genassym.cf index 41ef2f83384..8e7b869bdb1 100644 --- a/sys/arch/m88k/m88k/genassym.cf +++ b/sys/arch/m88k/m88k/genassym.cf @@ -1,4 +1,4 @@ -# $OpenBSD: genassym.cf,v 1.3 2005/11/28 22:21:15 miod Exp $ +# $OpenBSD: genassym.cf,v 1.4 2005/12/03 14:30:06 miod Exp $ # # Copyright (c) 1982, 1990 The Regents of the University of California. # All rights reserved. @@ -28,7 +28,7 @@ # SUCH DAMAGE. # # @(#)genassym.c 7.8 (Berkeley) 5/7/91 -# $Id: genassym.cf,v 1.3 2005/11/28 22:21:15 miod Exp $ +# $Id: genassym.cf,v 1.4 2005/12/03 14:30:06 miod Exp $ # include <sys/param.h> @@ -37,10 +37,12 @@ include <sys/time.h> include <sys/proc.h> include <sys/mbuf.h> include <sys/msgbuf.h> + include <machine/cpu.h> include <machine/trap.h> include <machine/psl.h> include <machine/vmparam.h> + include <sys/syscall.h> include <sys/user.h> @@ -56,8 +58,19 @@ member P_ASTPENDING p_md.md_astpending export SRUN export SONPROC +# cpu fields +struct cpu_info +member ci_curproc +member ci_curpcb +member ci_cpuid +member ci_primary +member ci_idle_pcb +member ci_want_resched + # general constants export UPAGES +# We export USPACE under another name to allow C code to include "assym.h". +#export USPACE define USIZE USPACE # pcb fields diff --git a/sys/arch/m88k/m88k/m88k_machdep.c b/sys/arch/m88k/m88k/m88k_machdep.c index 0c9b6d2fdc9..3f815e42736 100644 --- a/sys/arch/m88k/m88k/m88k_machdep.c +++ b/sys/arch/m88k/m88k/m88k_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: m88k_machdep.c,v 1.9 2005/11/28 22:22:55 miod Exp $ */ +/* $OpenBSD: m88k_machdep.c,v 1.10 2005/12/03 14:30:06 miod Exp $ */ /* * Copyright (c) 1998, 1999, 2000, 2001 Steve Murphree, Jr. * Copyright (c) 1996 Nivas Madhur @@ -53,8 +53,10 @@ #include <sys/exec.h> #include <sys/errno.h> +#include <machine/asm_macro.h> #include <machine/cmmu.h> #include <machine/cpu.h> +#include <machine/locore.h> #include <machine/reg.h> #ifdef M88100 #include <machine/m88100.h> @@ -73,9 +75,26 @@ void regdump(struct trapframe *f); void dumpsys(void); void dumpconf(void); -int longformat = 1; /* for regdump() */ +/* + * CMMU and CPU variables + */ -int intrdepth; +#ifdef MULTIPROCESSOR +cpuid_t master_cpu; +#endif + +struct cpu_info m88k_cpus[MAX_CPUS]; +u_int max_cpus; + +struct cmmu_p *cmmu; + +/* + * This lock protects the cmmu SAR and SCR's; other ports + * can be accessed without locking it. + */ +struct simplelock cmmu_cpu_lock; + +int longformat = 1; /* for regdump() */ /* * safepri is a safe priority for sleep to set for a spin-wait @@ -279,7 +298,7 @@ regdump(struct trapframe *f) f->tf_fphs2, f->tf_fpls2); printf("fppt %x fprh %x fprl %x fpit %x\n", f->tf_fppt, f->tf_fprh, f->tf_fprl, f->tf_fpit); - printf("vector %d mask %x mode %x scratch1 %x cpu %x\n", + printf("vector %d mask %x mode %x scratch1 %x cpu %p\n", f->tf_vector, f->tf_mask, f->tf_mode, f->tf_scratch1, f->tf_cpu); } @@ -292,9 +311,39 @@ regdump(struct trapframe *f) f->tf_dsap, f->tf_duap, f->tf_dsr, f->tf_dlar, f->tf_dpar); printf("isap %x iuap %x isr %x ilar %x ipar %x\n", f->tf_isap, f->tf_iuap, f->tf_isr, f->tf_ilar, f->tf_ipar); - printf("vector %d mask %x mode %x scratch1 %x cpu %x\n", + printf("vector %d mask %x mode %x scratch1 %x cpu %p\n", f->tf_vector, f->tf_mask, f->tf_mode, f->tf_scratch1, f->tf_cpu); } #endif } + +/* + * Set up the cpu_info pointer and the cpu number for the current processor. + */ +void +set_cpu_number(cpuid_t number) +{ + struct cpu_info *ci; + extern struct pcb idle_u; + +#ifdef MULTIPROCESSOR + ci = &m88k_cpus[number]; +#else + ci = &m88k_cpus[0]; +#endif + ci->ci_cpuid = number; + + __asm__ __volatile__ ("stcr %0, cr17" :: "r" (ci)); + flush_pipeline(); + +#ifdef MULTIPROCESSOR + if (number == master_cpu) +#endif + { + ci->ci_primary = 1; + ci->ci_idle_pcb = &idle_u; + } + + ci->ci_alive = 1; +} diff --git a/sys/arch/m88k/m88k/pmap.c b/sys/arch/m88k/m88k/pmap.c index 96afc0d2b02..52fdd4ef852 100644 --- a/sys/arch/m88k/m88k/pmap.c +++ b/sys/arch/m88k/m88k/pmap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pmap.c,v 1.17 2005/12/01 22:24:52 miod Exp $ */ +/* $OpenBSD: pmap.c,v 1.18 2005/12/03 14:30:06 miod Exp $ */ /* * Copyright (c) 2001-2004, Miodrag Vallat * Copyright (c) 1998-2001 Steve Murphree, Jr. @@ -203,31 +203,30 @@ boolean_t pmap_testbit(struct vm_page *, int); * va virtual address that should be flushed * kernel TRUE if supervisor mode, FALSE if user mode */ -static __inline__ void +static +#ifndef MULTIPROCESSOR +__inline__ +#endif +void flush_atc_entry(long users, vaddr_t va, boolean_t kernel) { -#if defined(MULTIPROCESSOR) +#ifdef MULTIPROCESSOR int cpu; if (users == 0) return; -#ifdef DEBUG - if (ff1(users) >= MAX_CPUS) { - panic("flush_atc_entry: invalid ff1 users = %d", ff1(users)); - } -#endif - while ((cpu = ff1(users)) != 32) { - if (cpu_sets[cpu]) { /* just checking to make sure */ +#ifdef DIAGNOSTIC + if (m88k_cpus[cpu].ci_alive) +#endif cmmu_flush_tlb(cpu, kernel, va, 1); - } - users &= ~(1 << cpu); + users ^= 1 << cpu; } -#else +#else /* MULTIPROCESSOR */ if (users != 0) cmmu_flush_tlb(cpu_number(), kernel, va, 1); -#endif +#endif /* MULTIPROCESSOR */ } /* @@ -448,7 +447,7 @@ pmap_cache_ctrl(pmap_t pmap, vaddr_t s, vaddr_t e, u_int mode) vaddr_t va; paddr_t pa; boolean_t kflush; - int cpu; + cpuid_t cpu; u_int users; #ifdef DEBUG @@ -489,8 +488,12 @@ pmap_cache_ctrl(pmap_t pmap, vaddr_t s, vaddr_t e, u_int mode) * Data cache should be copied back and invalidated. */ pa = ptoa(PG_PFNUM(*pte)); +#ifdef MULTIPROCESSOR for (cpu = 0; cpu < MAX_CPUS; cpu++) - if (cpu_sets[cpu]) + if (m88k_cpus[cpu].ci_alive != 0) +#else + cpu = cpu_number(); +#endif cmmu_flush_cache(cpu, pa, PAGE_SIZE); } PMAP_UNLOCK(pmap, spl); @@ -543,6 +546,9 @@ pmap_bootstrap(vaddr_t load_start) paddr_t s_text, e_text, kpdt_phys; unsigned int kernel_pmap_size, pdt_size; int i; +#ifndef MULTIPROCESSOR + cpuid_t cpu; +#endif pmap_table_t ptable; extern void *etext; @@ -724,17 +730,19 @@ pmap_bootstrap(vaddr_t load_start) CACHE_GLOBAL | CACHE_WT | APR_V; /* Invalidate entire kernel TLB and get ready for address translation */ - for (i = 0; i < MAX_CPUS; i++) - if (cpu_sets[i]) { - cmmu_flush_tlb(i, TRUE, VM_MIN_KERNEL_ADDRESS, - btoc(VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS)); - /* Load supervisor pointer to segment table. */ - cmmu_set_sapr(i, kernel_pmap->pm_apr); +#ifdef MULTIPROCESSOR + pmap_bootstrap_cpu(cpu_number()); +#else + cpu = cpu_number(); + cmmu_flush_tlb(cpu, TRUE, VM_MIN_KERNEL_ADDRESS, + btoc(VM_MAX_KERNEL_ADDRESS - VM_MIN_KERNEL_ADDRESS)); + /* Load supervisor pointer to segment table. */ + cmmu_set_sapr(cpu, kernel_pmap->pm_apr); #ifdef DEBUG - printf("cpu%d: running virtual\n", i); + printf("cpu%d: running virtual\n", cpu); #endif - SETBIT_CPUSET(i, &kernel_pmap->pm_cpus); - } + SETBIT_CPUSET(cpu, &kernel_pmap->pm_cpus); +#endif /* MULTIPROCESSOR */ } /* diff --git a/sys/arch/m88k/m88k/process.S b/sys/arch/m88k/m88k/process.S index 5b3b139e343..fc60307c3ae 100644 --- a/sys/arch/m88k/m88k/process.S +++ b/sys/arch/m88k/m88k/process.S @@ -1,4 +1,4 @@ -/* $OpenBSD: process.S,v 1.10 2005/11/27 11:06:15 miod Exp $ */ +/* $OpenBSD: process.S,v 1.11 2005/12/03 14:30:06 miod Exp $ */ /* * Copyright (c) 1996 Nivas Madhur * All rights reserved. @@ -70,19 +70,17 @@ ASLOCAL(Lswsrunpanic) ENTRY(switch_exit) /* * Change pcb to idle u. area, i.e., set r31 to top of stack - * and set curpcb to point to _idle_u. + * and set curpcb to point to the cpu's idle stack. * r2 contains proc *p. */ - or.u r30, r0, hi16(_C_LABEL(idle_u)) - or r30, r30,lo16(_C_LABEL(idle_u)) - addu r31, r30, USIZE /* now on idle_u stack */ - or.u r10, r0, hi16(_C_LABEL(curpcb)) - st r30, r10,lo16(_C_LABEL(curpcb)) /* curpcb = &idle_u */ + ldcr r10, CPU + ld r30, r10, CI_IDLE_PCB + addu r31, r30, USIZE /* now on idle stack */ + st r30, r10, CI_CURPCB /* curpcb = idle_pcb */ /* Schedule the vmspace and stack to be freed. */ - or.u r10, r0, hi16(_C_LABEL(curproc)) bsr.n _C_LABEL(exit2) - st r0, r10, lo16(_C_LABEL(curproc)) /* curproc = NULL */ + st r0, r10, CI_CURPROC /* curproc = NULL */ /* * exit2() has acquired the scheduler lock for us. Jump into @@ -96,20 +94,24 @@ ENTRY(switch_exit) * * Find a runnable process and switch to it. On entry, the scheduler lock is * held; it has to be released before returning to the process. + * + * Note that this code ignores its proc parameter and assumes it has the + * same value as curproc. This may change in mi_switch() in the future, + * be careful. */ ENTRY(cpu_switch) /* * Save state of previous process in its pcb, and pmap_deactivate() * the process. */ - or.u r2, r0, hi16(_C_LABEL(curpcb)) - ld r2, r2, lo16(_C_LABEL(curpcb)) - st r1, r2, PCB_PC /* save return address */ + ldcr r2, CPU + ld r2, r2, CI_CURPCB + st r1, r2, PCB_PC /* save return address */ bsr _ASM_LABEL(__savectx) /* note that we don't need to recover r1 at this point */ - or.u r11, r0, hi16(_C_LABEL(curproc)) - ld r2, r11, lo16(_C_LABEL(curproc)) + ldcr r11, CPU + ld r2, r11, CI_CURPROC /* * Note that we can still use curpcb as our stack after @@ -117,7 +119,7 @@ ENTRY(cpu_switch) * area mappings. */ bsr.n _C_LABEL(pmap_deactivate) - st r0, r11, lo16(_C_LABEL(curproc)) /* curproc = NULL */ + st r0, r11, CI_CURPROC /* curproc = NULL */ ASLOCAL(cpu_switch_search) /* @@ -206,62 +208,57 @@ ASLOCAL(cpu_switch_found) bb1 ne, r2, _ASM_LABEL(Lswsrunpanic) #endif - or.u r11, r0, hi16(_C_LABEL(want_resched)) - st r0, r11, lo16(_C_LABEL(want_resched)) /* clear want_resched */ + ldcr r11, CPU + st r0, r11, CI_WANT_RESCHED /* clear want_resched */ - or.u r11, r0, hi16(_C_LABEL(curproc)) - st r9, r11,lo16(_C_LABEL(curproc)) /* curproc = p */ - or r2, r0, SONPROC - st.b r2, r9, P_STAT + st r9, r11, CI_CURPROC /* curproc = p */ + or r2, r0, SONPROC + st.b r2, r9, P_STAT - /* r9 is curproc */ - st r0, r9, P_BACK /* p->p_back = 0 */ - ld r3, r9, P_ADDR - or.u r10, r0, hi16(_C_LABEL(curpcb)) - st r3, r10, lo16(_C_LABEL(curpcb)) /* curpcb = p->p_addr */ + ld r3, r9, P_ADDR + st r0, r9, P_BACK /* p->p_back = 0 */ + st r3, r11, CI_CURPCB /* curpcb = p->p_addr */ /* pmap_activate() the process' pmap */ - or r14, r0, r9 /* save p in r14 */ bsr.n _C_LABEL(pmap_activate) or r2, r0, r9 - or r9, r0, r14 /* restore p saved in r14 */ #if defined(MULTIPROCESSOR) || defined(LOCKDEBUG) bsr _C_LABEL(sched_unlock_idle) #endif - or.u r10, r0, hi16(_C_LABEL(curpcb)) - ld r10, r10, lo16(_C_LABEL(curpcb)) + ldcr r10, CPU + ld r10, r10, CI_CURPCB /* restore from the current context */ - ld r2, r10, PCB_FCR62 - ld r3, r10, PCB_FCR63 - fstcr r2, fcr62 - fstcr r3, fcr63 - ld r15,r10, PCB_R15 - ld r16,r10, PCB_R16 - ld r17,r10, PCB_R17 - ld r18,r10, PCB_R18 - ld r19,r10, PCB_R19 - ld r20,r10, PCB_R20 - ld r21,r10, PCB_R21 - ld r22,r10, PCB_R22 - ld r23,r10, PCB_R23 - ld r24,r10, PCB_R24 - ld r25,r10, PCB_R25 - ld r26,r10, PCB_R26 - ld r27,r10, PCB_R27 - ld r28,r10, PCB_R28 - ld r29,r10, PCB_R29 - or r14,r10, r0 /* preserve curpcb in a register... */ + ld r2, r10, PCB_FCR62 + ld r3, r10, PCB_FCR63 + fstcr r2, fcr62 + fstcr r3, fcr63 + ld r15, r10, PCB_R15 + ld r16, r10, PCB_R16 + ld r17, r10, PCB_R17 + ld r18, r10, PCB_R18 + ld r19, r10, PCB_R19 + ld r20, r10, PCB_R20 + ld r21, r10, PCB_R21 + ld r22, r10, PCB_R22 + ld r23, r10, PCB_R23 + ld r24, r10, PCB_R24 + ld r25, r10, PCB_R25 + ld r26, r10, PCB_R26 + ld r27, r10, PCB_R27 + ld r28, r10, PCB_R28 + ld r29, r10, PCB_R29 + or r14, r10, r0 /* preserve curpcb in a register... */ bsr.n _C_LABEL(setipl) - ld r2, r10, PCB_IPL /* restore interrupt mask */ - ld r1, r14, PCB_PC - ld r30,r14, PCB_R30 /* restore frame pointer & stack */ - ld r31,r14, PCB_SP + ld r2, r10, PCB_IPL /* restore interrupt mask */ + ld r1, r14, PCB_PC + ld r30, r14, PCB_R30 /* restore frame pointer & stack */ + ld r31, r14, PCB_SP jmp.n r1 - ld r14,r14, PCB_R14 + ld r14, r14, PCB_R14 /* * savectx(pcb) diff --git a/sys/arch/m88k/m88k/subr.S b/sys/arch/m88k/m88k/subr.S index 8a9d909e0d2..247190c49dd 100644 --- a/sys/arch/m88k/m88k/subr.S +++ b/sys/arch/m88k/m88k/subr.S @@ -1,4 +1,4 @@ -/* $OpenBSD: subr.S,v 1.8 2005/10/13 19:48:33 miod Exp $ */ +/* $OpenBSD: subr.S,v 1.9 2005/12/03 14:30:06 miod Exp $ */ /* * Mach Operating System * Copyright (c) 1993-1992 Carnegie Mellon University @@ -194,8 +194,8 @@ ENTRY(do_xmem_byte) /* do_xmem_byte(address, data, supervisor) */ ENTRY(copyin) /* set up fault handler */ - or.u r5, r0, hi16(_C_LABEL(curpcb)) - ld r6, r5, lo16(_C_LABEL(curpcb)) + ldcr r5, CPU + ld r6, r5, CI_CURPCB or.u r5, r0, hi16(_ASM_LABEL(Lciflt)) or r5, r5, lo16(_ASM_LABEL(Lciflt)) st r5, r6, PCB_ONFAULT /* pcb_onfault = Lciflt */ @@ -231,7 +231,7 @@ ASLOCAL(copyin_right_aligned_to_halfword) ASLOCAL(copyin_right_aligned_to_word) /* At this point, both SRC and DEST are aligned to a word */ - /* boundry, and LEN is an even multiple of 4. */ + /* boundary, and LEN is an even multiple of 4. */ bb1.n 2, LEN, _ASM_LABEL(copyin_right_align_to_doubleword) or r7, r0, 4 @@ -357,8 +357,8 @@ ASLOCAL(copyin_byte_only) or r2, r0, r0 /* successful return */ ASLOCAL(Lcidone) - or.u r5,r0,hi16(_C_LABEL(curpcb)) - ld r6,r5,lo16(_C_LABEL(curpcb)) + ldcr r5, CPU + ld r6, r5, CI_CURPCB jmp.n r1 st r0,r6,PCB_ONFAULT @@ -391,8 +391,8 @@ ASLOCAL(Lciflt) ENTRY(copyinstr) /* setup fault handler */ - or.u r6, r0, hi16(_C_LABEL(curpcb)) - ld r7, r6, lo16(_C_LABEL(curpcb)) + ldcr r6, CPU + ld r7, r6, CI_CURPCB or.u r6, r0, hi16(_ASM_LABEL(Lcisflt)) or r6, r6, lo16(_ASM_LABEL(Lcisflt)) st r6, r7, PCB_ONFAULT @@ -432,8 +432,8 @@ ASLOCAL(Lcisdone) bcnd eq0, LEN, 3f st r6, r0, LEN 3: - or.u r5,r0,hi16(_C_LABEL(curpcb)) - ld r6,r5,lo16(_C_LABEL(curpcb)) + ldcr r5, CPU + ld r6, r5, CI_CURPCB jmp.n r1 st r0,r6,PCB_ONFAULT /* clear the handler */ @@ -460,8 +460,8 @@ ASLOCAL(Lcisflt) ENTRY(copyout) /* setup fault handler */ - or.u r5, r0, hi16(_C_LABEL(curpcb)) - ld r6, r5, lo16(_C_LABEL(curpcb)) + ldcr r5, CPU + ld r6, r5, CI_CURPCB or.u r5, r0, hi16(_ASM_LABEL(Lcoflt)) or r5, r5, lo16(_ASM_LABEL(Lcoflt)) st r5, r6, PCB_ONFAULT /* pcb_onfault = Lcoflt */ @@ -496,7 +496,7 @@ ASLOCAL(copyout_right_aligned_to_word) /* * At this point, both SRC and DEST are aligned to a word - * boundry, and LEN is an even multiple of 4. + * boundary, and LEN is an even multiple of 4. */ bb1.n 2, LEN, _ASM_LABEL(copyout_right_align_to_doubleword) or r7, r0, 4 @@ -631,8 +631,8 @@ ASLOCAL(copyout_byte_only) or r2, r0, r0 /* successful return */ ASLOCAL(Lcodone) - or.u r5,r0,hi16(_C_LABEL(curpcb)) - ld r6,r5,lo16(_C_LABEL(curpcb)) + ldcr r5, CPU + ld r6, r5, CI_CURPCB jmp.n r1 st r0,r6,PCB_ONFAULT /* clear the handler */ @@ -662,8 +662,8 @@ ASLOCAL(Lcoflt) ENTRY(copyoutstr) /* setup fault handler */ - or.u r6, r0, hi16(_C_LABEL(curpcb)) - ld r7, r6, lo16(_C_LABEL(curpcb)) + ldcr r6, CPU + ld r7, r6, CI_CURPCB or.u r6, r0, hi16(_ASM_LABEL(Lcosflt)) or r6, r6, lo16(_ASM_LABEL(Lcosflt)) st r6, r7, PCB_ONFAULT @@ -698,8 +698,9 @@ ASLOCAL(Lcosflt) ASLOCAL(Lcosdone) bcnd eq0, LEN, 3f st r6, r0, LEN -3: or.u r5,r0,hi16(_C_LABEL(curpcb)) - ld r6,r5,lo16(_C_LABEL(curpcb)) +3: + ldcr r5, CPU + ld r6, r5, CI_CURPCB jmp.n r1 st r0,r6,PCB_ONFAULT /* clear the handler */ @@ -716,8 +717,8 @@ ASLOCAL(Lcosdone) * Copy len bytes from src to dst, aborting if we encounter a page fault. */ ENTRY(kcopy) - or.u r5, r0, hi16(_C_LABEL(curpcb)) - ld r6, r5, lo16(_C_LABEL(curpcb)) + ldcr r5, CPU + ld r6, r5, CI_CURPCB or.u r5, r0, hi16(_ASM_LABEL(kcopy_fault)) or r5, r5, lo16(_ASM_LABEL(kcopy_fault)) st r5, r6, PCB_ONFAULT /* pcb_onfault = kcopy_fault */ @@ -968,8 +969,8 @@ ASLOCAL(kr_byte_copy) ASLOCAL(kcopy_out) or r2, r0, 0 /* return success */ ASLOCAL(kcopy_out_fault) - or.u r5,r0,hi16(_C_LABEL(curpcb)) - ld r6,r5,lo16(_C_LABEL(curpcb)) + ldcr r5, CPU + ld r6, r5, CI_CURPCB st r0,r6,PCB_ONFAULT /* clear the handler */ jmp r1 /* all done, return to caller */ @@ -1548,54 +1549,6 @@ ENTRY(read_processor_identification_register) ldcr r2, PID /* - * void set_cpu_number(unsigned number); - * - * Sets the kernel cpu number for this cpu to the given value. - * - * Input: - * r1 return address - * r2 the number (should be 0, 1, 2, or 3). - * - * Other registers used: - * r3 temp - * r4 original PSR - * r5 temporary new PSR - */ -ENTRY(set_cpu_number) -#ifdef DEBUG - /* make sure the CPU number is valid */ - clr r3, r2, FLAG_CPU_FIELD_WIDTH<0> - bcnd ne0, r3, 1f /* bad cpu number */ -#endif - - /* going to change a control register -- disable interrupts */ - ldcr r4, PSR - set r5, r4, 1<PSR_INTERRUPT_DISABLE_BIT> - stcr r5, PSR - FLUSH_PIPELINE - - /* put in the cpu number */ - ldcr r3, SR1 /* get the flags */ - clr r3, r3, FLAG_CPU_FIELD_WIDTH<0> /* clean the slate */ - or r3, r3, r2 /* add the cpu number */ - stcr r3, SR1 /* put back */ - - /* put back the PSR to what it was before and return */ - stcr r4, PSR - FLUSH_PIPELINE - jmp r1 - -#ifdef DEBUG -1: /* bad cpu number*/ - or.u r2, r0, hi16(9f) - bsr.n _C_LABEL(panic) - or r2, r2, lo16(9f) - - data -9: string "set_cpu_number: bad CPU number %x\0" -#endif - -/* * Trampoline code. Gets copied to the top of * user stack in exec. */ diff --git a/sys/arch/m88k/m88k/trap.c b/sys/arch/m88k/m88k/trap.c index 6eeec2a197c..bfcda591eb7 100644 --- a/sys/arch/m88k/m88k/trap.c +++ b/sys/arch/m88k/m88k/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.24 2005/12/01 22:24:52 miod Exp $ */ +/* $OpenBSD: trap.c,v 1.25 2005/12/03 14:30:06 miod Exp $ */ /* * Copyright (c) 2004, Miodrag Vallat. * Copyright (c) 1998 Steve Murphree, Jr. @@ -122,13 +122,14 @@ static inline void userret(struct proc *p, struct trapframe *frame, u_quad_t oticks) { int sig; + struct cpu_info *cpu = curcpu(); /* take pending signals */ while ((sig = CURSIG(p)) != 0) postsig(sig); p->p_priority = p->p_usrpri; - if (want_resched) { + if (cpu->ci_want_resched) { /* * We're being preempted. */ @@ -146,7 +147,7 @@ userret(struct proc *p, struct trapframe *frame, u_quad_t oticks) addupc_task(p, frame->tf_sxip & XIP_ADDR, (int)(p->p_sticks - oticks) * psratio); } - curpriority = p->p_priority; + cpu->ci_schedstate.spc_curpriority = p->p_priority; } __dead void @@ -260,9 +261,9 @@ m88100_trap(unsigned type, struct trapframe *frame) /* This function pointer is set in machdep.c It calls m188_ext_int or sbc_ext_int depending on the value of brdtyp - smurph */ - intrdepth++; + curcpu()->ci_intrdepth++; md_interrupt_func(T_INT, frame); - intrdepth--; + curcpu()->ci_intrdepth--; return; case T_MISALGNFLT: @@ -277,7 +278,7 @@ m88100_trap(unsigned type, struct trapframe *frame) */ #ifdef TRAPDEBUG pbus_type = CMMU_PFSR_FAULT(frame->tf_ipfsr); - printf("Kernel Instruction fault #%d (%s) v = 0x%x, frame 0x%x cpu %d\n", + printf("Kernel Instruction fault #%d (%s) v = 0x%x, frame 0x%x cpu %p\n", pbus_type, pbus_exception_type[pbus_type], fault_addr, frame, frame->tf_cpu); #endif @@ -312,7 +313,7 @@ m88100_trap(unsigned type, struct trapframe *frame) pbus_type = CMMU_PFSR_FAULT(frame->tf_dpfsr); #ifdef TRAPDEBUG - printf("Kernel Data access fault #%d (%s) v = 0x%x, frame 0x%x cpu %d\n", + printf("Kernel Data access fault #%d (%s) v = 0x%x, frame 0x%x cpu %p\n", pbus_type, pbus_exception_type[pbus_type], fault_addr, frame, frame->tf_cpu); #endif @@ -362,7 +363,7 @@ user_fault: if (type == T_INSTFLT + T_USER) { pbus_type = CMMU_PFSR_FAULT(frame->tf_ipfsr); #ifdef TRAPDEBUG - printf("User Instruction fault #%d (%s) v = 0x%x, frame 0x%x cpu %d\n", + printf("User Instruction fault #%d (%s) v = 0x%x, frame 0x%x cpu %p\n", pbus_type, pbus_exception_type[pbus_type], fault_addr, frame, frame->tf_cpu); #endif @@ -370,7 +371,7 @@ user_fault: fault_addr = frame->tf_dma0; pbus_type = CMMU_PFSR_FAULT(frame->tf_dpfsr); #ifdef TRAPDEBUG - printf("User Data access fault #%d (%s) v = 0x%x, frame 0x%x cpu %d\n", + printf("User Data access fault #%d (%s) v = 0x%x, frame 0x%x cpu %p\n", pbus_type, pbus_exception_type[pbus_type], fault_addr, frame, frame->tf_cpu); #endif @@ -695,15 +696,15 @@ m88110_trap(unsigned type, struct trapframe *frame) break; case T_NON_MASK: case T_NON_MASK+T_USER: - intrdepth++; + curcpu()->ci_intrdepth++; md_interrupt_func(T_NON_MASK, frame); - intrdepth--; + curcpu()->ci_intrdepth--; return; case T_INT: case T_INT+T_USER: - intrdepth++; + curcpu()->ci_intrdepth++; md_interrupt_func(T_INT, frame); - intrdepth--; + curcpu()->ci_intrdepth--; return; case T_MISALGNFLT: printf("kernel mode misaligned access exception @ 0x%08x\n", @@ -1102,9 +1103,6 @@ m88100_syscall(register_t code, struct trapframe *tf) int error; register_t args[11], rval[2], *ap; u_quad_t sticks; -#ifdef DIAGNOSTIC - extern struct pcb *curpcb; -#endif uvmexp.syscalls++; @@ -1263,9 +1261,6 @@ m88110_syscall(register_t code, struct trapframe *tf) int error; register_t args[11], rval[2], *ap; u_quad_t sticks; -#ifdef DIAGNOSTIC - extern struct pcb *curpcb; -#endif uvmexp.syscalls++; diff --git a/sys/arch/m88k/m88k/vm_machdep.c b/sys/arch/m88k/m88k/vm_machdep.c index 6baa75f7f4d..d1e761062bb 100644 --- a/sys/arch/m88k/m88k/vm_machdep.c +++ b/sys/arch/m88k/m88k/vm_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vm_machdep.c,v 1.7 2005/10/13 19:48:33 miod Exp $ */ +/* $OpenBSD: vm_machdep.c,v 1.8 2005/12/03 14:30:06 miod Exp $ */ /* * Copyright (c) 1998 Steve Murphree, Jr. @@ -88,7 +88,6 @@ cpu_fork(p1, p2, stack, stacksize, func, arg) void (*func)(void *); void *proc; } *ksfp; - extern struct pcb *curpcb; extern void proc_trampoline(void); /* Copy pcb from p1 to p2. */ @@ -202,26 +201,7 @@ cpu_coredump(p, vp, cred, chdr) } /* - * Map an IO request into kernel virtual address space. Requests fall into - * one of five catagories: - * - * B_PHYS|B_UAREA: User u-area swap. - * Address is relative to start of u-area (p_addr). - * B_PHYS|B_PAGET: User page table swap. - * Address is a kernel VA in usrpt (Usrptmap). - * B_PHYS|B_DIRTY: Dirty page push. - * Address is a VA in proc2's address space. - * B_PHYS|B_PGIN: Kernel pagein of user pages. - * Address is VA in user's address space. - * B_PHYS: User "raw" IO request. - * Address is VA in user's address space. - * - * All requests are (re)mapped into kernel VA space via phys_map - * - * XXX we allocate KVA space by using kmem_alloc_wait which we know - * allocates space without backing physical memory. This implementation - * is a total crock, the multiple mappings of these physical pages should - * be reflected in the higher-level VM structures to avoid problems. + * Map an IO request into kernel virtual address space via phys_map. */ void vmapbuf(bp, len) diff --git a/sys/arch/mvme88k/include/locore.h b/sys/arch/mvme88k/include/locore.h index a9485069234..d73a4e53f2a 100644 --- a/sys/arch/mvme88k/include/locore.h +++ b/sys/arch/mvme88k/include/locore.h @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.h,v 1.28 2005/09/13 19:12:21 miod Exp $ */ +/* $OpenBSD: locore.h,v 1.29 2005/12/03 14:30:06 miod Exp $ */ #ifndef _MACHINE_LOCORE_H_ #define _MACHINE_LOCORE_H_ @@ -12,17 +12,14 @@ unsigned read_processor_identification_register(void); int badaddr(vaddr_t addr, int size); #define badwordaddr(x) badaddr(x, 4) -void set_cpu_number(unsigned number); void doboot(void); -/* locore_c_routines.c */ - -unsigned getipl(void); - /* machdep.c */ +unsigned getipl(void); int intr_findvec(int, int, int); -void myetheraddr(u_char *cp); +void myetheraddr(u_char *); +void set_cpu_number(cpuid_t); extern volatile u_int8_t *ivec[]; diff --git a/sys/arch/mvme88k/mvme88k/eh.S b/sys/arch/mvme88k/mvme88k/eh.S index 0f0ebe8967f..dd0d2041331 100644 --- a/sys/arch/mvme88k/mvme88k/eh.S +++ b/sys/arch/mvme88k/mvme88k/eh.S @@ -1,4 +1,4 @@ -/* $OpenBSD: eh.S,v 1.62 2004/08/05 21:34:11 miod Exp $ */ +/* $OpenBSD: eh.S,v 1.63 2005/12/03 14:30:06 miod Exp $ */ /* * Mach Operating System * Copyright (c) 1993-1991 Carnegie Mellon University @@ -94,8 +94,9 @@ ASLOCAL(pfsr188) or.u TMP, r0, hi16(_C_LABEL(cmmu_shift)) ld TMP, TMP, lo16(_C_LABEL(cmmu_shift)) cmp TMP2, TMP, 2 + ldcr TMP, CPU bb1.n lt, TMP2, _ASM_LABEL(pfsr188_straight) - extu TMP, FLAGS, FLAG_CPU_FIELD_WIDTH<0> /* TMP = cpu# */ + ld TMP, TMP, CI_CPUID /* TMP = cpu# */ bb1 eq, TMP2, _ASM_LABEL(pfsr188_double) ASLOCAL(pfsr188_quad) diff --git a/sys/arch/mvme88k/mvme88k/locore.S b/sys/arch/mvme88k/mvme88k/locore.S index 28eb135208f..3fc6f43e4f2 100644 --- a/sys/arch/mvme88k/mvme88k/locore.S +++ b/sys/arch/mvme88k/mvme88k/locore.S @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.S,v 1.43 2005/10/12 19:32:19 miod Exp $ */ +/* $OpenBSD: locore.S,v 1.44 2005/12/03 14:30:06 miod Exp $ */ /* * Copyright (c) 1998 Steve Murphree, Jr. * Copyright (c) 1996 Nivas Madhur @@ -197,12 +197,12 @@ GLOBAL(start_text) * The manual says not to disable interrupts and freeze shadowing * at the same time because interrupts are not actually disabled * until after the next instruction. Well, if an interrupt - * occurs now, we're in deep anyway, so I'm going to do + * occurs now, we're in deep trouble anyway, so I'm going to do * the two together. * * Upon a reset (or poweron, I guess), the PSR indicates: * supervisor mode - * interrupts, shadowing, FPU, missaligned exception: all disabled + * interrupts, shadowing, FPU, misaligned exception: all disabled * * We'll just construct our own turning on what we want. * @@ -213,7 +213,6 @@ GLOBAL(start_text) bb1 eq, r2, 1f /* if it's a 'mc88110, skip SSBR */ stcr r0, SSBR /* clear this for later */ 1: - stcr r0, SR0 /* clear "current thread" */ stcr r0, SR1 /* clear the CPU flags */ set r11, r0, 1<PSR_SUPERVISOR_MODE_BIT> @@ -319,7 +318,6 @@ ASLOCAL(master_start) */ or.u r31, r0, hi16(_ASM_LABEL(intstack_end)) or r31, r31, lo16(_ASM_LABEL(intstack_end)) - clr r31, r31, 3<0> /* round down to 8-byte boundary */ #ifdef M88110 #ifdef M88100 @@ -349,8 +347,8 @@ ASLOCAL(master_start) /* * ...and we can switch to the u area stack now. */ - or.u r10, r0, hi16(_C_LABEL(curpcb)) - ld r31, r10,lo16(_C_LABEL(curpcb)) + ldcr r10, CPU + ld r31, r10, CI_CURPCB addu r31, r31, USIZE /* call main() - no arguments although main() still defines one */ @@ -417,12 +415,6 @@ GLOBAL(spin_cpu) * The processor loops (busy waits) for the given number of microseconds: * Thus, delay(1000000) will delay for one second. * (originally from Mach 2.5) - * - * REGISTER USAGE: - * IN r1 - return address - * IN r2 - number of microseconds - * r3 - cpu speed in MHz - * r4 - number of cycles to delay */ GLOBAL(m188_delay) or.u r3, r0, hi16(_cpuspeed) @@ -447,7 +439,7 @@ GLOBAL(kernel_sdt) /* SDT (segment descriptor table */ .align NBPG GLOBAL(intstack) - space INTSTACK_SIZE /* 16K, just to be safe */ + space USIZE ASGLOBAL(intstack_end) ASGLOBAL(slavestack) space NBPG /* 4K, small, interim stack */ @@ -464,7 +456,7 @@ ASGLOBAL(slavestack_end) */ .align NBPG GLOBAL(idle_u) - space UPAGES * NBPG + space USIZE /* * Process 0's u. @@ -474,6 +466,8 @@ GLOBAL(idle_u) .align NBPG ASLOCAL(u0) space UPAGES * NBPG +GLOBAL(proc0paddr) + word _ASM_LABEL(u0) /* KVA of proc0 uarea */ GLOBAL(ret_addr) word 0 @@ -489,21 +483,8 @@ ASLOCAL(master_processor_chosen) /* XMEM spin lock -- controls access to master_processor_chosen */ ASLOCAL(inter_processor_lock) word 0 + #if defined(DDB) || NKSYMS > 0 GLOBAL(esym) word 0 #endif /* DDB || NKSYMS > 0 */ -GLOBAL(proc0paddr) - word _ASM_LABEL(u0) /* KVA of proc0 uarea */ - -/* - * curpcb points to the current pcb (and hence u. area). - * Initially this is the special one. - */ -/* - * pcb is composed of kernel state + user state - * I may have to change curpcb to u0 + PCB_USER based on what - * other parts expect XXX nivas - */ -GLOBAL(curpcb) - word _ASM_LABEL(u0) /* curpcb = &u0 */ diff --git a/sys/arch/mvme88k/mvme88k/m188_machdep.c b/sys/arch/mvme88k/mvme88k/m188_machdep.c index a64c3560b3a..5478fbe535c 100644 --- a/sys/arch/mvme88k/mvme88k/m188_machdep.c +++ b/sys/arch/mvme88k/mvme88k/m188_machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: m188_machdep.c,v 1.10 2005/10/13 19:48:36 miod Exp $ */ +/* $OpenBSD: m188_machdep.c,v 1.11 2005/12/03 14:30:06 miod Exp $ */ /* * Copyright (c) 1998, 1999, 2000, 2001 Steve Murphree, Jr. * Copyright (c) 1996 Nivas Madhur @@ -241,8 +241,10 @@ m188_setipl(u_int level) curspl = m188_curspl[cpu]; mask = int_mask_val[level]; +#ifdef MULTIPROCESSOR if (cpu != master_cpu) mask &= SLAVE_MASK; +#endif *int_mask_reg[cpu] = mask; m188_curspl[cpu] = level; @@ -259,8 +261,10 @@ m188_raiseipl(u_int level) curspl = m188_curspl[cpu]; if (curspl < level) { mask = int_mask_val[level]; +#ifdef MULTIPROCESSOR if (cpu != master_cpu) mask &= SLAVE_MASK; +#endif *int_mask_reg[cpu] = mask; m188_curspl[cpu] = level; diff --git a/sys/arch/mvme88k/mvme88k/m88110.c b/sys/arch/mvme88k/mvme88k/m88110.c index 884e6e97cde..e4d8726e9b4 100644 --- a/sys/arch/mvme88k/mvme88k/m88110.c +++ b/sys/arch/mvme88k/mvme88k/m88110.c @@ -1,4 +1,4 @@ -/* $OpenBSD: m88110.c,v 1.28 2005/12/02 21:16:45 miod Exp $ */ +/* $OpenBSD: m88110.c,v 1.29 2005/12/03 14:30:06 miod Exp $ */ /* * Copyright (c) 1998 Steve Murphree, Jr. * All rights reserved. @@ -189,7 +189,6 @@ m88110_setup_board_config(void) { /* we could print something here... */ max_cpus = 1; - cpu_sets[0] = 1; /* This cpu installed... */ } /* diff --git a/sys/arch/mvme88k/mvme88k/m8820x.c b/sys/arch/mvme88k/mvme88k/m8820x.c index 180f743b5da..8183d3cf4a0 100644 --- a/sys/arch/mvme88k/mvme88k/m8820x.c +++ b/sys/arch/mvme88k/mvme88k/m8820x.c @@ -1,4 +1,4 @@ -/* $OpenBSD: m8820x.c,v 1.43 2005/12/02 21:16:45 miod Exp $ */ +/* $OpenBSD: m8820x.c,v 1.44 2005/12/03 14:30:06 miod Exp $ */ /* * Copyright (c) 2004, Miodrag Vallat. * @@ -90,7 +90,6 @@ m8820x_setup_board_config() u_int32_t whoami; #endif - master_cpu = 0; /* temp to get things going */ switch (brdtyp) { #ifdef MVME187 case BRD_187: @@ -162,7 +161,6 @@ m8820x_setup_board_config() for (num = 0; num < max_cpus; num++) { int type; - cpu_sets[num] = 1; /* This cpu installed... */ type = CMMU_TYPE(m8820x_cmmu[num << cmmu_shift]. cmmu_regs[CMMU_IDR]); diff --git a/sys/arch/mvme88k/mvme88k/machdep.c b/sys/arch/mvme88k/mvme88k/machdep.c index 3cfc4e5798f..f02827d9703 100644 --- a/sys/arch/mvme88k/mvme88k/machdep.c +++ b/sys/arch/mvme88k/mvme88k/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.170 2005/11/28 22:21:16 miod Exp $ */ +/* $OpenBSD: machdep.c,v 1.171 2005/12/03 14:30:06 miod Exp $ */ /* * Copyright (c) 1998, 1999, 2000, 2001 Steve Murphree, Jr. * Copyright (c) 1996 Nivas Madhur @@ -141,7 +141,6 @@ volatile u_int8_t *ivec[8]; #endif int ssir; -int want_resched; int physmem; /* available physical memory, in pages */ @@ -203,7 +202,6 @@ vaddr_t last_addr; vaddr_t avail_start, avail_end; vaddr_t virtual_avail, virtual_end; -extern struct pcb *curpcb; extern struct user *proc0paddr; /* @@ -1032,18 +1030,10 @@ mvme_bootstrap() { extern int kernelstart; extern struct consdev *cn_tab; - struct mvmeprom_brdid brdid; - - /* - * Must initialize p_addr before autoconfig or - * the fault handler will get a NULL reference. - * Do this early so that we can take a data or - * instruction fault and survive it. - */ - proc0.p_addr = proc0paddr; - curproc = &proc0; - curpcb = &proc0paddr->u_pcb; +#ifndef MULTIPROCESSOR + u_int master_cpu; +#endif buginit(); bugbrdid(&brdid); @@ -1111,6 +1101,16 @@ mvme_bootstrap() set_cpu_number(master_cpu); /* + * Now that set_cpu_number() set us with a valid cpu_info pointer, + * we need to initialize p_addr and curpcb before autoconf, for the + * fault handler to behave properly [except for badaddr() faults, + * which can be taken care of without a valid curcpu()]. + */ + proc0.p_addr = proc0paddr; + curproc = &proc0; + curpcb = &proc0paddr->u_pcb; + + /* * If we have more than one CPU, mention which one is the master. * We will also want to spin up slave CPUs on the long run... */ |