summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/m5/m5op_x86.S17
1 files changed, 15 insertions, 2 deletions
diff --git a/util/m5/m5op_x86.S b/util/m5/m5op_x86.S
index 957874122..69995e0ab 100644
--- a/util/m5/m5op_x86.S
+++ b/util/m5/m5op_x86.S
@@ -32,19 +32,32 @@
#include <gem5/asm/generic/m5ops.h>
-#ifdef M5OP_ADDR
+#if defined(M5OP_ADDR) && defined(M5OP_PIC)
/* Use the memory mapped m5op interface */
#define TWO_BYTE_OP(name, number) \
.globl name; \
.func name; \
name: \
- mov m5_mem, %r11; \
+ mov m5_mem@gotpcrel(%rip), %r11; \
+ mov (%r11), %r11; \
mov $number, %rax; \
shl $8, %rax; \
mov 0(%r11, %rax, 1), %rax; \
ret; \
.endfunc;
+#elif defined(M5OP_ADDR) && !defined(M5OP_PIC)
+/* Use the memory mapped m5op interface */
+#define TWO_BYTE_OP(name, number) \
+ .globl name; \
+ .func name; \
+name: \
+ mov m5_mem, %r11; \
+ mov $number, %rax; \
+ shl $8, %rax; \
+ mov 0(%r11, %rax, 1), %rax; \
+ ret; \
+ .endfunc;
#else
/* Use the magic instruction based m5op interface. This does not work
* in virtualized environments.