sun3 port updated. netboot integrated.

This commit is contained in:
glass 1993-10-12 05:27:46 +00:00
parent 8585a64107
commit b9e5a43208
5 changed files with 130 additions and 99 deletions

View File

@ -130,8 +130,9 @@ trap(type, code, v, frame)
unsigned ncode;
int s;
printf("trap type %d, code = %x, v = %x\n", type, code, v);
cnt.v_trap++;
if (!p)
p = &proc0;
syst = p->p_stime;
if (USERMODE(frame.f_sr)) {
type |= T_USER;
@ -151,6 +152,7 @@ dopanic:
case T_BUSERR: /* kernel bus error */
if (!p->p_addr->u_pcb.pcb_onfault)
goto dopanic;
/*
* If we have arranged to catch this fault in any of the
* copy to/from user space routines, set PC to return to
@ -158,6 +160,7 @@ dopanic:
* that it may need to clean up stack frame.
*/
copyfault:
frame.f_stackadj = exframesize[frame.f_format];
frame.f_format = frame.f_vector = 0;
frame.f_pc = (int) p->p_addr->u_pcb.pcb_onfault;
@ -290,7 +293,6 @@ copyfault:
break;
case T_ASTFLT: /* system async trap, cannot happen */
printf("system async trap\n");
goto dopanic;
case T_ASTFLT|T_USER: /* user async trap */
@ -303,21 +305,17 @@ copyfault:
* check. Note that we ensure that we are at least at SIR
* IPL while processing the SIR.
*/
printf("user async trap\n");
spl1();
/* fall into... */
case T_SSIR: /* software interrupt */
case T_SSIR|T_USER:
printf("software interrupt\n");
if (ssir & SIR_NET) {
printf("soft interrupt: network\n");
siroff(SIR_NET);
cnt.v_soft++;
netintr();
}
if (ssir & SIR_CLOCK) {
printf("soft interrupt: clock\n");
siroff(SIR_CLOCK);
cnt.v_soft++;
softclock((caddr_t)frame.f_pc, (int)frame.f_sr);
@ -326,13 +324,10 @@ copyfault:
* If this was not an AST trap, we are all done.
*/
if (type != (T_ASTFLT|T_USER)) {
printf("soft interrupt: NOT AST\n");
cnt.v_trap--;
return;
}
printf("soft interrupt: before spl0\n");
spl0();
printf("soft interrupt: after spl0\n");
#ifndef PROFTIMER
if ((p->p_flag&SOWEUPC) && p->p_stats->p_prof.pr_scale) {
addupc(frame.f_pc, &p->p_stats->p_prof, 1);
@ -379,6 +374,12 @@ copyfault:
}
#endif
rv = vm_fault(map, va, ftype, FALSE);
#if VMFAULT_TRACE
printf("vm_fault(%x, %x, %x, 0) -> %x in context %d\n",
map, va, ftype, rv, get_context());
printf(" type %x, code [mmu,,ssw]: %x\n",
type, code);
#endif
/*
* If this was a stack access we keep track of the maximum
* accessed stack size. Also, if vm_fault gets a protection
@ -397,8 +398,13 @@ copyfault:
rv = KERN_INVALID_ADDRESS;
}
if (rv == KERN_SUCCESS) {
if (type == T_MMUFLT)
if (type == T_MMUFLT) {
#if VMFAULT_TRACE
printf("vm_fault resolved access to map %x va %x type ftype %d\n",
map, va, ftype);
#endif
return;
}
goto out;
}
if (type == T_MMUFLT) {
@ -436,8 +442,6 @@ out:
p->p_stats->p_ru.ru_nivcsw++;
swtch();
splx(s);
printf("trap: survived the switch\n");
tracedump();
while (i = CURSIG(p))
psig(i);
}
@ -483,6 +487,7 @@ syscall(code, frame)
extern int hpuxnsysent, notimp();
#endif
printf("entered syscall()\n");
cnt.v_syscall++;
syst = p->p_stime;
if (!USERMODE(frame.f_sr))

View File

@ -50,6 +50,10 @@
* of the memory error register is necessary
*/
.globl _buserr, _addrerr, _illinst, _zerodiv, _chkinst, _trapvinst
.globl _privinst, _trace, _fpfline, _badtrap, _coperr, _fmterr, _trap0,
.globl _trap1, _trap2, _trap15
.globl _fpunsupp
.globl _trap, _nofault, _longjmp
_buserr:
@ -104,6 +108,20 @@ Lbe10:
andw #0x0FFF,d0 | clear out frame format
cmpw #12,d0 | address error vector?
jeq Lisaerr | yes, go to it
/*
* the sun3 specific code
*
* our mission: figure out whether what we are looking at is
* bus error in the UNIX sense, or
* a memory error i.e a page fault
*
* [this code replaces similarly mmu specific code in the hp300 code]
*/
sun3_mmu_specific:
clrl d0 | make sure top bits are cleard too
movsb BUSERR_REG, d0 | get value of bus error register
btst #5, d0 | test to timeout bit
jne Lisberr | if bus error, do it
Lismerr:
movl #T_MMUFLT,sp@- | show that we are an MMU fault
jra Ltrapnstkadj | and deal with it
@ -134,6 +152,9 @@ Lstkadj:
movl sp@,sp | and our SP
jra rei | all done
/* unchanged from hp300 */
/*
* FP exceptions.
*/
@ -149,6 +170,7 @@ _fpunsupp:
* and may cause signal delivery, we need to test for stack adjustment
* after the trap call.
*/
.globl _fpfault
_fpfault:
#ifdef FPCOPROC
clrw sp@- | pad SR to longword
@ -292,20 +314,6 @@ _trap2:
jeq _trace | no, trap2 is breakpoint
jra sigreturn | yes, trap2 is sigreturn
/*
* Trap 12 is the entry point for the cachectl "syscall" (both HPUX & BSD)
* cachectl(command, addr, length)
* command in d0, addr in a1, length in d1
*/
.globl _cachectl
_trap12:
movl d1,sp@- | push length
movl a1,sp@- | push addr
movl d0,sp@- | push command
jbsr _cachectl | do it
lea sp@(12),sp | pop args
jra rei | all done
/*
* Trap 15 is used for:
* - KGDB traps

View File

@ -28,7 +28,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Header: /cvsroot/src/sys/arch/sun3/sun3/Attic/vector.c,v 1.3 1993/08/28 15:38:34 glass Exp $
* $Header: /cvsroot/src/sys/arch/sun3/sun3/Attic/vector.c,v 1.4 1993/10/12 05:28:14 glass Exp $
*/
#include "sys/systm.h"
@ -38,32 +38,49 @@
COPY_ENTRY, COPY_ENTRY, COPY_ENTRY, COPY_ENTRY, \
COPY_ENTRY, COPY_ENTRY, COPY_ENTRY, COPY_ENTRY, \
COPY_ENTRY, COPY_ENTRY, COPY_ENTRY, COPY_ENTRY
#define BADTRAP16 badtrap, badtrap, badtrap, badtrap, \
badtrap, badtrap, badtrap, badtrap, \
badtrap, badtrap, badtrap, badtrap, \
badtrap, badtrap, badtrap, badtrap
unsigned int vector_table[NVECTORS] = {
void addrerr(), badtrap(), buserr(), chkinst(), coperr(), fmterr(),
fpfline(), fpunsupp(), illinst(), privinst(), trace(), trap0(),
trap1(), trap12(), trap15(), trap2(), trapvinst(), zerodiv(), fpfault();
#define fpbsun fpfault
#define fpdz fpfault
#define fpinex fpfault
#define fpoperr fpfault
#define fpovfl fpfault
#define fpsnan fpfault
#define fpunfl fpfault
void (*vector_table[NVECTORS])() = {
COPY_ENTRY, /* 0: jmp 0x400:w (unused reset SSP)*/
COPY_ENTRY, /* 1: NOT USED (reset PC) */
COPY_ENTRY, /* 2: bus error */
COPY_ENTRY, /* 3: address error */
COPY_ENTRY, /* 4: illegal instruction */
COPY_ENTRY, /* 5: zero divide */
COPY_ENTRY, /* 6: CHK instruction */
COPY_ENTRY, /* 7: TRAPV instruction */
COPY_ENTRY, /* 8: privilege violation */
COPY_ENTRY, /* 9: trace */
COPY_ENTRY, /* 10: line 1010 emulator */
COPY_ENTRY, /* 11: line 1111 emulator */
COPY_ENTRY, /* 12: unassigned, reserved */
COPY_ENTRY, /* 13: coprocessor protocol violatio */
COPY_ENTRY, /* 14: format error */
COPY_ENTRY, /* 15: uninitialized interrupt vecto */
COPY_ENTRY, /* 16: unassigned, reserved */
COPY_ENTRY, /* 17: unassigned, reserved */
COPY_ENTRY, /* 18: unassigned, reserved */
COPY_ENTRY, /* 19: unassigned, reserved */
COPY_ENTRY, /* 20: unassigned, reserved */
COPY_ENTRY, /* 21: unassigned, reserved */
COPY_ENTRY, /* 22: unassigned, reserved */
COPY_ENTRY, /* 23: unassigned, reserved */
buserr, /* 2: bus error */
addrerr, /* 3: address error */
illinst, /* 4: illegal instruction */
zerodiv, /* 5: zero divide */
chkinst, /* 6: CHK instruction */
trapvinst, /* 7: TRAPV instruction */
privinst, /* 8: privilege violation */
trace, /* 9: trace */
illinst, /* 10: line 1010 emulator */
fpfline, /* 11: line 1111 emulator */
badtrap, /* 12: unassigned, reserved */
coperr, /* 13: coprocessor protocol violatio */
fmterr, /* 14: format error */
badtrap, /* 15: uninitialized interrupt vecto */
badtrap, /* 16: unassigned, reserved */
badtrap, /* 17: unassigned, reserved */
badtrap, /* 18: unassigned, reserved */
badtrap, /* 19: unassigned, reserved */
badtrap, /* 20: unassigned, reserved */
badtrap, /* 21: unassigned, reserved */
badtrap, /* 22: unassigned, reserved */
badtrap, /* 23: unassigned, reserved */
COPY_ENTRY, /* 24: spurious interrupt */
COPY_ENTRY, /* 25: level 1 interrupt autovector */
COPY_ENTRY, /* 26: level 2 interrupt autovector */
@ -72,53 +89,53 @@ unsigned int vector_table[NVECTORS] = {
COPY_ENTRY, /* 29: level 5 interrupt autovector */
COPY_ENTRY, /* 30: level 6 interrupt autovector */
COPY_ENTRY, /* 31: level 7 interrupt autovector */
COPY_ENTRY, /* 32: syscalls (at least on hp300)
COPY_ENTRY, /* 33: sigreturn syscall or breakpoi */
COPY_ENTRY, /* 34: breakpoint or sigreturn sysca */
COPY_ENTRY, /* 35: TRAP instruction vector */
COPY_ENTRY, /* 36: TRAP instruction vector */
COPY_ENTRY, /* 37: TRAP instruction vector */
COPY_ENTRY, /* 38: TRAP instruction vector */
COPY_ENTRY, /* 39: TRAP instruction vector */
COPY_ENTRY, /* 40: TRAP instruction vector */
COPY_ENTRY, /* 41: TRAP instruction vector */
COPY_ENTRY, /* 42: TRAP instruction vector */
COPY_ENTRY, /* 43: TRAP instruction vector */
COPY_ENTRY, /* 44: TRAP instruction vector */
COPY_ENTRY, /* 45: TRAP instruction vector */
COPY_ENTRY, /* 46: TRAP instruction vector */
COPY_ENTRY, /* 47: TRAP instruction vector */
COPY_ENTRY, /* 48: FPCP branch/set on unordered */
COPY_ENTRY, /* 49: FPCP inexact result */
COPY_ENTRY, /* 50: FPCP divide by zero */
COPY_ENTRY, /* 51: FPCP underflow */
COPY_ENTRY, /* 52: FPCP operand error */
COPY_ENTRY, /* 53: FPCP overflow */
COPY_ENTRY, /* 54: FPCP signalling NAN */
COPY_ENTRY, /* 55: FPCP unimplemented data type */
COPY_ENTRY, /* 56: unassigned, reserved */
COPY_ENTRY, /* 57: unassigned, reserved */
COPY_ENTRY, /* 58: unassigned, reserved */
COPY_ENTRY, /* 59: unassigned, reserved */
COPY_ENTRY, /* 60: unassigned, reserved */
COPY_ENTRY, /* 61: unassigned, reserved */
COPY_ENTRY, /* 62: unassigned, reserved */
COPY_ENTRY, /* 63: unassigned, reserved */
trap0, /* 32: syscalls (at least on hp300) */
trap1, /* 33: sigreturn syscall or breakpoi */
trap2, /* 34: breakpoint or sigreturn sysca */
illinst, /* 35: TRAP instruction vector */
illinst, /* 36: TRAP instruction vector */
illinst, /* 37: TRAP instruction vector */
illinst, /* 38: TRAP instruction vector */
illinst, /* 39: TRAP instruction vector */
illinst, /* 40: TRAP instruction vector */
illinst, /* 41: TRAP instruction vector */
illinst, /* 42: TRAP instruction vector */
illinst, /* 43: TRAP instruction vector */
COPY_ENTRY, /* 44: TRAP instruction vector */
illinst, /* 45: TRAP instruction vector */
illinst, /* 46: TRAP instruction vector */
trap15, /* 47: TRAP instruction vector */
fpbsun, /* 48: FPCP branch/set on unordered */
fpinex, /* 49: FPCP inexact result */
fpdz, /* 50: FPCP divide by zero */
fpunfl, /* 51: FPCP underflow */
fpoperr, /* 52: FPCP operand error */
fpovfl, /* 53: FPCP overflow */
fpsnan, /* 54: FPCP signalling NAN */
fpunsupp, /* 55: FPCP unimplemented data type */
badtrap, /* 56: unassigned, reserved */
badtrap, /* 57: unassigned, reserved */
badtrap, /* 58: unassigned, reserved */
badtrap, /* 59: unassigned, reserved */
badtrap, /* 60: unassigned, reserved */
badtrap, /* 61: unassigned, reserved */
badtrap, /* 62: unassigned, reserved */
badtrap, /* 63: unassigned, reserved */
COPY_ENTRY16, /* 64-79 */
COPY_ENTRY16, /* 80-95 */
COPY_ENTRY16, /* 96-111 */
COPY_ENTRY16, /* 112-127 */
BADTRAP16, /* 64-79 */
BADTRAP16, /* 80-95 */
BADTRAP16, /* 96-111 */
BADTRAP16, /* 112-127 */
COPY_ENTRY16, /* 128-143 */
COPY_ENTRY16, /* 144-159 */
COPY_ENTRY16, /* 160-175 */
COPY_ENTRY16, /* 176-191 */
BADTRAP16, /* 128-143 */
BADTRAP16, /* 144-159 */
BADTRAP16, /* 160-175 */
BADTRAP16, /* 176-191 */
COPY_ENTRY16, /* 192-207 */
COPY_ENTRY16, /* 208-223 */
COPY_ENTRY16, /* 224-239 */
COPY_ENTRY16 /* 240-255 */
BADTRAP16, /* 192-207 */
BADTRAP16, /* 208-223 */
BADTRAP16, /* 224-239 */
BADTRAP16 /* 240-255 */
};
@ -128,7 +145,7 @@ void set_vector_entry(entry, handler)
{
if ((entry <0) || (entry >= NVECTORS))
panic("set_vector_entry: setting vector too high or low\n");
vector_table[entry] = (unsigned int) handler;
vector_table[entry] = handler;
}
unsigned int get_vector_entry(entry)
@ -136,5 +153,6 @@ unsigned int get_vector_entry(entry)
{
if ((entry <0) || (entry >= NVECTORS))
panic("get_vector_entry: setting vector too high or low\n");
return vector_table[entry];
return (unsigned int) vector_table[entry];
}

View File

@ -28,7 +28,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Header: /cvsroot/src/sys/arch/sun3/sun3/Attic/vector.h,v 1.3 1993/08/28 15:38:38 glass Exp $
* $Header: /cvsroot/src/sys/arch/sun3/sun3/Attic/vector.h,v 1.4 1993/10/12 05:28:26 glass Exp $
*/
#define COPY_ENTRY 0
@ -37,7 +37,7 @@
#define VEC_INTERRUPT_BASE 0x18
#define VEC_LEVEL_7_INT 0x1F
extern unsigned int vector_table[];
extern void (*vector_table[])();
void set_vector_entry __P((int, void (*handler)()));
unsigned int get_vector_entry __P((int));

View File

@ -88,7 +88,7 @@ cpu_fork(p1, p2)
offset = getsp() - kstack;
bcopy((caddr_t)kstack + offset, (caddr_t)p2->p_addr + offset,
(unsigned) ctob(UPAGES) - offset);
save_u_area(&p2->p_addr->u_pcb, p2->p_addr);
PMAP_ACTIVATE(&p2->p_vmspace->vm_pmap, &up->u_pcb, 0);
/*