mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.0 KiB
105 lines
2.0 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
#include <asm/thread_info.h> |
|
#include <asm/trap_block.h> |
|
#include <asm/spitfire.h> |
|
#include <asm/ptrace.h> |
|
#include <asm/head.h> |
|
|
|
.text |
|
.align 8 |
|
.globl user_rtt_fill_fixup_common |
|
user_rtt_fill_fixup_common: |
|
rdpr %cwp, %g1 |
|
add %g1, 1, %g1 |
|
wrpr %g1, 0x0, %cwp |
|
|
|
rdpr %wstate, %g2 |
|
sll %g2, 3, %g2 |
|
wrpr %g2, 0x0, %wstate |
|
|
|
/* We know %canrestore and %otherwin are both zero. */ |
|
|
|
sethi %hi(sparc64_kern_pri_context), %g2 |
|
ldx [%g2 + %lo(sparc64_kern_pri_context)], %g2 |
|
mov PRIMARY_CONTEXT, %g1 |
|
|
|
661: stxa %g2, [%g1] ASI_DMMU |
|
.section .sun4v_1insn_patch, "ax" |
|
.word 661b |
|
stxa %g2, [%g1] ASI_MMU |
|
.previous |
|
|
|
sethi %hi(KERNBASE), %g1 |
|
flush %g1 |
|
|
|
mov %g4, %l4 |
|
mov %g5, %l5 |
|
brnz,pn %g3, 1f |
|
mov %g3, %l3 |
|
|
|
or %g4, FAULT_CODE_WINFIXUP, %g4 |
|
stb %g4, [%g6 + TI_FAULT_CODE] |
|
stx %g5, [%g6 + TI_FAULT_ADDR] |
|
1: |
|
mov %g6, %l1 |
|
wrpr %g0, 0x0, %tl |
|
|
|
661: nop |
|
.section .sun4v_1insn_patch, "ax" |
|
.word 661b |
|
SET_GL(0) |
|
.previous |
|
|
|
661: wrpr %g0, RTRAP_PSTATE, %pstate |
|
.section .sun_m7_1insn_patch, "ax" |
|
.word 661b |
|
/* Re-enable PSTATE.mcde to maintain ADI security */ |
|
wrpr %g0, RTRAP_PSTATE|PSTATE_MCDE, %pstate |
|
.previous |
|
|
|
mov %l1, %g6 |
|
ldx [%g6 + TI_TASK], %g4 |
|
LOAD_PER_CPU_BASE(%g5, %g6, %g1, %g2, %g3) |
|
|
|
brnz,pn %l3, 1f |
|
nop |
|
|
|
call do_sparc64_fault |
|
add %sp, PTREGS_OFF, %o0 |
|
ba,pt %xcc, rtrap |
|
nop |
|
|
|
1: cmp %g3, 2 |
|
bne,pn %xcc, 2f |
|
nop |
|
|
|
sethi %hi(tlb_type), %g1 |
|
lduw [%g1 + %lo(tlb_type)], %g1 |
|
cmp %g1, 3 |
|
bne,pt %icc, 1f |
|
add %sp, PTREGS_OFF, %o0 |
|
mov %l4, %o2 |
|
call sun4v_do_mna |
|
mov %l5, %o1 |
|
ba,a,pt %xcc, rtrap |
|
1: mov %l4, %o1 |
|
mov %l5, %o2 |
|
call mem_address_unaligned |
|
nop |
|
ba,a,pt %xcc, rtrap |
|
|
|
2: sethi %hi(tlb_type), %g1 |
|
mov %l4, %o1 |
|
lduw [%g1 + %lo(tlb_type)], %g1 |
|
mov %l5, %o2 |
|
cmp %g1, 3 |
|
bne,pt %icc, 1f |
|
add %sp, PTREGS_OFF, %o0 |
|
call sun4v_data_access_exception |
|
nop |
|
ba,a,pt %xcc, rtrap |
|
nop |
|
|
|
1: call spitfire_data_access_exception |
|
nop |
|
ba,a,pt %xcc, rtrap
|
|
|