LoongArch: Use la.pcrel instead of la.abs when it's trivially possible
authorXi Ruoyao <xry111@xry111.site>
Sat, 25 Feb 2023 07:52:56 +0000 (15:52 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Sat, 25 Feb 2023 14:12:16 +0000 (22:12 +0800)
Let's start to kill la.abs in preparation for the subsequent support of
the PIE kernel.

BTW, Re-tab the indention in arch/loongarch/kernel/entry.S for alignment.

Signed-off-by: Xi Ruoyao <xry111@xry111.site>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/include/asm/stackframe.h
arch/loongarch/include/asm/uaccess.h
arch/loongarch/kernel/entry.S
arch/loongarch/kernel/head.S
arch/loongarch/mm/tlbex.S

index 4ca953062b5be2c2a76f5176c7e4977284981e6b..7deb043ce3873204cf0d1f0090aa33abc46ffc72 100644 (file)
@@ -90,7 +90,7 @@
        .endm
 
        .macro  set_saved_sp stackp temp temp2
-       la.abs    \temp, kernelsp
+       la.pcrel  \temp, kernelsp
 #ifdef CONFIG_SMP
        LONG_ADD  \temp, \temp, u0
 #endif
index 255899d4a7c36a73ad9802b6f71c4bf75a0ae9f6..0d22991ae430d4598743743a07ce6f925a01d4e6 100644 (file)
@@ -22,7 +22,6 @@
 extern u64 __ua_limit;
 
 #define __UA_ADDR      ".dword"
-#define __UA_LA                "la.abs"
 #define __UA_LIMIT     __ua_limit
 
 /*
index d53b631c90227cc4bbaf06192b90404afcc53493..f14ab6a0e0b054559eaed0f96be4683c8ff69aa0 100644 (file)
        .cfi_sections   .debug_frame
        .align  5
 SYM_FUNC_START(handle_syscall)
-       csrrd   t0, PERCPU_BASE_KS
-       la.abs  t1, kernelsp
-       add.d   t1, t1, t0
-       move    t2, sp
-       ld.d    sp, t1, 0
+       csrrd           t0, PERCPU_BASE_KS
+       la.pcrel        t1, kernelsp
+       add.d           t1, t1, t0
+       move            t2, sp
+       ld.d            sp, t1, 0
 
-       addi.d  sp, sp, -PT_SIZE
-       cfi_st  t2, PT_R3
+       addi.d          sp, sp, -PT_SIZE
+       cfi_st          t2, PT_R3
        cfi_rel_offset  sp, PT_R3
-       st.d    zero, sp, PT_R0
-       csrrd   t2, LOONGARCH_CSR_PRMD
-       st.d    t2, sp, PT_PRMD
-       csrrd   t2, LOONGARCH_CSR_CRMD
-       st.d    t2, sp, PT_CRMD
-       csrrd   t2, LOONGARCH_CSR_EUEN
-       st.d    t2, sp, PT_EUEN
-       csrrd   t2, LOONGARCH_CSR_ECFG
-       st.d    t2, sp, PT_ECFG
-       csrrd   t2, LOONGARCH_CSR_ESTAT
-       st.d    t2, sp, PT_ESTAT
-       cfi_st  ra, PT_R1
-       cfi_st  a0, PT_R4
-       cfi_st  a1, PT_R5
-       cfi_st  a2, PT_R6
-       cfi_st  a3, PT_R7
-       cfi_st  a4, PT_R8
-       cfi_st  a5, PT_R9
-       cfi_st  a6, PT_R10
-       cfi_st  a7, PT_R11
-       csrrd   ra, LOONGARCH_CSR_ERA
-       st.d    ra, sp, PT_ERA
+       st.d            zero, sp, PT_R0
+       csrrd           t2, LOONGARCH_CSR_PRMD
+       st.d            t2, sp, PT_PRMD
+       csrrd           t2, LOONGARCH_CSR_CRMD
+       st.d            t2, sp, PT_CRMD
+       csrrd           t2, LOONGARCH_CSR_EUEN
+       st.d            t2, sp, PT_EUEN
+       csrrd           t2, LOONGARCH_CSR_ECFG
+       st.d            t2, sp, PT_ECFG
+       csrrd           t2, LOONGARCH_CSR_ESTAT
+       st.d            t2, sp, PT_ESTAT
+       cfi_st          ra, PT_R1
+       cfi_st          a0, PT_R4
+       cfi_st          a1, PT_R5
+       cfi_st          a2, PT_R6
+       cfi_st          a3, PT_R7
+       cfi_st          a4, PT_R8
+       cfi_st          a5, PT_R9
+       cfi_st          a6, PT_R10
+       cfi_st          a7, PT_R11
+       csrrd           ra, LOONGARCH_CSR_ERA
+       st.d            ra, sp, PT_ERA
        cfi_rel_offset  ra, PT_ERA
 
-       cfi_st  tp, PT_R2
-       cfi_st  u0, PT_R21
-       cfi_st  fp, PT_R22
+       cfi_st          tp, PT_R2
+       cfi_st          u0, PT_R21
+       cfi_st          fp, PT_R22
 
        SAVE_STATIC
 
-       move    u0, t0
-       li.d    tp, ~_THREAD_MASK
-       and     tp, tp, sp
+       move            u0, t0
+       li.d            tp, ~_THREAD_MASK
+       and             tp, tp, sp
 
-       move    a0, sp
-       bl      do_syscall
+       move            a0, sp
+       bl              do_syscall
 
        RESTORE_ALL_AND_RET
 SYM_FUNC_END(handle_syscall)
 
 SYM_CODE_START(ret_from_fork)
-       bl      schedule_tail           # a0 = struct task_struct *prev
-       move    a0, sp
-       bl      syscall_exit_to_user_mode
+       bl              schedule_tail           # a0 = struct task_struct *prev
+       move            a0, sp
+       bl              syscall_exit_to_user_mode
        RESTORE_STATIC
        RESTORE_SOME
        RESTORE_SP_AND_RET
 SYM_CODE_END(ret_from_fork)
 
 SYM_CODE_START(ret_from_kernel_thread)
-       bl      schedule_tail           # a0 = struct task_struct *prev
-       move    a0, s1
-       jirl    ra, s0, 0
-       move    a0, sp
-       bl      syscall_exit_to_user_mode
+       bl              schedule_tail           # a0 = struct task_struct *prev
+       move            a0, s1
+       jirl            ra, s0, 0
+       move            a0, sp
+       bl              syscall_exit_to_user_mode
        RESTORE_STATIC
        RESTORE_SOME
        RESTORE_SP_AND_RET
index 57bada6b4e9310983a8cb3b601bbca86e465ae8c..aa6181714ec31fbfab3276372c1554e76a88415d 100644 (file)
@@ -117,7 +117,7 @@ SYM_CODE_START(smpboot_entry)
        li.w            t0, 0x00                # FPE=0, SXE=0, ASXE=0, BTE=0
        csrwr           t0, LOONGARCH_CSR_EUEN
 
-       la.abs          t0, cpuboot_data
+       la.pcrel        t0, cpuboot_data
        ld.d            sp, t0, CPU_BOOT_STACK
        ld.d            tp, t0, CPU_BOOT_TINFO
 
index 58781c6e4191a892d9f17b8bed22dfe10d8e544b..3dd2a9615cd90b5afe9c2f025d134a416d04d889 100644 (file)
@@ -24,8 +24,7 @@
        move            a0, sp
        REG_S           a2, sp, PT_BVADDR
        li.w            a1, \write
-       la.abs          t0, do_page_fault
-       jirl            ra, t0, 0
+       bl              do_page_fault
        RESTORE_ALL_AND_RET
        SYM_FUNC_END(tlb_do_page_fault_\write)
        .endm