From ab1cb8a17c14641dcd9119ca1292b961b370426e Mon Sep 17 00:00:00 2001 From: Wu Zhangjin Date: Fri, 11 Sep 2009 12:52:28 +0800 Subject: [PATCH] Loongson-2F: Fixup of problems introduced by -mfix-loongson2f-jump of binutils 2.20.1 commit 1699e9f1ed3c9a63920bfe26fef22e8dd69a3fdf in tip. 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 Signed-off-by: Wu Zhangjin Signed-off-by: Paul Gortmaker --- arch/mips/loongson/common/reset.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) diff --git a/arch/mips/loongson/common/reset.c b/arch/mips/loongson/common/reset.c index 9e10d62..8d1985b 100644 --- a/arch/mips/loongson/common/reset.c +++ b/arch/mips/loongson/common/reset.c @@ -39,8 +39,18 @@ 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 broken + * by the -mfix-loongson2f-jump option provided by binutils 2.20.1 and + * higher 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"); loongson_reboot(); + __asm__ __volatile__(".set at\n"); } static void loongson_poweroff(void) -- 1.7.0.4