Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xtensa: ISS: define simc_exit and use it instead of inline asm

A number of ISS platform functions use inline assembly to invoke
simulator exit, not all correctly. Define simc_exit(exit_code) and use
it instead of inline assembly.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>

+10 -3
+5
arch/xtensa/platforms/iss/include/platform/simcall.h
··· 76 76 return ret; 77 77 } 78 78 79 + static inline int simc_exit(int exit_code) 80 + { 81 + return __simc(SYS_exit, exit_code, 0, 0); 82 + } 83 + 79 84 static inline int simc_open(const char *file, int flags, int mode) 80 85 { 81 86 return __simc(SYS_open, (int) file, flags, mode);
+5 -3
arch/xtensa/platforms/iss/setup.c
··· 32 32 #include <asm/platform.h> 33 33 #include <asm/bootparam.h> 34 34 35 + #include <platform/simcall.h> 36 + 35 37 36 38 void __init platform_init(bp_tag_t* bootparam) 37 39 { ··· 43 41 void platform_halt(void) 44 42 { 45 43 pr_info(" ** Called platform_halt() **\n"); 46 - __asm__ __volatile__("movi a2, 1\nsimcall\n"); 44 + simc_exit(0); 47 45 } 48 46 49 47 void platform_power_off(void) 50 48 { 51 49 pr_info(" ** Called platform_power_off() **\n"); 52 - __asm__ __volatile__("movi a2, 1\nsimcall\n"); 50 + simc_exit(0); 53 51 } 54 52 void platform_restart(void) 55 53 { ··· 82 80 static int 83 81 iss_panic_event(struct notifier_block *this, unsigned long event, void *ptr) 84 82 { 85 - __asm__ __volatile__("movi a2, -1; simcall\n"); 83 + simc_exit(1); 86 84 return NOTIFY_DONE; 87 85 } 88 86