hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/* 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