diff --git a/arch/sw_64/include/asm/hmcall.h b/arch/sw_64/include/asm/hmcall.h index 04fcafac9e80c788fe67fe6da02f9391026327be..71d203efc587481bfdaf0a14aaecd15509dc0966 100644 --- a/arch/sw_64/include/asm/hmcall.h +++ b/arch/sw_64/include/asm/hmcall.h @@ -55,16 +55,14 @@ extern void __init fixup_hmcall(void); extern void halt(void) __attribute__((noreturn)); -#define __halt() __asm__ __volatile__ ("sys_call %0 #halt" : : "i" (HMC_halt)) -#define fpu_enable() \ +#define __CALL_HMC_VOID(NAME) \ +static inline void NAME(void) \ { \ - __asm__ __volatile__("sys_call %0" : : "i" (HMC_wrfen));\ + __asm__ __volatile__( \ + "sys_call %0 ": : "i" (HMC_ ## NAME)); \ } -#define imb() \ - __asm__ __volatile__ ("sys_call %0 #imb" : : "i" (HMC_imb) : "memory") - #define __CALL_HMC_R0(NAME, TYPE) \ static inline TYPE NAME(void) \ { \ @@ -142,10 +140,14 @@ static inline RTYPE NAME(TYPE0 arg0, TYPE1 arg1, TYPE2 arg2) \ return __r0; \ } -#define sflush() \ -{ \ - __asm__ __volatile__("sys_call 0x2f"); \ -} + +__CALL_HMC_VOID(imb); +__CALL_HMC_VOID(sflush); +__CALL_HMC_VOID(wrfen); +#define fpu_enable() wrfen() + +__CALL_HMC_VOID(sleepen); +__CALL_HMC_VOID(mtinten); __CALL_HMC_R0(rdps, unsigned long); @@ -164,8 +166,6 @@ __CALL_HMC_RW1(swpipl, unsigned long, unsigned long); __CALL_HMC_R0(whami, unsigned long); __CALL_HMC_RW1(rdio64, unsigned long, unsigned long); __CALL_HMC_RW1(rdio32, unsigned int, unsigned long); -__CALL_HMC_R0(sleepen, unsigned long); -__CALL_HMC_R0(mtinten, unsigned long); __CALL_HMC_W2(wrent, void*, unsigned long); __CALL_HMC_W2(tbisasn, unsigned long, unsigned long); __CALL_HMC_W1(wrkgp, unsigned long); diff --git a/arch/sw_64/include/asm/kgdb.h b/arch/sw_64/include/asm/kgdb.h index 1d807362e867ce089bf2f7d78026a68b5abc3ac7..6478c7a989c37a92846dcb9ea9161ab218a31894 100644 --- a/arch/sw_64/include/asm/kgdb.h +++ b/arch/sw_64/include/asm/kgdb.h @@ -34,7 +34,7 @@ static inline void arch_kgdb_breakpoint(void) { - asm __volatile__ ("sys_call/b 0x80"); + asm __volatile__ ("sys_call %0" : : "i"(HMC_bpt) ); } void sw64_task_to_gdb_regs(struct task_struct *task, unsigned long *regs); diff --git a/arch/sw_64/kernel/vdso/vgettimeofday.c b/arch/sw_64/kernel/vdso/vgettimeofday.c index b9c9a137f9d3438d500db5f511008652e1f371d6..49bb4e2e66ed40526f6154ae4649a4c5db824235 100644 --- a/arch/sw_64/kernel/vdso/vgettimeofday.c +++ b/arch/sw_64/kernel/vdso/vgettimeofday.c @@ -16,6 +16,7 @@ #include #include +#include static __always_inline int syscall_fallback(clockid_t clkid, struct timespec64 *ts) { @@ -25,8 +26,8 @@ static __always_inline int syscall_fallback(clockid_t clkid, struct timespec64 * " mov %0, $16\n" " mov %1, $17\n" " ldi $0, %2\n" - " sys_call 0x83\n" - :: "r"(clkid), "r"(ts), "i"(__NR_clock_gettime) + " sys_call %3\n" + :: "r"(clkid), "r"(ts), "i"(__NR_clock_gettime), "i"(HMC_callsys) : "$0", "$16", "$17", "$19"); if (unlikely(r19)) return -r0; @@ -78,9 +79,7 @@ static __always_inline u64 read_longtime(void) register unsigned long __r0 __asm__("$0"); __asm__ __volatile__( - "sys_call 0xB1" - : "=r"(__r0) - ::"memory"); + "sys_call %1" : "=r"(__r0) : "i" (HMC_longtime)); return __r0; } diff --git a/arch/sw_64/kernel/vdso/vrt_sigreturn.S b/arch/sw_64/kernel/vdso/vrt_sigreturn.S index 6aa7aa300b4d119a844ea1fcd75a1985b1685573..d2d7295ffa7ac13d2c0fea96cb56b50eb72af6b3 100644 --- a/arch/sw_64/kernel/vdso/vrt_sigreturn.S +++ b/arch/sw_64/kernel/vdso/vrt_sigreturn.S @@ -19,6 +19,7 @@ #include #include +#include #define RT_SIGFRAME_SIZE 1600 #define RT_SIGFRAME_MCTX 176 @@ -64,6 +65,6 @@ ENTRY(__vdso_rt_sigreturn) mov $sp, $16 ldi $0, __NR_rt_sigreturn - sys_call 0x83 + sys_call HMC_callsys ENDPROC(__vdso_rt_sigreturn) .cfi_endproc