x86: Add limited support for extracting function call arguments
authorAndreas Sandberg <andreas@sandberg.pp.se>
Mon, 30 Sep 2013 07:37:17 +0000 (09:37 +0200)
committerAndreas Sandberg <andreas@sandberg.pp.se>
Mon, 30 Sep 2013 07:37:17 +0000 (09:37 +0200)
Add support for extracting the first 6 64-bit integer argumements to a
function call in X86ISA::getArgument().

src/arch/x86/utility.cc

index 7f5ae980a2caec28bcc304e39424d052d0eecd77..41f5aee0b91bd54f921d3e29ae77cfe76e82c6ce 100644 (file)
@@ -51,8 +51,25 @@ namespace X86ISA {
 uint64_t
 getArgument(ThreadContext *tc, int &number, uint16_t size, bool fp)
 {
-    panic("getArgument() not implemented for x86!\n");
-    M5_DUMMY_RETURN
+    if (!FullSystem) {
+        panic("getArgument() only implemented for full system mode.\n");
+    } else if (fp) {
+        panic("getArgument(): Floating point arguments not implemented\n");
+    } else if (size != 8) {
+        panic("getArgument(): Can only handle 64-bit arguments.\n");
+    }
+
+    // The first 6 integer arguments are passed in registers, the rest
+    // are passed on the stack.
+    const int int_reg_map[] = {
+        INTREG_RDI, INTREG_RSI, INTREG_RDX,
+        INTREG_RCX, INTREG_R8, INTREG_R9
+    };
+    if (number < sizeof(int_reg_map) / sizeof(*int_reg_map)) {
+        return tc->readIntReg(int_reg_map[number]);
+    } else {
+        panic("getArgument(): Don't know how to handle stack arguments.\n");
+    }
 }
 
 void initCPU(ThreadContext *tc, int cpuId)