Loading...
Note: File does not exist in v3.1.
1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Author: Qi Hu <huqi@loongson.cn>
4 * Huacai Chen <chenhuacai@loongson.cn>
5 *
6 * Copyright (C) 2020-2023 Loongson Technology Corporation Limited
7 */
8#include <asm/asm.h>
9#include <asm/asmmacro.h>
10#include <asm/asm-extable.h>
11#include <asm/asm-offsets.h>
12#include <asm/errno.h>
13#include <asm/regdef.h>
14
15#define SCR_REG_WIDTH 8
16
17 .macro EX insn, reg, src, offs
18.ex\@: \insn \reg, \src, \offs
19 _asm_extable .ex\@, .L_lbt_fault
20 .endm
21
22/*
23 * Save a thread's lbt context.
24 */
25SYM_FUNC_START(_save_lbt)
26 movscr2gr t1, $scr0 # save scr
27 stptr.d t1, a0, THREAD_SCR0
28 movscr2gr t1, $scr1
29 stptr.d t1, a0, THREAD_SCR1
30 movscr2gr t1, $scr2
31 stptr.d t1, a0, THREAD_SCR2
32 movscr2gr t1, $scr3
33 stptr.d t1, a0, THREAD_SCR3
34
35 x86mfflag t1, 0x3f # save eflags
36 stptr.d t1, a0, THREAD_EFLAGS
37 jr ra
38SYM_FUNC_END(_save_lbt)
39EXPORT_SYMBOL(_save_lbt)
40
41/*
42 * Restore a thread's lbt context.
43 */
44SYM_FUNC_START(_restore_lbt)
45 ldptr.d t1, a0, THREAD_SCR0 # restore scr
46 movgr2scr $scr0, t1
47 ldptr.d t1, a0, THREAD_SCR1
48 movgr2scr $scr1, t1
49 ldptr.d t1, a0, THREAD_SCR2
50 movgr2scr $scr2, t1
51 ldptr.d t1, a0, THREAD_SCR3
52 movgr2scr $scr3, t1
53
54 ldptr.d t1, a0, THREAD_EFLAGS # restore eflags
55 x86mtflag t1, 0x3f
56 jr ra
57SYM_FUNC_END(_restore_lbt)
58EXPORT_SYMBOL(_restore_lbt)
59
60/*
61 * Load scr/eflag with zero.
62 */
63SYM_FUNC_START(_init_lbt)
64 movgr2scr $scr0, zero
65 movgr2scr $scr1, zero
66 movgr2scr $scr2, zero
67 movgr2scr $scr3, zero
68
69 x86mtflag zero, 0x3f
70 jr ra
71SYM_FUNC_END(_init_lbt)
72
73/*
74 * a0: scr
75 * a1: eflag
76 */
77SYM_FUNC_START(_save_lbt_context)
78 movscr2gr t1, $scr0 # save scr
79 EX st.d t1, a0, (0 * SCR_REG_WIDTH)
80 movscr2gr t1, $scr1
81 EX st.d t1, a0, (1 * SCR_REG_WIDTH)
82 movscr2gr t1, $scr2
83 EX st.d t1, a0, (2 * SCR_REG_WIDTH)
84 movscr2gr t1, $scr3
85 EX st.d t1, a0, (3 * SCR_REG_WIDTH)
86
87 x86mfflag t1, 0x3f # save eflags
88 EX st.w t1, a1, 0
89 li.w a0, 0 # success
90 jr ra
91SYM_FUNC_END(_save_lbt_context)
92
93/*
94 * a0: scr
95 * a1: eflag
96 */
97SYM_FUNC_START(_restore_lbt_context)
98 EX ld.d t1, a0, (0 * SCR_REG_WIDTH) # restore scr
99 movgr2scr $scr0, t1
100 EX ld.d t1, a0, (1 * SCR_REG_WIDTH)
101 movgr2scr $scr1, t1
102 EX ld.d t1, a0, (2 * SCR_REG_WIDTH)
103 movgr2scr $scr2, t1
104 EX ld.d t1, a0, (3 * SCR_REG_WIDTH)
105 movgr2scr $scr3, t1
106
107 EX ld.w t1, a1, 0 # restore eflags
108 x86mtflag t1, 0x3f
109 li.w a0, 0 # success
110 jr ra
111SYM_FUNC_END(_restore_lbt_context)
112
113/*
114 * a0: ftop
115 */
116SYM_FUNC_START(_save_ftop_context)
117 x86mftop t1
118 st.w t1, a0, 0
119 li.w a0, 0 # success
120 jr ra
121SYM_FUNC_END(_save_ftop_context)
122
123/*
124 * a0: ftop
125 */
126SYM_FUNC_START(_restore_ftop_context)
127 ld.w t1, a0, 0
128 andi t1, t1, 0x7
129 la.pcrel a0, 1f
130 alsl.d a0, t1, a0, 3
131 jr a0
1321:
133 x86mttop 0
134 b 2f
135 x86mttop 1
136 b 2f
137 x86mttop 2
138 b 2f
139 x86mttop 3
140 b 2f
141 x86mttop 4
142 b 2f
143 x86mttop 5
144 b 2f
145 x86mttop 6
146 b 2f
147 x86mttop 7
1482:
149 li.w a0, 0 # success
150 jr ra
151SYM_FUNC_END(_restore_ftop_context)
152
153.L_lbt_fault:
154 li.w a0, -EFAULT # failure
155 jr ra