| From bd4785c942ae10ec13bc8bd287f4805e8709cb1e Mon Sep 17 00:00:00 2001 |
| From: Wu Zhangjin <wuzhangjin@gmail.com> |
| 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 <liushiwei@gmail.com> |
| Signed-off-by: Wu Zhangjin <wuzhangjin@gmail.com> |
| |
| 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.1.1 |
| |