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