Fix a couple of %y register save/restore errors, inspired from OpenBSD.

revision 1.44
  date: 2004/04/23 04:18:17;  author: marc;  state: Exp;  lines: +5 -4

  fix a couple of %y register save/restore errors
  1) don't save %y in a register that is later used before restoring %y
  2) always restore %y after calling a signal handler
  tested by drahn@, OK pval
This commit is contained in:
nakayama 2006-09-16 08:29:06 +00:00
parent 658b31f04b
commit ff1d071129

View File

@ -1,4 +1,4 @@
/* $NetBSD: locore.s,v 1.216 2006/09/15 07:42:38 martin Exp $ */
/* $NetBSD: locore.s,v 1.217 2006/09/16 08:29:06 nakayama Exp $ */
/*
* Copyright (c) 1996-2002 Eduardo Horvath
@ -2693,7 +2693,7 @@ Ldatafault_internal:
stx %g4, [%sp + CC64FSZ + STKB + TF_G + (4*8)] ! sneak in g4
rdpr %tnpc, %g3
stx %g5, [%sp + CC64FSZ + STKB + TF_G + (5*8)] ! sneak in g5
rd %y, %g4 ! save y
rd %y, %g5 ! save y
stx %g6, [%sp + CC64FSZ + STKB + TF_G + (6*8)] ! sneak in g6
mov %g2, %o7 ! Make the fault address look like the return address
stx %g7, [%sp + CC64FSZ + STKB + TF_G + (7*8)] ! sneak in g7
@ -2708,9 +2708,9 @@ Ldatafault_internal:
stx %g2, [%sp + CC64FSZ + STKB + TF_PC] ! set tf.tf_npc
stx %g3, [%sp + CC64FSZ + STKB + TF_NPC]
rdpr %pil, %g5
stb %g5, [%sp + CC64FSZ + STKB + TF_PIL]
stb %g5, [%sp + CC64FSZ + STKB + TF_OLDPIL]
rdpr %pil, %g4
stb %g4, [%sp + CC64FSZ + STKB + TF_PIL]
stb %g4, [%sp + CC64FSZ + STKB + TF_OLDPIL]
#if 1
rdpr %tl, %g7
@ -2758,7 +2758,7 @@ Ldatafault_internal:
*/
cmp %o1, T_DATA_ERROR
st %g4, [%sp + CC64FSZ + STKB + TF_Y]
st %g5, [%sp + CC64FSZ + STKB + TF_Y]
wr %g0, ASI_PRIMARY_NOFAULT, %asi ! Restore default ASI
be,pn %icc, data_error
wrpr %g0, PSTATE_INTR, %pstate ! reenable interrupts
@ -2956,7 +2956,7 @@ textfault:
stx %g6, [%sp + CC64FSZ + STKB + TF_G + (6*8)] ! sneak in g6
rdpr %tnpc, %g3
stx %g7, [%sp + CC64FSZ + STKB + TF_G + (7*8)] ! sneak in g7
rd %y, %g7 ! save y
rd %y, %g5 ! save y
/* Finish stackframe, call C trap handler */
stx %g1, [%sp + CC64FSZ + STKB + TF_TSTATE] ! set tf.tf_psr, tf.tf_pc
@ -2965,9 +2965,9 @@ textfault:
stx %o2, [%sp + CC64FSZ + STKB + TF_PC]
stx %g3, [%sp + CC64FSZ + STKB + TF_NPC] ! set tf.tf_npc
rdpr %pil, %g5
stb %g5, [%sp + CC64FSZ + STKB + TF_PIL]
stb %g5, [%sp + CC64FSZ + STKB + TF_OLDPIL]
rdpr %pil, %g4
stb %g4, [%sp + CC64FSZ + STKB + TF_PIL]
stb %g4, [%sp + CC64FSZ + STKB + TF_OLDPIL]
rdpr %tl, %g7
dec %g7
@ -2985,7 +2985,7 @@ textfault:
/* Use trap type to see what handler to call */
cmp %o1, T_INST_ERROR
be,pn %xcc, text_error
st %g7, [%sp + CC64FSZ + STKB + TF_Y] ! set tf.tf_y
st %g5, [%sp + CC64FSZ + STKB + TF_Y] ! set tf.tf_y
wrpr %g0, PSTATE_INTR, %pstate ! reenable interrupts
call _C_LABEL(text_access_fault) ! mem_access_fault(&tf, type, pc, sfsr)
@ -5975,6 +5975,7 @@ ENTRY_NOPROFILE(sigcode)
lduw [%fp + BIAS + 128 + 4], %o1 ! code
call %g1 ! (*sa->sa_handler)(sig,code,scp)
add %fp, BIAS + 128 + 8, %o2 ! scp
wr %l1, %g0, %y ! in any case, restore %y
/*
* Now that the handler has returned, re-establish all the state
@ -5994,7 +5995,7 @@ ENTRY_NOPROFILE(sigcode)
ldda [%l0] ASI_BLK_P, %f16
1:
bz,pt %icc, 2f
wr %l1, %g0, %y ! in any case, restore %y
nop
add %sp, BIAS+CC64FSZ+BLOCK_SIZE, %l0 ! Generate a pointer so we can
andn %l0, BLOCK_ALIGN, %l0 ! do a block load
inc 2*BLOCK_SIZE, %l0 ! and skip what we already loaded