util: Implement PIC version of m5ops for X86.
authorHanhwi Jang <jang.hanhwi@gmail.com>
Wed, 10 Jan 2018 02:39:38 +0000 (11:39 +0900)
committerHanhwi Jang <jang.hanhwi@gmail.com>
Sat, 20 Jan 2018 09:07:44 +0000 (09:07 +0000)
Using m5ops for X86 in shared objects requires PIC for the m5ops.
Typically, the PIC version is used to make m5op interfaces to other
languages like python and lua.

Change-Id: I2463904c13ea8b839d0386d3c743d8dad1e1e6bc
Reviewed-on: https://gem5-review.googlesource.com/7261
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>

util/m5/m5op_x86.S

index 9578741227aec5e527527e8f85f4e69cd5314c35..69995e0ab948c5ca79e033caa4fb67c0a7099f6c 100644 (file)
 
 #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.