Skip to content

Commit 56a433f

Browse files
committed
wip: LoongArch: use trampoline for exception handlers
Signed-off-by: Xi Ruoyao <xry111@xry111.site>
1 parent ff846b2 commit 56a433f

File tree

3 files changed

+21
-10
lines changed

3 files changed

+21
-10
lines changed

arch/loongarch/kernel/genex.S

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ SYM_FUNC_START(__arch_cpu_idle)
3232
SYM_FUNC_END(__arch_cpu_idle)
3333

3434
SYM_FUNC_START(handle_vint)
35-
BACKUP_T0T1
35+
# BACKUP_T0T1
3636
SAVE_ALL
3737
la.abs t1, __arch_cpu_idle
3838
LONG_L t0, sp, PT_ERA
@@ -67,7 +67,7 @@ SYM_FUNC_END(except_vec_cex)
6767
.macro BUILD_HANDLER exception handler prep
6868
.align 5
6969
SYM_FUNC_START(handle_\exception)
70-
BACKUP_T0T1
70+
# BACKUP_T0T1
7171
SAVE_ALL
7272
build_prep_\prep
7373
move a0, sp
@@ -93,3 +93,12 @@ SYM_FUNC_START(handle_sys)
9393
la.abs t0, handle_syscall
9494
jr t0
9595
SYM_FUNC_END(handle_sys)
96+
97+
SYM_FUNC_START(handler_trampoline)
98+
csrwr t0, EXCEPTION_KS0
99+
csrwr t1, EXCEPTION_KS1
100+
pcaddi t0, 0
101+
ld.d t0, t0, 16
102+
jr t0
103+
nop
104+
SYM_FUNC_END(handler_trampoline)

arch/loongarch/kernel/traps.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ extern asmlinkage void handle_lasx(void);
6060
extern asmlinkage void handle_reserved(void);
6161
extern asmlinkage void handle_watch(void);
6262
extern asmlinkage void handle_vint(void);
63+
extern asmlinkage void handler_trampoline(void);
6364

6465
static void show_backtrace(struct task_struct *task, const struct pt_regs *regs,
6566
const char *loglvl, bool user)
@@ -677,7 +678,8 @@ void per_cpu_trap_init(int cpu)
677678
/* Install CPU exception handler */
678679
void set_handler(unsigned long offset, void *addr, unsigned long size)
679680
{
680-
memcpy((void *)(eentry + offset), addr, size);
681+
memcpy((void *)(eentry + offset), &handler_trampoline, 24);
682+
memcpy((void *)(eentry + offset + 24), &addr, 8);
681683
local_flush_icache_range(eentry + offset, eentry + offset + size);
682684
}
683685

arch/loongarch/mm/tlbex.S

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
tlb_do_page_fault 1
2828

2929
SYM_FUNC_START(handle_tlb_protect)
30-
BACKUP_T0T1
30+
# BACKUP_T0T1
3131
SAVE_ALL
3232
move a0, sp
3333
move a1, zero
@@ -39,8 +39,8 @@ SYM_FUNC_START(handle_tlb_protect)
3939
SYM_FUNC_END(handle_tlb_protect)
4040

4141
SYM_FUNC_START(handle_tlb_load)
42-
csrwr t0, EXCEPTION_KS0
43-
csrwr t1, EXCEPTION_KS1
42+
#csrwr t0, EXCEPTION_KS0
43+
#csrwr t1, EXCEPTION_KS1
4444
csrwr ra, EXCEPTION_KS2
4545

4646
/*
@@ -202,8 +202,8 @@ nopage_tlb_load:
202202
SYM_FUNC_END(handle_tlb_load)
203203

204204
SYM_FUNC_START(handle_tlb_store)
205-
csrwr t0, EXCEPTION_KS0
206-
csrwr t1, EXCEPTION_KS1
205+
#csrwr t0, EXCEPTION_KS0
206+
#csrwr t1, EXCEPTION_KS1
207207
csrwr ra, EXCEPTION_KS2
208208

209209
/*
@@ -370,8 +370,8 @@ nopage_tlb_store:
370370
SYM_FUNC_END(handle_tlb_store)
371371

372372
SYM_FUNC_START(handle_tlb_modify)
373-
csrwr t0, EXCEPTION_KS0
374-
csrwr t1, EXCEPTION_KS1
373+
#csrwr t0, EXCEPTION_KS0
374+
#csrwr t1, EXCEPTION_KS1
375375
csrwr ra, EXCEPTION_KS2
376376

377377
/*

0 commit comments

Comments
 (0)