Linux Audio

Check our new training course

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