summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/sun3/sun3/locore.s636
1 files changed, 177 insertions, 459 deletions
diff --git a/sys/arch/sun3/sun3/locore.s b/sys/arch/sun3/sun3/locore.s
index 13ae9b105e4..4b30b461a8a 100644
--- a/sys/arch/sun3/sun3/locore.s
+++ b/sys/arch/sun3/sun3/locore.s
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.s,v 1.19 2000/06/05 11:03:04 art Exp $ */
+/* $OpenBSD: locore.s,v 1.20 2000/07/14 14:28:11 miod Exp $ */
/* $NetBSD: locore.s,v 1.40 1996/11/06 20:19:54 cgd Exp $ */
/*
@@ -45,22 +45,21 @@
*/
#include "assym.h"
+#include <machine/asm.h>
#include <machine/trap.h>
-| Remember this is a fun project. (Thanks, Adam. I try! 8^)
+| Remember this is a fun project!
| This is for kvm_mkdb, and should be the address of the beginning
| of the kernel text segment (not necessarily the same as kernbase).
.text
- .globl _kernel_text
-_kernel_text:
+GLOBAL(kernel_text)
| This is the entry point, as well as the end of the temporary stack
| used during process switch (one 8K page ending at start)
- .globl tmpstk
-tmpstk:
- .globl start
-start:
+ASGLOBAL(tmpstk)
+ASGLOBAL(start)
+
| First we need to set it up so we can access the sun MMU, and be otherwise
| undisturbed. Until otherwise noted, all code must be position independent
| as the boot loader put us low in memory, but we are linked high.
@@ -105,25 +104,29 @@ L_high_code:
| just before the start of the kernel text segment, so the
| kernel can sanity-check the DDB symbols at [end...esym].
| Pass the struct exec at tmpstk-32 to sun3_bootstrap().
- lea tmpstk-32, sp
- jsr _sun3_bootstrap
+| Also, make sure the initial frame pointer is zero so that
+| the backtrace algorithm used by KGDB terminates nicely.
+ lea _ASM_LABEL(tmpstk)-32, sp
+ movl #0, a6
+ jsr _C_LABEL(sun3_bootstrap)
-| Now that sun3_bootstrap is done using the PROM setcxsegmap
+| Now that sun3_bootstrap() is done using the PROM functions,
| we can safely set the sfc/dfc to something != FC_CONTROL
moveq #FC_USERD, d0 | make movs access "user data"
movc d0, sfc | space for copyin/copyout
movc d0, dfc
| Setup process zero user/kernel stacks.
- movl _proc0paddr,a1 | get proc0 pcb addr
+ movl _C_LABEL(proc0paddr),a1 | get proc0 pcb addr
lea a1@(USPACE-4),sp | set SSP to last word
movl #USRSTACK-4,a2
movl a2,usp | init user SP
-| Note curpcb was already set in sun3_bootstrap.
+| Note curpcb was already set in sun3_bootstrap().
| Will do fpu initialization during autoconfig (see fpu.c)
| The interrupt vector table and stack are now ready.
- movw #PSL_LOWIPL,sr | lower SPL
+| Interrupts will be enabled later, AFTER autoconfiguration
+| is finished, to avoid spurious interrupts.
/*
* Final preparation for calling main.
@@ -139,17 +142,18 @@ L_high_code:
movw #PSL_USER,sp@- | in user mode
clrl sp@- | stack adjust count and padding
lea sp@(-64),sp | construct space for D0-D7/A0-A7
- lea _proc0,a0 | proc0 in a0
- movl sp,a0@(P_MDREGS) | save frame for proc0
- movl usp,a1
- movl a1,sp@(FR_SP) | save user stack pointer in frame
- jbsr _main | main()
+ movl sp,a1 | a1=trapframe
+ lea _C_LABEL(proc0),a0 | proc0 in a0
+ movl a1,a0@(P_MDREGS) | save frame for proc0
+ movl a2,a1@(FR_SP) | a2 == usp (from above)
+ pea a1@ | push &trapframe
+ jbsr _C_LABEL(main) | main(&trapframe)
+ addql #4,sp | help DDB backtrace
trap #15 | should not get here
| This is used by cpu_fork() to return to user mode.
| It is called with SP pointing to a struct trapframe.
- .globl _proc_do_uret
-_proc_do_uret:
+GLOBAL(proc_do_uret)
movl sp@(FR_SP),a0 | grab and load
movl a0,usp | user SP
moveml sp@+,#0x7FFF | load most registers (all but SSP)
@@ -171,8 +175,7 @@ _proc_do_uret:
* pointer into a register, call it, then pop the arg, and finally
* return using the switchframe that remains on the stack.
*/
- .globl _proc_trampoline
-_proc_trampoline:
+GLOBAL(proc_trampoline)
movl sp@+,a0 | function pointer
jbsr a0@ | (*func)(procp)
addql #4,sp | toss the arg
@@ -184,19 +187,14 @@ _proc_trampoline:
/*
* Trap/interrupt vector routines
*/
+#include <m68k/m68k/trap_subr.s>
- .globl _buserr, _addrerr, _illinst, _zerodiv, _chkinst
- .globl _trapvinst, _privinst, _trace, _badtrap, _fmterr
- .globl _trap0, _trap1, _trap2, _trap12, _trap15
- .globl _coperr, _fpfline, _fpunsupp
-
- .globl _trap, _nofault, _longjmp
-_buserr:
- tstl _nofault | device probe?
- jeq _addrerr | no, handle as usual
- movl _nofault,sp@- | yes,
- jbsr _longjmp | longjmp(nofault)
-_addrerr:
+GLOBAL(buserr)
+ tstl _C_LABEL(nofault) | device probe?
+ jeq _C_LABEL(addrerr) | no, handle as usual
+ movl _C_LABEL(nofault),sp@- | yes,
+ jbsr _C_LABEL(longjmp) | longjmp(nofault)
+GLOBAL(addrerr)
clrl sp@- | stack adjust count
moveml #0xFFFF,sp@- | save user registers
movl usp,a0 | save the user SP
@@ -268,48 +266,28 @@ sun3_mmu_specific:
Lismerr:
movl #T_MMUFLT,sp@- | show that we are an MMU fault
- jra Ltrapnstkadj | and deal with it
+ jra _ASM_LABEL(faultstkadj) | and deal with it
Lisaerr:
movl #T_ADDRERR,sp@- | mark address error
- jra Ltrapnstkadj | and deal with it
+ jra _ASM_LABEL(faultstkadj) | and deal with it
Lisberr:
movl #T_BUSERR,sp@- | mark bus error
-Ltrapnstkadj:
- jbsr _trap | handle the error
- lea sp@(12),sp | pop value args
- movl sp@(FR_SP),a0 | restore user SP
- movl a0,usp | from save area
- movw sp@(FR_ADJ),d0 | need to adjust stack?
- jne Lstkadj | yes, go to it
- moveml sp@+,#0x7FFF | no, restore most user regs
- addql #8,sp | toss SSP and stkadj
- jra rei | all done
-Lstkadj:
- lea sp@(FR_HW),a1 | pointer to HW frame
- addql #8,a1 | source pointer
- movl a1,a0 | source
- addw d0,a0 | + hole size = dest pointer
- movl a1@-,a0@- | copy
- movl a1@-,a0@- | 8 bytes
- movl a0,sp@(FR_SP) | new SSP
- moveml sp@+,#0x7FFF | restore user registers
- movl sp@,sp | and our SP
- jra rei | all done
+ jra _ASM_LABEL(faultstkadj) | and deal with it
/*
* FP exceptions.
*/
-_fpfline:
+GLOBAL(fpfline)
clrl sp@- | stack adjust count
moveml #0xFFFF,sp@- | save registers
moveq #T_FPEMULI,d0 | denote as FP emulation trap
- jra fault | do it
+ jra _ASM_LABEL(fault) | do it
-_fpunsupp:
+GLOBAL(fpunsupp)
clrl sp@- | stack adjust count
moveml #0xFFFF,sp@- | save registers
moveq #T_FPEMULD,d0 | denote as FP emulation trap
- jra fault | do it
+ jra _ASM_LABEL(fault) | do it
/*
* Handles all other FP coprocessor exceptions.
@@ -317,14 +295,13 @@ _fpunsupp:
* and may cause signal delivery, we need to test for stack adjustment
* after the trap call.
*/
- .globl _fpfault
-_fpfault:
+GLOBAL(fpfault)
clrl sp@- | stack adjust count
moveml #0xFFFF,sp@- | save user registers
movl usp,a0 | and save
movl a0,sp@(FR_SP) | the user stack pointer
clrl sp@- | no VA arg
- movl _curpcb,a0 | current pcb
+ movl _C_LABEL(curpcb),a0 | current pcb
lea a0@(PCB_FPCTX),a0 | address of FP savearea
fsave a0@ | save state
tstb a0@ | null state frame?
@@ -336,201 +313,71 @@ Lfptnull:
fmovem fpsr,sp@- | push fpsr as code argument
frestore a0@ | restore state
movl #T_FPERR,sp@- | push type arg
- jra Ltrapnstkadj | call trap and deal with stack cleanup
-
-/*
- * Coprocessor and format errors can generate mid-instruction stack
- * frames and cause signal delivery hence we need to check for potential
- * stack adjustment.
- */
-_coperr:
- clrl sp@- | stack adjust count
- moveml #0xFFFF,sp@-
- movl usp,a0 | get and save
- movl a0,sp@(FR_SP) | the user stack pointer
- clrl sp@- | no VA arg
- clrl sp@- | or code arg
- movl #T_COPERR,sp@- | push trap type
- jra Ltrapnstkadj | call trap and deal with stack adjustments
-
-_fmterr:
- clrl sp@- | stack adjust count
- moveml #0xFFFF,sp@-
- movl usp,a0 | get and save
- movl a0,sp@(FR_SP) | the user stack pointer
- clrl sp@- | no VA arg
- clrl sp@- | or code arg
- movl #T_FMTERR,sp@- | push trap type
- jra Ltrapnstkadj | call trap and deal with stack adjustments
+ jra _ASM_LABEL(faultstkadj) | call trap and deal with stack cleanup
+ .globl _straytrap
/*
* Other exceptions only cause four and six word stack frame and require
* no post-trap stack adjustment.
*/
-_illinst:
- clrl sp@-
- moveml #0xFFFF,sp@-
- moveq #T_ILLINST,d0
- jra fault
-
-_zerodiv:
- clrl sp@-
- moveml #0xFFFF,sp@-
- moveq #T_ZERODIV,d0
- jra fault
-
-_chkinst:
- clrl sp@-
- moveml #0xFFFF,sp@-
- moveq #T_CHKINST,d0
- jra fault
-
-_trapvinst:
- clrl sp@-
- moveml #0xFFFF,sp@-
- moveq #T_TRAPVINST,d0
- jra fault
-
-_privinst:
- clrl sp@-
- moveml #0xFFFF,sp@-
- moveq #T_PRIVINST,d0
- jra fault
-
- .globl fault
-fault:
- movl usp,a0 | get and save
- movl a0,sp@(FR_SP) | the user stack pointer
- clrl sp@- | no VA arg
- clrl sp@- | or code arg
- movl d0,sp@- | push trap type
- jbsr _trap | handle trap
- lea sp@(12),sp | pop value args
- movl sp@(FR_SP),a0 | restore
- movl a0,usp | user SP
- moveml sp@+,#0x7FFF | restore most user regs
- addql #8,sp | pop SP and stack adjust
- jra rei | all done
-
- .globl _straytrap
-_badtrap:
+GLOBAL(badtrap)
clrl sp@- | stack adjust count
moveml #0xFFFF,sp@- | save std frame regs
- jbsr _straytrap | report
+ jbsr _C_LABEL(straytrap) | report
moveml sp@+,#0xFFFF | restore regs
addql #4, sp | stack adjust count
- jra rei | all done
+ jra _ASM_LABEL(rei) | all done
/*
* Trap 0 is for system calls
*/
.globl _syscall
-_trap0:
+GLOBAL(trap0)
clrl sp@- | stack adjust count
moveml #0xFFFF,sp@- | save user registers
movl usp,a0 | save the user SP
movl a0,sp@(FR_SP) | in the savearea
movl d0,sp@- | push syscall number
- jbsr _syscall | handle it
+ jbsr _C_LABEL(syscall) | handle it
addql #4,sp | pop syscall arg
movl sp@(FR_SP),a0 | grab and restore
movl a0,usp | user SP
moveml sp@+,#0x7FFF | restore most registers
addql #8,sp | pop SP and stack adjust
- jra rei | all done
-
-/*
- * Trap 1 is either:
- * sigreturn (native OpenBSD executable)
- * breakpoint (HPUX executable)
- */
-_trap1:
-#if 0 /* COMPAT_HPUX */
- /* If process is HPUX, this is a user breakpoint. */
- jne trap15 | breakpoint
-#endif
- /* fall into sigreturn */
-
-/*
- * The sigreturn() syscall comes here. It requires special handling
- * because we must open a hole in the stack to fill in the (possibly much
- * larger) original stack frame.
- */
-sigreturn:
- lea sp@(-84),sp | leave enough space for largest frame
- movl sp@(84),sp@ | move up current 8 byte frame
- movl sp@(88),sp@(4)
- movl #84,sp@- | default: adjust by 84 bytes
- moveml #0xFFFF,sp@- | save user registers
- movl usp,a0 | save the user SP
- movl a0,sp@(FR_SP) | in the savearea
- movl #SYS_sigreturn,sp@- | push syscall number
- jbsr _syscall | handle it
- addql #4,sp | pop syscall#
- movl sp@(FR_SP),a0 | grab and restore
- movl a0,usp | user SP
- lea sp@(FR_HW),a1 | pointer to HW frame
- movw sp@(FR_ADJ),d0 | do we need to adjust the stack?
- jeq Lsigr1 | no, just continue
- moveq #92,d1 | total size
- subw d0,d1 | - hole size = frame size
- lea a1@(92),a0 | destination
- addw d1,a1 | source
- lsrw #1,d1 | convert to word count
- subqw #1,d1 | minus 1 for dbf
-Lsigrlp:
- movw a1@-,a0@- | copy a word
- dbf d1,Lsigrlp | continue
- movl a0,a1 | new HW frame base
-Lsigr1:
- movl a1,sp@(FR_SP) | new SP value
- moveml sp@+,#0x7FFF | restore user registers
- movl sp@,sp | and our SP
- jra rei | all done
-
-/*
- * Trap 2 is one of:
- * OpenBSD: not used (ignore)
- * SunOS: Some obscure FPU operation
- * HPUX: sigreturn
- */
-_trap2:
-#if 0 /* COMPAT_HPUX */
- /* XXX: If HPUX, this is a user breakpoint. */
- jne sigreturn
-#endif
- /* fall into trace (OpenBSD or SunOS) */
+ jra _ASM_LABEL(rei) | all done
+/* Use common m68k sigreturn */
+#include <m68k/m68k/sigreturn.s>
+
/*
* Trace (single-step) trap. Kernel-mode is special.
* User mode traps are simply passed on to trap().
*/
-_trace:
+GLOBAL(trace)
clrl sp@- | stack adjust count
moveml #0xFFFF,sp@-
moveq #T_TRACE,d0
- movw sp@(FR_HW),d1 | get PSW
- andw #PSL_S,d1 | from system mode?
- jne kbrkpt | yes, kernel breakpoint
- jra fault | no, user-mode fault
+ btst #5,sp@(FR_HW) | was system mode?
+ jne _ASM_LABEL(kbrkpt) | yes, kernel breakpoint
+ jra _ASM_LABEL(fault) | no, user-mode fault
/*
* Trap 15 is used for:
* - GDB breakpoints (in user programs)
* - KGDB breakpoints (in the kernel)
* - trace traps for SUN binaries (not fully supported yet)
- * User mode traps are passed simply passed to trap()
+ * User mode traps are simply passed to trap()
*/
-_trap15:
+GLOBAL(trap15)
clrl sp@- | stack adjust count
moveml #0xFFFF,sp@-
moveq #T_TRAP15,d0
- movw sp@(FR_HW),d1 | get PSW
- andw #PSL_S,d1 | from system mode?
- jne kbrkpt | yes, kernel breakpoint
- jra fault | no, user-mode fault
+ btst #5,sp@(FR_HW) | was system mode?
+ jne _ASM_LABEL(kbrkpt) | yes, kernel breakpoint
+ jra _ASM_LABEL(fault) | no, user-mode fault
-kbrkpt: | Kernel-mode breakpoint or trace trap. (d0=trap_type)
+ASLOCAL(kbrkpt)
+ | Kernel-mode breakpoint or trace trap. (d0=trap_type)
| Save the system sp rather than the user sp.
movw #PSL_HIGHIPL,sr | lock out interrupts
lea sp@(FR_SIZE),a6 | Save stack pointer
@@ -539,11 +386,11 @@ kbrkpt: | Kernel-mode breakpoint or trace trap. (d0=trap_type)
| If we are not on tmpstk switch to it.
| (so debugger can change the stack pointer)
movl a6,d1
- cmpl #tmpstk,d1
+ cmpl #_ASM_LABEL(tmpstk),d1
jls Lbrkpt2 | already on tmpstk
| Copy frame to the temporary stack
movl sp,a0 | a0=src
- lea tmpstk-96,a1 | a1=dst
+ lea _ASM_LABEL(tmpstk)-96,a1 | a1=dst
movl a1,sp | sp=new frame
moveq #FR_SIZE,d1
Lbrkpt1:
@@ -553,7 +400,7 @@ Lbrkpt1:
Lbrkpt2:
| Call the trap handler for the kernel debugger.
- | Do not call trap() to do it, so that we can
+ | Do not call trap() to handle it, so that we can
| set breakpoints in trap() if we want. We know
| the trap type is either T_TRACE or T_BREAKPOINT.
| If we have both DDB and KGDB, let KGDB see it first,
@@ -565,7 +412,7 @@ Lbrkpt2:
| Let KGDB handle it (if connected)
movl a2,sp@- | push frame ptr
movl d2,sp@- | push trap type
- jbsr _kgdb_trap | handle the trap
+ jbsr _C_LABEL(kgdb_trap) | handle the trap
addql #8,sp | pop args
cmpl #0,d0 | did kgdb handle it
jne Lbrkpt3 | yes, done
@@ -574,7 +421,7 @@ Lbrkpt2:
| Let DDB handle it.
movl a2,sp@- | push frame ptr
movl d2,sp@- | push trap type
- jbsr _kdb_trap | handle the trap
+ jbsr _C_LABEL(kdb_trap) | handle the trap
addql #8,sp | pop args
cmpl #0,d0 | did ddb handle it
jne Lbrkpt3 | yes, done
@@ -582,14 +429,13 @@ Lbrkpt2:
| Drop into the PROM temporarily...
movl a2,sp@- | push frame ptr
movl d2,sp@- | push trap type
- jbsr _nodb_trap | handle the trap
+ jbsr _C_LABEL(nodb_trap) | handle the trap
addql #8,sp | pop args
Lbrkpt3:
| The stack pointer may have been modified, or
| data below it modified (by kgdb push call),
| so push the hardware frame at the current sp
| before restoring registers and returning.
-
movl sp@(FR_SP),a0 | modified sp
lea sp@(FR_SIZE),a1 | end of our frame
movl a1@-,a0@- | copy 2 longs with
@@ -604,14 +450,31 @@ Lbrkpt3:
* cachectl(command, addr, length)
* command in d0, addr in a1, length in d1
*/
- .globl _cachectl
-_trap12:
+GLOBAL(trap12)
movl d1,sp@- | push length
movl a1,sp@- | push addr
movl d0,sp@- | push command
- jbsr _cachectl | do it
+ jbsr _C_LABEL(cachectl) | do it
lea sp@(12),sp | pop args
- jra rei | all done
+ jra _ASM_LABEL(rei) | all done
+
+/*
+ * Trap 1 is sigreturn
+ */
+ENTRY_NOPROFILE(trap1)
+ jra _ASM_LABEL(sigreturn)
+
+/*
+ * Trap 2 - trace trap
+ *
+ * XXX SunOS uses this for a cache flush! What do we do here?
+ * XXX
+ * XXX movl #IC_CLEAR,d0
+ * XXX movc d0,cacr
+ * XXX rte
+ */
+ENTRY_NOPROFILE(trap2)
+ jra _C_LABEL(trace)
/*
* Interrupt handlers. Most are auto-vectored,
@@ -626,26 +489,24 @@ _trap12:
#define INTERRUPT_RESTORE \
moveml sp@+,#0x0303
-.align 4
/*
* This is the common auto-vector interrupt handler,
* for which the CPU provides the vector=0x18+level.
* These are installed in the interrupt vector table.
*/
- .globl __isr_autovec
-__isr_autovec:
+ .align 2
+GLOBAL(_isr_autovec)
INTERRUPT_SAVEREG
movw sp@(22),sp@- | push exception vector info
clrw sp@-
- jbsr _isr_autovec | C dispatcher
+ jbsr _C_LABEL(isr_autovec) | C dispatcher
addql #4,sp
INTERRUPT_RESTORE
- jra rei /* XXX - Just do rte here? */
+ jra _ASM_LABEL(rei)
/* clock: see clock.c */
-.globl __isr_clock, _interrupt_reg, _clock_intr, _clock_va
-.align 4
-__isr_clock:
+ .align 2
+GLOBAL(_isr_clock)
INTERRUPT_SAVEREG | save a0, a1, d0, d1
movl _clock_va, a0
movl _interrupt_reg, a1
@@ -656,30 +517,27 @@ __isr_clock:
| used to have "timebomb" check here...
lea sp@(16),a1 | a1 = &clockframe
movl a1,sp@-
- jbsr _clock_intr
+ jbsr _C_LABEL(clock_intr)
addql #4,sp
INTERRUPT_RESTORE
- jra rei
+ jra _ASM_LABEL(rei)
| Handler for all vectored interrupts (i.e. VME interrupts)
.align 2
- .globl __isr_vectored, _isr_vectored
-__isr_vectored:
+GLOBAL(_isr_vectored)
INTERRUPT_SAVEREG
movw sp@(22),sp@- | push exception vector info
clrw sp@-
- jbsr _isr_vectored | C dispatcher
+ jbsr _C_LABEL(isr_vectored) | C dispatcher
addql #4,sp |
INTERRUPT_RESTORE
- jra rei | all done
-
+ jra _ASM_LABEL(rei) | all done
#undef INTERRUPT_SAVEREG
#undef INTERRUPT_RESTORE
/* interrupt counters (needed by vmstat) */
- .globl _intrcnt,_eintrcnt,_intrnames,_eintrnames
-_intrnames:
+GLOBAL(intrnames)
.asciz "spur" | 0
.asciz "lev1" | 1
.asciz "lev2" | 2
@@ -688,13 +546,13 @@ _intrnames:
.asciz "clock" | 5
.asciz "lev6" | 6
.asciz "nmi" | 7
-_eintrnames:
+GLOBAL(eintrnames)
.data
.even
-_intrcnt:
+GLOBAL(intrcnt)
.long 0,0,0,0,0,0,0,0,0,0
-_eintrcnt:
+GLOBAL(eintrcnt)
.text
/*
@@ -715,14 +573,12 @@ _eintrcnt:
* necessitating a stack cleanup.
*/
- .globl _astpending
- .globl rei
-rei:
+ASGLOBAL(rei)
#ifdef DIAGNOSTIC
- tstl _panicstr | have we paniced?
+ tstl _C_LABEL(panicstr) | have we paniced?
jne Ldorte | yes, do not make matters worse
#endif
- tstl _astpending | AST pending?
+ tstl _C_LABEL(astpending) | AST pending?
jeq Ldorte | no, done
Lrei1:
btst #5,sp@ | yes, are we returning to user mode?
@@ -735,7 +591,7 @@ Lrei1:
clrl sp@- | VA == none
clrl sp@- | code == none
movl #T_ASTFLT,sp@- | type == async system trap
- jbsr _trap | go handle it
+ jbsr _C_LABEL(trap) | go handle it
lea sp@(12),sp | pop value args
movl sp@(FR_SP),a0 | restore user SP
movl a0,usp | from save area
@@ -766,162 +622,38 @@ Ldorte:
*/
/*
- * Signal "trampoline" code (18 bytes). Invoked from RTE setup by sendsig().
- *
- * Stack looks like:
- *
- * sp+0 -> signal number
- * sp+4 pointer to siginfo (sip)
- * sp+8 pointer to signal context frame (scp)
- * sp+12 address of handler
- * sp+16 saved hardware state
- * .
- * .
- * scp+0-> beginning of signal context frame
+ * Use common m68k sigcode.
*/
- .globl _sigcode, _esigcode
- .data
- .align 2
-_sigcode: /* Found at address: 0x0DFFffdc */
- movl sp@(12),a0 | signal handler addr (4 bytes)
- jsr a0@ | call signal handler (2 bytes)
- addql #4,sp | pop signo (2 bytes)
- trap #1 | special syscall entry (2 bytes)
- movl d0,sp@(4) | save errno (4 bytes)
- moveq #1,d0 | syscall == exit (2 bytes)
- trap #0 | exit(errno) (2 bytes)
- .align 2
-_esigcode:
- .text
+#include <m68k/m68k/sigcode.s>
-/* XXX - hp300 still has icode here... */
+ .text
/*
* Primitives
*/
-#include <machine/asm.h>
/*
- * non-local gotos
+ * Use common m68k support routines.
*/
-ENTRY(setjmp)
- movl sp@(4),a0 | savearea pointer
- moveml #0xFCFC,a0@ | save d2-d7/a2-a7
- movl sp@,a0@(48) | and return address
- moveq #0,d0 | return 0
- rts
+#include <m68k/m68k/support.s>
-ENTRY(longjmp)
- movl sp@(4),a0
- moveml a0@+,#0xFCFC
- movl a0@,sp@
- moveq #1,d0
- rts
+BSS(want_resched,4)
/*
- * The following primitives manipulate the run queues.
- * _whichqs tells which of the 32 queues _qs have processes in them.
- * Setrunqueue puts processes into queues, Remrunqueue removes them
- * from queues. The running process is on no queue, other processes
- * are on a queue related to p->p_priority, divided by 4 actually to
- * shrink the 0-127 range of priorities into the 32 available queues.
+ * Use common m68k process manipulation routines.
*/
-
- .globl _whichqs,_qs,_cnt,_panic
- .globl _curproc
- .comm _want_resched,4
-
-/*
- * setrunqueue(p)
- *
- * Call should be made at splclock(), and p->p_stat should be SRUN
- */
-ENTRY(setrunqueue)
- movl sp@(4),a0
-#ifdef DIAGNOSTIC
- tstl a0@(P_BACK)
- jne Lset1
- tstl a0@(P_WCHAN)
- jne Lset1
- cmpb #SRUN,a0@(P_STAT)
- jne Lset1
-#endif
- clrl d0
- movb a0@(P_PRIORITY),d0
- lsrb #2,d0
- movl _whichqs,d1
- bset d0,d1
- movl d1,_whichqs
- lslb #3,d0
- addl #_qs,d0
- movl d0,a0@(P_FORW)
- movl d0,a1
- movl a1@(P_BACK),a0@(P_BACK)
- movl a0,a1@(P_BACK)
- movl a0@(P_BACK),a1
- movl a0,a1@(P_FORW)
- rts
-#ifdef DIAGNOSTIC
-Lset1:
- movl #Lset2,sp@-
- jbsr _panic
-Lset2:
- .asciz "setrunqueue"
- .even
-#endif
-
-/*
- * remrunqueue(p)
- *
- * Call should be made at splclock().
- */
-ENTRY(remrunqueue)
- movl sp@(4),a0 | proc *p
- clrl d0
- movb a0@(P_PRIORITY),d0
- lsrb #2,d0
- movl _whichqs,d1
- bclr d0,d1 | if ((d1 & (1 << d0)) == 0)
- jeq Lrem2 | panic (empty queue)
- movl d1,_whichqs
- movl a0@(P_FORW),a1
- movl a0@(P_BACK),a1@(P_BACK)
- movl a0@(P_BACK),a1
- movl a0@(P_FORW),a1@(P_FORW)
- movl #_qs,a1
- movl d0,d1
- lslb #3,d1
- addl d1,a1
- cmpl a1@(P_FORW),a1
- jeq Lrem1
- movl _whichqs,d1
- bset d0,d1
- movl d1,_whichqs
-Lrem1:
- clrl a0@(P_BACK)
- rts
-Lrem2:
- movl #Lrem3,sp@-
- jbsr _panic
-Lrem3:
- .asciz "remrunqueue"
- .even
+#include <m68k/m68k/proc_subr.s>
| Message for Lbadsw panic
Lsw0:
.asciz "cpu_switch"
.even
- .globl _curpcb
- .globl _masterpaddr | XXX compatibility (debuggers)
.data
-_masterpaddr: | XXX compatibility (debuggers)
-_curpcb:
+GLOBAL(masterpaddr) | XXX compatibility (debuggers)
+GLOBAL(curpcb)
.long 0
-mdpflag:
- .byte 0 | copy of proc md_flags low byte
- .align 2
- .comm nullpcb,SIZEOF_PCB
+ASBSS(nullpcb,SIZEOF_PCB)
.text
/*
@@ -931,8 +663,9 @@ mdpflag:
*/
ENTRY(switch_exit)
movl sp@(4),a0 | struct proc *p
- movl #nullpcb,_curpcb | save state into garbage pcb
- lea tmpstk,sp | goto a tmp stack
+ | save state into garbage pcb
+ movl #_ASM_LABEL(nullpcb),_C_LABEL(curpcb)
+ lea _ASM_LABEL(tmpstk),sp | goto a tmp stack
movl a0,sp@- | pass proc ptr down
/* Schedule the vmspace and stack to be freed. */
@@ -940,32 +673,30 @@ ENTRY(switch_exit)
jbsr _C_LABEL(exit2)
lea sp@(4),sp | pop args
- jra _cpu_switch
+ jra _C_LABEL(cpu_switch)
/*
* When no processes are on the runq, cpu_switch() branches to idle
* to wait for something to come ready.
*/
.data
- .globl _Idle_count
-_Idle_count:
+GLOBAL(Idle_count)
.long 0
.text
- .globl Idle
Lidle:
stop #PSL_LOWIPL
-Idle:
+GLOBAL(_Idle)
movw #PSL_HIGHIPL,sr
- addql #1, _Idle_count
- tstl _whichqs
+ addql #1, _C_LABEL(Idle_count)
+ tstl _C_LABEL(whichqs)
jeq Lidle
movw #PSL_LOWIPL,sr
jra Lsw1
Lbadsw:
movl #Lsw0,sp@-
- jbsr _panic
+ jbsr _C_LABEL(panic)
/*NOTREACHED*/
/*
@@ -975,12 +706,12 @@ Lbadsw:
* XXX - Sould we use p->p_addr instead of curpcb? -gwr
*/
ENTRY(cpu_switch)
- movl _curpcb,a1 | current pcb
+ movl _C_LABEL(curpcb),a1 | current pcb
movw sr,a1@(PCB_PS) | save sr before changing ipl
#ifdef notyet
- movl _curproc,sp@- | remember last proc running
+ movl _C_LABEL(curproc),sp@- | remember last proc running
#endif
- clrl _curproc
+ clrl _C_LABEL(curproc)
Lsw1:
/*
@@ -988,7 +719,7 @@ Lsw1:
* then take the first proc from that queue.
*/
clrl d0
- lea _whichqs,a0
+ lea _C_LABEL(whichqs),a0
movl a0@,d1
Lswchk:
btst d0,d1
@@ -996,7 +727,7 @@ Lswchk:
addqb #1,d0
cmpb #32,d0
jne Lswchk
- jra Idle
+ jra _C_LABEL(_Idle)
Lswfnd:
movw #PSL_HIGHIPL,sr | lock out interrupts
movl a0@,d1 | and check again...
@@ -1025,12 +756,12 @@ Lswok:
movl a0@(P_BACK),a1@(P_BACK) | q->p_back = p->p_back
cmpl a0@(P_FORW),d1 | anyone left on queue?
jeq Lsw2 | no, skip
- movl _whichqs,d1
+ movl _C_LABEL(whichqs),d1
bset d0,d1 | yes, reset bit
- movl d1,_whichqs
+ movl d1,_C_LABEL(whichqs)
Lsw2:
- movl a0,_curproc
- clrl _want_resched
+ movl a0,_C_LABEL(curproc)
+ clrl _C_LABEL(want_resched)
#ifdef notyet
movl sp@+,a1 | XXX - Make this work!
cmpl a0,a1 | switching to same proc?
@@ -1039,12 +770,12 @@ Lsw2:
/*
* Save state of previous process in its pcb.
*/
- movl _curpcb,a1
+ movl _C_LABEL(curpcb),a1
moveml #0xFCFC,a1@(PCB_REGS) | save non-scratch registers
movl usp,a2 | grab USP (a2 has been saved)
movl a2,a1@(PCB_USP) | and save it
- tstl _fputype | Do we have an fpu?
+ tstl _C_LABEL(fputype) | Do we have an fpu?
jeq Lswnofpsave | No? Then don't try save.
lea a1@(PCB_FPCTX),a2 | pointer to FP save area
fsave a2@ | save FP state
@@ -1069,23 +800,25 @@ Lswnofpsave:
#endif
clrl a0@(P_BACK) | clear back link
movl a0@(P_ADDR),a1 | get p_addr
- movl a1,_curpcb
+ movl a1,_C_LABEL(curpcb)
- /* see if pmap_activate needs to be called; should remove this */
- movl a0@(P_VMSPACE),a2 | a2 = p->p_vmspace
+ /*
+ * Load the new VM context (new MMU root pointer)
+ */
+ movl a0@(P_VMSPACE),a2 | vm = p->p_vmspace
#ifdef DIAGNOSTIC
- tstl a2 | map == VM_MAP_NULL?
+ tstl a2 | vm == VM_MAP_NULL?
jeq Lbadsw | panic
#endif
-| Important note: We MUST call pmap_activate to set the
-| MMU context register (like setting a root table pointer).
-| XXX - Eventually, want to do that here, inline.
- lea a2@(VM_PMAP),a2 | pmap = &vmspace.vm_pmap
+ /*
+ * Call pmap_activate() to set the MMU context register
+ */
+ lea a2@(VM_PMAP),a2 | pmap = &vm.vm_pmap
pea a2@ | push pmap
- jbsr _pmap_activate | pmap_activate(pmap)
+ jbsr _C_LABEL(pmap_activate) | pmap_activate(pmap)
addql #4,sp
- movl _curpcb,a1 | restore p_addr
+ movl _C_LABEL(curpcb),a1 | restore p_addr
| Note: pmap_activate will clear the cache if needed.
/*
@@ -1096,7 +829,7 @@ Lswnofpsave:
movl a1@(PCB_USP),a0
movl a0,usp | and USP
- tstl _fputype | If we don't have an fpu,
+ tstl _C_LABEL(fputype) | If we don't have an fpu,
jeq Lres_skip | don't try to restore it.
lea a1@(PCB_FPCTX),a0 | pointer to FP save area
tstb a0@ | null state frame?
@@ -1126,7 +859,7 @@ ENTRY(savectx)
movl a0,a1@(PCB_USP) | and save it
moveml #0xFCFC,a1@(PCB_REGS) | save non-scratch registers
- tstl _fputype | Do we have FPU?
+ tstl _C_LABEL(fputype) | Do we have FPU?
jeq Lsavedone | No? Then don't save state.
lea a1@(PCB_FPCTX),a0 | pointer to FP save area
fsave a0@ | save FP state
@@ -1168,8 +901,7 @@ ENTRY(DCIU)
*
* [I don't think the ENTRY() macro will do the right thing with this -- glass]
*/
- .globl _getsp
-_getsp:
+GLOBAL(getsp)
movl sp,d0 | get current SP
addql #4,d0 | compensate for return address
rts
@@ -1191,7 +923,7 @@ ENTRY(setvbr)
movc d0, vbr
rts
-/* loadustp */
+/* loadustp, ptest_addr */
/*
* Set processor priority level calls. Most are implemented with
@@ -1200,40 +932,28 @@ ENTRY(setvbr)
* Most places will use the inlined function param.h supplies.
*/
-ENTRY(_spl)
- movl sp@(4),d1
+ENTRY(_getsr)
clrl d0
- movw sr,d0
- movw d1,sr
- rts
-
-ENTRY(getsr)
- moveq #0, d0
movw sr, d0
rts
-ENTRY(_insque)
+ENTRY(_spl)
+ clrl d0
movw sr,d0
- movw #PSL_HIGHIPL,sr | atomic
- movl sp@(8),a0 | where to insert (after)
- movl sp@(4),a1 | element to insert (e)
- movl a0@,a1@ | e->next = after->next
- movl a0,a1@(4) | e->prev = after
- movl a1,a0@ | after->next = e
- movl a1@,a0
- movl a1,a0@(4) | e->next->prev = e
- movw d0,sr
+ movl sp@(4),d1
+ movw d1,sr
rts
-
-ENTRY(_remque)
+
+ENTRY(_splraise)
+ clrl d0
movw sr,d0
- movw #PSL_HIGHIPL,sr | atomic
- movl sp@(4),a0 | element to remove (e)
- movl a0@,a1
- movl a0@(4),a0
- movl a0,a1@(4) | e->next->prev = e->prev
- movl a1,a0@ | e->prev->next = e->next
- movw d0,sr
+ movl d0,d1
+ andl #PSL_HIGHIPL,d1 | old &= PSL_HIGHIPL
+ cmpl sp@(4),d1 | (old - new)
+ bge Lsplr
+ movl sp@(4),d1
+ movw d1,sr
+Lsplr:
rts
/*
@@ -1267,12 +987,11 @@ Lm68881rdone:
* XXX: Currently this is set in sun3_startup.c based on the
* XXX: CPU model but this should be determined at run time...
*/
- .globl __delay
-__delay:
+GLOBAL(_delay)
| d0 = arg = (usecs << 8)
movl sp@(4),d0
| d1 = delay_divisor;
- movl _delay_divisor,d1
+ movl _C_LABEL(delay_divisor),d1
L_delay:
subl d1,d0
jgt L_delay
@@ -1280,13 +999,12 @@ L_delay:
| Define some addresses, mostly so DDB can print useful info.
- .globl _kernbase
+| Not using C_LABEL() here because these symbols are never
+| referenced by any C code, and if the leading underscore
+| ever goes away, these lines turn into syntax errors...
.set _kernbase,KERNBASE
- .globl _dvma_base
.set _dvma_base,DVMA_SPACE_START
- .globl _prom_start
.set _prom_start,MONSTART
- .globl _prom_base
.set _prom_base,PROM_BASE
|The end!