Skip to content

Commit e742bd1

Browse files
committed
Merge tag 'loongarch-fixes-6.15-1' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
Pull LoongArch fixes from Huacai Chen: "Add a missing Kconfig option, fix some bugs in exception handlers, memory management and KVM" * tag 'loongarch-fixes-6.15-1' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson: LoongArch: KVM: Fix PMU pass-through issue if VM exits to host finally LoongArch: KVM: Fully clear some CSRs when VM reboot LoongArch: KVM: Fix multiple typos of KVM code LoongArch: Return NULL from huge_pte_offset() for invalid PMD LoongArch: Remove a bogus reference to ZONE_DMA LoongArch: Handle fp, lsx, lasx and lbt assembly symbols LoongArch: Make do_xyz() exception handlers more robust LoongArch: Make regs_irqs_disabled() more clear LoongArch: Select ARCH_USE_MEMTEST
2 parents ec0c2d5 + 5add0db commit e742bd1

File tree

13 files changed

+68
-58
lines changed

13 files changed

+68
-58
lines changed

arch/loongarch/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ config LOONGARCH
7373
select ARCH_SUPPORTS_RT
7474
select ARCH_USE_BUILTIN_BSWAP
7575
select ARCH_USE_CMPXCHG_LOCKREF
76+
select ARCH_USE_MEMTEST
7677
select ARCH_USE_QUEUED_RWLOCKS
7778
select ARCH_USE_QUEUED_SPINLOCKS
7879
select ARCH_WANT_DEFAULT_BPF_JIT

arch/loongarch/include/asm/fpu.h

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,29 @@
2222
struct sigcontext;
2323

2424
#define kernel_fpu_available() cpu_has_fpu
25-
extern void kernel_fpu_begin(void);
26-
extern void kernel_fpu_end(void);
27-
28-
extern void _init_fpu(unsigned int);
29-
extern void _save_fp(struct loongarch_fpu *);
30-
extern void _restore_fp(struct loongarch_fpu *);
31-
32-
extern void _save_lsx(struct loongarch_fpu *fpu);
33-
extern void _restore_lsx(struct loongarch_fpu *fpu);
34-
extern void _init_lsx_upper(void);
35-
extern void _restore_lsx_upper(struct loongarch_fpu *fpu);
36-
37-
extern void _save_lasx(struct loongarch_fpu *fpu);
38-
extern void _restore_lasx(struct loongarch_fpu *fpu);
39-
extern void _init_lasx_upper(void);
40-
extern void _restore_lasx_upper(struct loongarch_fpu *fpu);
25+
26+
void kernel_fpu_begin(void);
27+
void kernel_fpu_end(void);
28+
29+
asmlinkage void _init_fpu(unsigned int);
30+
asmlinkage void _save_fp(struct loongarch_fpu *);
31+
asmlinkage void _restore_fp(struct loongarch_fpu *);
32+
asmlinkage int _save_fp_context(void __user *fpregs, void __user *fcc, void __user *csr);
33+
asmlinkage int _restore_fp_context(void __user *fpregs, void __user *fcc, void __user *csr);
34+
35+
asmlinkage void _save_lsx(struct loongarch_fpu *fpu);
36+
asmlinkage void _restore_lsx(struct loongarch_fpu *fpu);
37+
asmlinkage void _init_lsx_upper(void);
38+
asmlinkage void _restore_lsx_upper(struct loongarch_fpu *fpu);
39+
asmlinkage int _save_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
40+
asmlinkage int _restore_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
41+
42+
asmlinkage void _save_lasx(struct loongarch_fpu *fpu);
43+
asmlinkage void _restore_lasx(struct loongarch_fpu *fpu);
44+
asmlinkage void _init_lasx_upper(void);
45+
asmlinkage void _restore_lasx_upper(struct loongarch_fpu *fpu);
46+
asmlinkage int _save_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
47+
asmlinkage int _restore_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
4148

4249
static inline void enable_lsx(void);
4350
static inline void disable_lsx(void);

arch/loongarch/include/asm/lbt.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,13 @@
1212
#include <asm/loongarch.h>
1313
#include <asm/processor.h>
1414

15-
extern void _init_lbt(void);
16-
extern void _save_lbt(struct loongarch_lbt *);
17-
extern void _restore_lbt(struct loongarch_lbt *);
15+
asmlinkage void _init_lbt(void);
16+
asmlinkage void _save_lbt(struct loongarch_lbt *);
17+
asmlinkage void _restore_lbt(struct loongarch_lbt *);
18+
asmlinkage int _save_lbt_context(void __user *regs, void __user *eflags);
19+
asmlinkage int _restore_lbt_context(void __user *regs, void __user *eflags);
20+
asmlinkage int _save_ftop_context(void __user *ftop);
21+
asmlinkage int _restore_ftop_context(void __user *ftop);
1822

1923
static inline int is_lbt_enabled(void)
2024
{

arch/loongarch/include/asm/ptrace.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ struct pt_regs {
3333
unsigned long __last[];
3434
} __aligned(8);
3535

36-
static inline int regs_irqs_disabled(struct pt_regs *regs)
36+
static __always_inline bool regs_irqs_disabled(struct pt_regs *regs)
3737
{
38-
return arch_irqs_disabled_flags(regs->csr_prmd);
38+
return !(regs->csr_prmd & CSR_PRMD_PIE);
3939
}
4040

4141
static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)

arch/loongarch/kernel/fpu.S

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ SYM_FUNC_START(_save_fp_context)
458458
li.w a0, 0 # success
459459
jr ra
460460
SYM_FUNC_END(_save_fp_context)
461+
EXPORT_SYMBOL_GPL(_save_fp_context)
461462

462463
/*
463464
* a0: fpregs
@@ -471,6 +472,7 @@ SYM_FUNC_START(_restore_fp_context)
471472
li.w a0, 0 # success
472473
jr ra
473474
SYM_FUNC_END(_restore_fp_context)
475+
EXPORT_SYMBOL_GPL(_restore_fp_context)
474476

475477
/*
476478
* a0: fpregs
@@ -484,6 +486,7 @@ SYM_FUNC_START(_save_lsx_context)
484486
li.w a0, 0 # success
485487
jr ra
486488
SYM_FUNC_END(_save_lsx_context)
489+
EXPORT_SYMBOL_GPL(_save_lsx_context)
487490

488491
/*
489492
* a0: fpregs
@@ -497,6 +500,7 @@ SYM_FUNC_START(_restore_lsx_context)
497500
li.w a0, 0 # success
498501
jr ra
499502
SYM_FUNC_END(_restore_lsx_context)
503+
EXPORT_SYMBOL_GPL(_restore_lsx_context)
500504

501505
/*
502506
* a0: fpregs
@@ -510,6 +514,7 @@ SYM_FUNC_START(_save_lasx_context)
510514
li.w a0, 0 # success
511515
jr ra
512516
SYM_FUNC_END(_save_lasx_context)
517+
EXPORT_SYMBOL_GPL(_save_lasx_context)
513518

514519
/*
515520
* a0: fpregs
@@ -523,6 +528,7 @@ SYM_FUNC_START(_restore_lasx_context)
523528
li.w a0, 0 # success
524529
jr ra
525530
SYM_FUNC_END(_restore_lasx_context)
531+
EXPORT_SYMBOL_GPL(_restore_lasx_context)
526532

527533
.L_fpu_fault:
528534
li.w a0, -EFAULT # failure

arch/loongarch/kernel/lbt.S

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ SYM_FUNC_START(_save_lbt_context)
9090
li.w a0, 0 # success
9191
jr ra
9292
SYM_FUNC_END(_save_lbt_context)
93+
EXPORT_SYMBOL_GPL(_save_lbt_context)
9394

9495
/*
9596
* a0: scr
@@ -110,6 +111,7 @@ SYM_FUNC_START(_restore_lbt_context)
110111
li.w a0, 0 # success
111112
jr ra
112113
SYM_FUNC_END(_restore_lbt_context)
114+
EXPORT_SYMBOL_GPL(_restore_lbt_context)
113115

114116
/*
115117
* a0: ftop
@@ -120,6 +122,7 @@ SYM_FUNC_START(_save_ftop_context)
120122
li.w a0, 0 # success
121123
jr ra
122124
SYM_FUNC_END(_save_ftop_context)
125+
EXPORT_SYMBOL_GPL(_save_ftop_context)
123126

124127
/*
125128
* a0: ftop
@@ -150,6 +153,7 @@ SYM_FUNC_START(_restore_ftop_context)
150153
li.w a0, 0 # success
151154
jr ra
152155
SYM_FUNC_END(_restore_ftop_context)
156+
EXPORT_SYMBOL_GPL(_restore_ftop_context)
153157

154158
.L_lbt_fault:
155159
li.w a0, -EFAULT # failure

arch/loongarch/kernel/signal.c

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -51,27 +51,6 @@
5151
#define lock_lbt_owner() ({ preempt_disable(); pagefault_disable(); })
5252
#define unlock_lbt_owner() ({ pagefault_enable(); preempt_enable(); })
5353

54-
/* Assembly functions to move context to/from the FPU */
55-
extern asmlinkage int
56-
_save_fp_context(void __user *fpregs, void __user *fcc, void __user *csr);
57-
extern asmlinkage int
58-
_restore_fp_context(void __user *fpregs, void __user *fcc, void __user *csr);
59-
extern asmlinkage int
60-
_save_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
61-
extern asmlinkage int
62-
_restore_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
63-
extern asmlinkage int
64-
_save_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
65-
extern asmlinkage int
66-
_restore_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
67-
68-
#ifdef CONFIG_CPU_HAS_LBT
69-
extern asmlinkage int _save_lbt_context(void __user *regs, void __user *eflags);
70-
extern asmlinkage int _restore_lbt_context(void __user *regs, void __user *eflags);
71-
extern asmlinkage int _save_ftop_context(void __user *ftop);
72-
extern asmlinkage int _restore_ftop_context(void __user *ftop);
73-
#endif
74-
7554
struct rt_sigframe {
7655
struct siginfo rs_info;
7756
struct ucontext rs_uctx;

arch/loongarch/kernel/traps.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -553,9 +553,10 @@ asmlinkage void noinstr do_ale(struct pt_regs *regs)
553553
die_if_kernel("Kernel ale access", regs);
554554
force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)regs->csr_badvaddr);
555555
#else
556+
bool pie = regs_irqs_disabled(regs);
556557
unsigned int *pc;
557558

558-
if (regs->csr_prmd & CSR_PRMD_PIE)
559+
if (!pie)
559560
local_irq_enable();
560561

561562
perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, 1, regs, regs->csr_badvaddr);
@@ -582,7 +583,7 @@ asmlinkage void noinstr do_ale(struct pt_regs *regs)
582583
die_if_kernel("Kernel ale access", regs);
583584
force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)regs->csr_badvaddr);
584585
out:
585-
if (regs->csr_prmd & CSR_PRMD_PIE)
586+
if (!pie)
586587
local_irq_disable();
587588
#endif
588589
irqentry_exit(regs, state);
@@ -621,12 +622,13 @@ static void bug_handler(struct pt_regs *regs)
621622
asmlinkage void noinstr do_bce(struct pt_regs *regs)
622623
{
623624
bool user = user_mode(regs);
625+
bool pie = regs_irqs_disabled(regs);
624626
unsigned long era = exception_era(regs);
625627
u64 badv = 0, lower = 0, upper = ULONG_MAX;
626628
union loongarch_instruction insn;
627629
irqentry_state_t state = irqentry_enter(regs);
628630

629-
if (regs->csr_prmd & CSR_PRMD_PIE)
631+
if (!pie)
630632
local_irq_enable();
631633

632634
current->thread.trap_nr = read_csr_excode();
@@ -692,7 +694,7 @@ asmlinkage void noinstr do_bce(struct pt_regs *regs)
692694
force_sig_bnderr((void __user *)badv, (void __user *)lower, (void __user *)upper);
693695

694696
out:
695-
if (regs->csr_prmd & CSR_PRMD_PIE)
697+
if (!pie)
696698
local_irq_disable();
697699

698700
irqentry_exit(regs, state);
@@ -710,11 +712,12 @@ asmlinkage void noinstr do_bce(struct pt_regs *regs)
710712
asmlinkage void noinstr do_bp(struct pt_regs *regs)
711713
{
712714
bool user = user_mode(regs);
715+
bool pie = regs_irqs_disabled(regs);
713716
unsigned int opcode, bcode;
714717
unsigned long era = exception_era(regs);
715718
irqentry_state_t state = irqentry_enter(regs);
716719

717-
if (regs->csr_prmd & CSR_PRMD_PIE)
720+
if (!pie)
718721
local_irq_enable();
719722

720723
if (__get_inst(&opcode, (u32 *)era, user))
@@ -780,7 +783,7 @@ asmlinkage void noinstr do_bp(struct pt_regs *regs)
780783
}
781784

782785
out:
783-
if (regs->csr_prmd & CSR_PRMD_PIE)
786+
if (!pie)
784787
local_irq_disable();
785788

786789
irqentry_exit(regs, state);
@@ -1015,6 +1018,7 @@ static void init_restore_lbt(void)
10151018

10161019
asmlinkage void noinstr do_lbt(struct pt_regs *regs)
10171020
{
1021+
bool pie = regs_irqs_disabled(regs);
10181022
irqentry_state_t state = irqentry_enter(regs);
10191023

10201024
/*
@@ -1024,7 +1028,7 @@ asmlinkage void noinstr do_lbt(struct pt_regs *regs)
10241028
* (including the user using 'MOVGR2GCSR' to turn on TM, which
10251029
* will not trigger the BTE), we need to check PRMD first.
10261030
*/
1027-
if (regs->csr_prmd & CSR_PRMD_PIE)
1031+
if (!pie)
10281032
local_irq_enable();
10291033

10301034
if (!cpu_has_lbt) {
@@ -1038,7 +1042,7 @@ asmlinkage void noinstr do_lbt(struct pt_regs *regs)
10381042
preempt_enable();
10391043

10401044
out:
1041-
if (regs->csr_prmd & CSR_PRMD_PIE)
1045+
if (!pie)
10421046
local_irq_disable();
10431047

10441048
irqentry_exit(regs, state);

arch/loongarch/kvm/intc/ipi.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ static int send_ipi_data(struct kvm_vcpu *vcpu, gpa_t addr, uint64_t data)
111111
ret = kvm_io_bus_read(vcpu, KVM_IOCSR_BUS, addr, sizeof(val), &val);
112112
srcu_read_unlock(&vcpu->kvm->srcu, idx);
113113
if (unlikely(ret)) {
114-
kvm_err("%s: : read date from addr %llx failed\n", __func__, addr);
114+
kvm_err("%s: : read data from addr %llx failed\n", __func__, addr);
115115
return ret;
116116
}
117117
/* Construct the mask by scanning the bit 27-30 */
@@ -127,7 +127,7 @@ static int send_ipi_data(struct kvm_vcpu *vcpu, gpa_t addr, uint64_t data)
127127
ret = kvm_io_bus_write(vcpu, KVM_IOCSR_BUS, addr, sizeof(val), &val);
128128
srcu_read_unlock(&vcpu->kvm->srcu, idx);
129129
if (unlikely(ret))
130-
kvm_err("%s: : write date to addr %llx failed\n", __func__, addr);
130+
kvm_err("%s: : write data to addr %llx failed\n", __func__, addr);
131131

132132
return ret;
133133
}

arch/loongarch/kvm/main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,10 +296,10 @@ int kvm_arch_enable_virtualization_cpu(void)
296296
/*
297297
* Enable virtualization features granting guest direct control of
298298
* certain features:
299-
* GCI=2: Trap on init or unimplement cache instruction.
299+
* GCI=2: Trap on init or unimplemented cache instruction.
300300
* TORU=0: Trap on Root Unimplement.
301301
* CACTRL=1: Root control cache.
302-
* TOP=0: Trap on Previlege.
302+
* TOP=0: Trap on Privilege.
303303
* TOE=0: Trap on Exception.
304304
* TIT=0: Trap on Timer.
305305
*/

0 commit comments

Comments
 (0)