From: Wu Zhangjin <wuzhangjin@xxxxxxxxx> The -mfix-loongson2f-jump option provided by the binutils 2.20.1 have fixed the Out-of-order Issue of Loongson-2F described in Chapter 15 of "Loongson2F User Manual"[1,2], but introduced some problems. The option changes all of the jumping target to "addr & 0xcfffffff" through the at($1) register, but for the REBOOT address of loongson-2F: 0xbfc00000, this is totally wrong, so, this patch try to avoid the problem via telling the assembler not to use at($1) register. [1] Loongson2F User Manual(Chinese Version) http://www.loongson.cn/uploadfile/file/200808211 [2] English Version of Chapter 15: http://groups.google.com.hk/group/loongson-dev/msg/e0d2e220958f10a6?dmode=source Reported-and-tested-by: Liu Shiwei <liushiwei@xxxxxxxxx> Signed-off-by: Wu Zhangjin <wuzhangjin@xxxxxxxxx> --- arch/mips/loongson/common/reset.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) diff --git a/arch/mips/loongson/common/reset.c b/arch/mips/loongson/common/reset.c index 4bd9c18..dc311f2 100644 --- a/arch/mips/loongson/common/reset.c +++ b/arch/mips/loongson/common/reset.c @@ -21,8 +21,17 @@ static void loongson_restart(char *command) /* do preparation for reboot */ mach_prepare_reboot(); - /* reboot via jumping to boot base address */ + /* reboot via jumping to boot base address + * + * ".set noat" and ".set at" are used to ensure the address not break + * by the -mfix-loongson2f-jump option provided by binutils 2.20.1 (or + * higher version) which try to change the jumping address to "addr & + * 0xcfffffff" via the at($1) register, this is totally wrong for + * 0xbfc00000 (LOONGSON_BOOT_BASE). + */ + __asm__ __volatile__(".set noat\n"); ((void (*)(void))ioremap_nocache(LOONGSON_BOOT_BASE, 4)) (); + __asm__ __volatile__(".set at\n"); } static void loongson_poweroff(void) -- 1.7.0.1