From b39e15dde5ec7b96c15da9faf4ab5892501c1aae Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sat, 23 Mar 2013 11:28:53 +0100 Subject: Imported Upstream version 1.1~hg20130323 --- src/pkg/runtime/cgo/gcc_freebsd_arm.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'src/pkg/runtime/cgo/gcc_freebsd_arm.c') diff --git a/src/pkg/runtime/cgo/gcc_freebsd_arm.c b/src/pkg/runtime/cgo/gcc_freebsd_arm.c index 3bcb0b270..73c990c28 100644 --- a/src/pkg/runtime/cgo/gcc_freebsd_arm.c +++ b/src/pkg/runtime/cgo/gcc_freebsd_arm.c @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +#include +#include #include #include #include "libcgo.h" @@ -22,10 +24,20 @@ void x_cgo_load_gm(void) __attribute__((naked)); void __aeabi_read_tp(void) { - // read @ 0xffff1000 __asm__ __volatile__ ( +#ifdef ARM_TP_ADDRESS + // ARM_TP_ADDRESS is (ARM_VECTORS_HIGH + 0x1000) or 0xffff1000 + // GCC inline asm doesn't provide a way to provide a constant + // to "ldr r0, =??" pseudo instruction, so we hardcode the value + // and check it with cpp. +#if ARM_TP_ADDRESS != 0xffff1000 +#error Wrong ARM_TP_ADDRESS! +#endif "ldr r0, =0xffff1000\n\t" "ldr r0, [r0]\n\t" +#else + "mrc p15, 0, r0, c13, c0, 3\n\t" +#endif "mov pc, lr\n\t" ); } -- cgit v1.2.3