1*a88b5ba8SSam Ravnborg/* winfixup.S: Handle cases where user stack pointer is found to be bogus. 2*a88b5ba8SSam Ravnborg * 3*a88b5ba8SSam Ravnborg * Copyright (C) 1997, 2006 David S. Miller (davem@davemloft.net) 4*a88b5ba8SSam Ravnborg */ 5*a88b5ba8SSam Ravnborg 6*a88b5ba8SSam Ravnborg#include <asm/asi.h> 7*a88b5ba8SSam Ravnborg#include <asm/head.h> 8*a88b5ba8SSam Ravnborg#include <asm/page.h> 9*a88b5ba8SSam Ravnborg#include <asm/ptrace.h> 10*a88b5ba8SSam Ravnborg#include <asm/processor.h> 11*a88b5ba8SSam Ravnborg#include <asm/spitfire.h> 12*a88b5ba8SSam Ravnborg#include <asm/thread_info.h> 13*a88b5ba8SSam Ravnborg 14*a88b5ba8SSam Ravnborg .text 15*a88b5ba8SSam Ravnborg 16*a88b5ba8SSam Ravnborg /* It used to be the case that these register window fault 17*a88b5ba8SSam Ravnborg * handlers could run via the save and restore instructions 18*a88b5ba8SSam Ravnborg * done by the trap entry and exit code. They now do the 19*a88b5ba8SSam Ravnborg * window spill/fill by hand, so that case no longer can occur. 20*a88b5ba8SSam Ravnborg */ 21*a88b5ba8SSam Ravnborg 22*a88b5ba8SSam Ravnborg .align 32 23*a88b5ba8SSam Ravnborgfill_fixup: 24*a88b5ba8SSam Ravnborg TRAP_LOAD_THREAD_REG(%g6, %g1) 25*a88b5ba8SSam Ravnborg rdpr %tstate, %g1 26*a88b5ba8SSam Ravnborg and %g1, TSTATE_CWP, %g1 27*a88b5ba8SSam Ravnborg or %g4, FAULT_CODE_WINFIXUP, %g4 28*a88b5ba8SSam Ravnborg stb %g4, [%g6 + TI_FAULT_CODE] 29*a88b5ba8SSam Ravnborg stx %g5, [%g6 + TI_FAULT_ADDR] 30*a88b5ba8SSam Ravnborg wrpr %g1, %cwp 31*a88b5ba8SSam Ravnborg ba,pt %xcc, etrap 32*a88b5ba8SSam Ravnborg rd %pc, %g7 33*a88b5ba8SSam Ravnborg call do_sparc64_fault 34*a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 35*a88b5ba8SSam Ravnborg ba,pt %xcc, rtrap 36*a88b5ba8SSam Ravnborg nop 37*a88b5ba8SSam Ravnborg 38*a88b5ba8SSam Ravnborg /* Be very careful about usage of the trap globals here. 39*a88b5ba8SSam Ravnborg * You cannot touch %g5 as that has the fault information. 40*a88b5ba8SSam Ravnborg */ 41*a88b5ba8SSam Ravnborgspill_fixup: 42*a88b5ba8SSam Ravnborgspill_fixup_mna: 43*a88b5ba8SSam Ravnborgspill_fixup_dax: 44*a88b5ba8SSam Ravnborg TRAP_LOAD_THREAD_REG(%g6, %g1) 45*a88b5ba8SSam Ravnborg ldx [%g6 + TI_FLAGS], %g1 46*a88b5ba8SSam Ravnborg andcc %g1, _TIF_32BIT, %g0 47*a88b5ba8SSam Ravnborg ldub [%g6 + TI_WSAVED], %g1 48*a88b5ba8SSam Ravnborg sll %g1, 3, %g3 49*a88b5ba8SSam Ravnborg add %g6, %g3, %g3 50*a88b5ba8SSam Ravnborg stx %sp, [%g3 + TI_RWIN_SPTRS] 51*a88b5ba8SSam Ravnborg sll %g1, 7, %g3 52*a88b5ba8SSam Ravnborg bne,pt %xcc, 1f 53*a88b5ba8SSam Ravnborg add %g6, %g3, %g3 54*a88b5ba8SSam Ravnborg stx %l0, [%g3 + TI_REG_WINDOW + 0x00] 55*a88b5ba8SSam Ravnborg stx %l1, [%g3 + TI_REG_WINDOW + 0x08] 56*a88b5ba8SSam Ravnborg stx %l2, [%g3 + TI_REG_WINDOW + 0x10] 57*a88b5ba8SSam Ravnborg stx %l3, [%g3 + TI_REG_WINDOW + 0x18] 58*a88b5ba8SSam Ravnborg stx %l4, [%g3 + TI_REG_WINDOW + 0x20] 59*a88b5ba8SSam Ravnborg stx %l5, [%g3 + TI_REG_WINDOW + 0x28] 60*a88b5ba8SSam Ravnborg stx %l6, [%g3 + TI_REG_WINDOW + 0x30] 61*a88b5ba8SSam Ravnborg stx %l7, [%g3 + TI_REG_WINDOW + 0x38] 62*a88b5ba8SSam Ravnborg stx %i0, [%g3 + TI_REG_WINDOW + 0x40] 63*a88b5ba8SSam Ravnborg stx %i1, [%g3 + TI_REG_WINDOW + 0x48] 64*a88b5ba8SSam Ravnborg stx %i2, [%g3 + TI_REG_WINDOW + 0x50] 65*a88b5ba8SSam Ravnborg stx %i3, [%g3 + TI_REG_WINDOW + 0x58] 66*a88b5ba8SSam Ravnborg stx %i4, [%g3 + TI_REG_WINDOW + 0x60] 67*a88b5ba8SSam Ravnborg stx %i5, [%g3 + TI_REG_WINDOW + 0x68] 68*a88b5ba8SSam Ravnborg stx %i6, [%g3 + TI_REG_WINDOW + 0x70] 69*a88b5ba8SSam Ravnborg ba,pt %xcc, 2f 70*a88b5ba8SSam Ravnborg stx %i7, [%g3 + TI_REG_WINDOW + 0x78] 71*a88b5ba8SSam Ravnborg1: stw %l0, [%g3 + TI_REG_WINDOW + 0x00] 72*a88b5ba8SSam Ravnborg stw %l1, [%g3 + TI_REG_WINDOW + 0x04] 73*a88b5ba8SSam Ravnborg stw %l2, [%g3 + TI_REG_WINDOW + 0x08] 74*a88b5ba8SSam Ravnborg stw %l3, [%g3 + TI_REG_WINDOW + 0x0c] 75*a88b5ba8SSam Ravnborg stw %l4, [%g3 + TI_REG_WINDOW + 0x10] 76*a88b5ba8SSam Ravnborg stw %l5, [%g3 + TI_REG_WINDOW + 0x14] 77*a88b5ba8SSam Ravnborg stw %l6, [%g3 + TI_REG_WINDOW + 0x18] 78*a88b5ba8SSam Ravnborg stw %l7, [%g3 + TI_REG_WINDOW + 0x1c] 79*a88b5ba8SSam Ravnborg stw %i0, [%g3 + TI_REG_WINDOW + 0x20] 80*a88b5ba8SSam Ravnborg stw %i1, [%g3 + TI_REG_WINDOW + 0x24] 81*a88b5ba8SSam Ravnborg stw %i2, [%g3 + TI_REG_WINDOW + 0x28] 82*a88b5ba8SSam Ravnborg stw %i3, [%g3 + TI_REG_WINDOW + 0x2c] 83*a88b5ba8SSam Ravnborg stw %i4, [%g3 + TI_REG_WINDOW + 0x30] 84*a88b5ba8SSam Ravnborg stw %i5, [%g3 + TI_REG_WINDOW + 0x34] 85*a88b5ba8SSam Ravnborg stw %i6, [%g3 + TI_REG_WINDOW + 0x38] 86*a88b5ba8SSam Ravnborg stw %i7, [%g3 + TI_REG_WINDOW + 0x3c] 87*a88b5ba8SSam Ravnborg2: add %g1, 1, %g1 88*a88b5ba8SSam Ravnborg stb %g1, [%g6 + TI_WSAVED] 89*a88b5ba8SSam Ravnborg rdpr %tstate, %g1 90*a88b5ba8SSam Ravnborg andcc %g1, TSTATE_PRIV, %g0 91*a88b5ba8SSam Ravnborg saved 92*a88b5ba8SSam Ravnborg be,pn %xcc, 1f 93*a88b5ba8SSam Ravnborg and %g1, TSTATE_CWP, %g1 94*a88b5ba8SSam Ravnborg retry 95*a88b5ba8SSam Ravnborg1: mov FAULT_CODE_WRITE | FAULT_CODE_DTLB | FAULT_CODE_WINFIXUP, %g4 96*a88b5ba8SSam Ravnborg stb %g4, [%g6 + TI_FAULT_CODE] 97*a88b5ba8SSam Ravnborg stx %g5, [%g6 + TI_FAULT_ADDR] 98*a88b5ba8SSam Ravnborg wrpr %g1, %cwp 99*a88b5ba8SSam Ravnborg ba,pt %xcc, etrap 100*a88b5ba8SSam Ravnborg rd %pc, %g7 101*a88b5ba8SSam Ravnborg call do_sparc64_fault 102*a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 103*a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 104*a88b5ba8SSam Ravnborg 105*a88b5ba8SSam Ravnborgwinfix_mna: 106*a88b5ba8SSam Ravnborg andn %g3, 0x7f, %g3 107*a88b5ba8SSam Ravnborg add %g3, 0x78, %g3 108*a88b5ba8SSam Ravnborg wrpr %g3, %tnpc 109*a88b5ba8SSam Ravnborg done 110*a88b5ba8SSam Ravnborg 111*a88b5ba8SSam Ravnborgfill_fixup_mna: 112*a88b5ba8SSam Ravnborg rdpr %tstate, %g1 113*a88b5ba8SSam Ravnborg and %g1, TSTATE_CWP, %g1 114*a88b5ba8SSam Ravnborg wrpr %g1, %cwp 115*a88b5ba8SSam Ravnborg ba,pt %xcc, etrap 116*a88b5ba8SSam Ravnborg rd %pc, %g7 117*a88b5ba8SSam Ravnborg sethi %hi(tlb_type), %g1 118*a88b5ba8SSam Ravnborg lduw [%g1 + %lo(tlb_type)], %g1 119*a88b5ba8SSam Ravnborg cmp %g1, 3 120*a88b5ba8SSam Ravnborg bne,pt %icc, 1f 121*a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 122*a88b5ba8SSam Ravnborg mov %l4, %o2 123*a88b5ba8SSam Ravnborg call sun4v_do_mna 124*a88b5ba8SSam Ravnborg mov %l5, %o1 125*a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 126*a88b5ba8SSam Ravnborg1: mov %l4, %o1 127*a88b5ba8SSam Ravnborg mov %l5, %o2 128*a88b5ba8SSam Ravnborg call mem_address_unaligned 129*a88b5ba8SSam Ravnborg nop 130*a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 131*a88b5ba8SSam Ravnborg 132*a88b5ba8SSam Ravnborgwinfix_dax: 133*a88b5ba8SSam Ravnborg andn %g3, 0x7f, %g3 134*a88b5ba8SSam Ravnborg add %g3, 0x74, %g3 135*a88b5ba8SSam Ravnborg wrpr %g3, %tnpc 136*a88b5ba8SSam Ravnborg done 137*a88b5ba8SSam Ravnborg 138*a88b5ba8SSam Ravnborgfill_fixup_dax: 139*a88b5ba8SSam Ravnborg rdpr %tstate, %g1 140*a88b5ba8SSam Ravnborg and %g1, TSTATE_CWP, %g1 141*a88b5ba8SSam Ravnborg wrpr %g1, %cwp 142*a88b5ba8SSam Ravnborg ba,pt %xcc, etrap 143*a88b5ba8SSam Ravnborg rd %pc, %g7 144*a88b5ba8SSam Ravnborg sethi %hi(tlb_type), %g1 145*a88b5ba8SSam Ravnborg mov %l4, %o1 146*a88b5ba8SSam Ravnborg lduw [%g1 + %lo(tlb_type)], %g1 147*a88b5ba8SSam Ravnborg mov %l5, %o2 148*a88b5ba8SSam Ravnborg cmp %g1, 3 149*a88b5ba8SSam Ravnborg bne,pt %icc, 1f 150*a88b5ba8SSam Ravnborg add %sp, PTREGS_OFF, %o0 151*a88b5ba8SSam Ravnborg call sun4v_data_access_exception 152*a88b5ba8SSam Ravnborg nop 153*a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 154*a88b5ba8SSam Ravnborg1: call spitfire_data_access_exception 155*a88b5ba8SSam Ravnborg nop 156*a88b5ba8SSam Ravnborg ba,a,pt %xcc, rtrap 157