Skip to content

Commit 9bc683d

Browse files
committed
Merge pull request #2 from feseal/x86-64-fix-PR
x86-64 trace fix
2 parents e100542 + 991eaba commit 9bc683d

File tree

7 files changed

+208
-152
lines changed

7 files changed

+208
-152
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ Change folder to qemu and build tracer with command
5555
```bash
5656
$ ./configure --prefix=$HOME --with-tracewrap=`realpath ../bap-traces` \
5757
--extra-ldflags=-Lprotobuf --target-list="arm-linux-user i386-linux-user \
58-
mips-linux-user"
58+
x86_64-linux-user mips-linux-user"
5959
$ make -C protobuf
6060
$ make
6161
$ make install
@@ -68,6 +68,7 @@ To run executable `exec` and to save the trace data to `exec.trace`, use
6868
```bash
6969
$ qemu-arm -tracefile exec.trace exec # trace ARM target executable
7070
$ qemu-i386 -tracefile exec.trace exec # trace X86 target executable
71+
$ qemu-x86_64 -tracefile exec.trace exec # trace X86-64 target executable
7172
$ qemu-mips -tracefile exec.trace exec # trace MIPS target executable
7273
```
7374

@@ -76,4 +77,4 @@ Hints: use option -L to set the elf interpreter prefix to 'path'. Use
7677
to download arm and x86 libraries.
7778

7879
# Notes
79-
Only ARM, X86, MIPS targets are supported in this branch.
80+
Only ARM, X86, X86-64, MIPS targets are supported in this branch.

include/tracewrap.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ struct toc_entry {
1515

1616
extern FILE *qemu_tracefile;
1717
void qemu_trace(Frame frame);
18-
void qemu_trace_newframe(uint64_t addr, int tread_id);
18+
void qemu_trace_newframe(target_ulong addr, int tread_id);
1919
void qemu_trace_add_operand(OperandInfo *oi, int inout);
20-
void qemu_trace_endframe(CPUArchState *env, target_ulong pc, size_t size);
20+
void qemu_trace_endframe(CPUArchState *env, target_ulong pc, target_ulong size);
2121
void qemu_trace_finish(uint32_t exit_code);
2222

23-
OperandInfo * load_store_reg(uint32_t reg, uint32_t val, int ls);
24-
OperandInfo * load_store_mem(uint32_t addr, uint32_t val, int ls, int len);
23+
OperandInfo * load_store_reg(target_ulong reg, target_ulong val, int ls);
24+
OperandInfo * load_store_mem(target_ulong addr, target_ulong val, int ls, int len);
2525

2626
#define REG_CPSR 64
2727
#define REG_APSR 65

linux-user/x86_64/trace_info.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#pragma once
2+
3+
#include "arch.h"
4+
5+
const uint64_t bfd_arch = bfd_arch_i386;
6+
const uint64_t bfd_machine = mach_x86_64;

target-i386/helper.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ DEF_HELPER_2(idivq_EAX, void, env, tl)
2020

2121
#ifdef HAS_TRACEWRAP
2222
DEF_HELPER_1(trace_newframe, void, tl)
23-
DEF_HELPER_3(trace_endframe, void, env, tl, i32)
24-
DEF_HELPER_2(trace_load_reg, void, i32, i32)
25-
DEF_HELPER_2(trace_store_reg, void, i32, i32)
26-
DEF_HELPER_3(trace_ld, void, env, i32, i32)
27-
DEF_HELPER_3(trace_st, void, env, i32, i32)
23+
DEF_HELPER_3(trace_endframe, void, env, tl, tl)
24+
DEF_HELPER_2(trace_load_reg, void, tl, tl)
25+
DEF_HELPER_2(trace_store_reg, void, tl, tl)
26+
DEF_HELPER_3(trace_ld, void, env, tl, tl)
27+
DEF_HELPER_3(trace_st, void, env, tl, tl)
2828
DEF_HELPER_1(trace_load_eflags, void, env)
2929
DEF_HELPER_1(trace_store_eflags, void, env)
3030
#endif //HAS_TRACEWRAP

target-i386/trace_helper.c

Lines changed: 63 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,80 @@
55
#include "tracewrap.h"
66
#include "qemu/log.h"
77

8-
const char *regs[8] = {"EAX_32", "ECX_32", "EDX_32", "EBX_32", "ESP_32", "EBP_32", "ESI_32", "EDI_32"};
9-
const char *segs[6] = {"ES_BASE_32", "CS_BASE_32", "SS_BASE_32", "DS_BASE_32", "FS_BASE_32", "GS_BASE_32"};
8+
9+
static const char* const regs[CPU_NB_REGS] = {
10+
#ifdef TARGET_X86_64
11+
[R_EAX] = "RAX",
12+
[R_EBX] = "RBX",
13+
[R_ECX] = "RCX",
14+
[R_EDX] = "RDX",
15+
[R_ESI] = "RSI",
16+
[R_EDI] = "RDI",
17+
[R_EBP] = "RBP",
18+
[R_ESP] = "RSP",
19+
[8] = "R8",
20+
[9] = "R9",
21+
[10] = "R10",
22+
[11] = "R11",
23+
[12] = "R12",
24+
[13] = "R13",
25+
[14] = "R14",
26+
[15] = "R15",
27+
#else
28+
[R_EAX] = "EAX",
29+
[R_EBX] = "EBX",
30+
[R_ECX] = "ECX",
31+
[R_EDX] = "EDX",
32+
[R_ESI] = "ESI",
33+
[R_EDI] = "EDI",
34+
[R_EBP] = "EBP",
35+
[R_ESP] = "ESP",
36+
#endif
37+
};
1038

1139
#define CPU_NB_SEGS 6
40+
static const char* const segs[CPU_NB_SEGS] = {
41+
[R_ES] = "ES_BASE",
42+
[R_CS] = "CS_BASE",
43+
[R_SS] = "SS_BASE",
44+
[R_DS] = "DS_BASE",
45+
[R_FS] = "FS_BASE",
46+
[R_GS] = "GS_BASE"
47+
};
1248

1349
void HELPER(trace_newframe)(target_ulong pc)
1450
{
1551
qemu_trace_newframe(pc, 0);
1652
}
1753

18-
void HELPER(trace_endframe)(CPUArchState *env, target_ulong old_pc, uint32_t size)
54+
void HELPER(trace_endframe)(CPUArchState *env, target_ulong old_pc, target_ulong size)
1955
{
2056
//qemu_trace_endframe(env, env->eip - size, size);
2157
qemu_trace_endframe(env, old_pc, size);
2258
}
2359

24-
OperandInfo * load_store_reg(uint32_t reg, uint32_t val, int ls)
60+
OperandInfo * load_store_reg(target_ulong reg, target_ulong val, int ls)
2561
{
2662
//fprintf(stderr, "load_store_reg: reg: (%s) 0x%d, val: 0x%08x, ls: %d\n", (reg < CPU_NB_REGS) ? regs[reg] : "EFLAGS", reg, val, ls);
2763
RegOperand * ro = (RegOperand *)malloc(sizeof(RegOperand));
2864
reg_operand__init(ro);
2965
int isSeg = reg & (1 << SEG_BIT);
3066
reg &= ~(1 << SEG_BIT);
3167

32-
char * reg_name = (char *)malloc(16);
68+
const char* reg_name = NULL;
3369
if (isSeg)
3470
{
35-
sprintf(reg_name, "R_%s", (reg < CPU_NB_SEGS) ? segs[reg] : "<UNDEF>");
71+
reg_name = reg < CPU_NB_SEGS ? segs[reg] : "<UNDEF>";
3672
} else {
37-
sprintf(reg_name, "R_%s", (reg < CPU_NB_REGS) ? regs[reg] : "EFLAGS");
73+
reg_name = reg < CPU_NB_REGS ? regs[reg] :
74+
#ifdef TARGET_X86_64
75+
"RFLAGS";
76+
#else
77+
"EFLAGS";
78+
#endif
3879
}
39-
ro->name = reg_name;
80+
ro->name = malloc(strlen(reg_name) + 1);
81+
strcpy(ro->name, reg_name);
4082

4183
OperandInfoSpecific *ois = (OperandInfoSpecific *)malloc(sizeof(OperandInfoSpecific));
4284
operand_info_specific__init(ois);
@@ -55,25 +97,25 @@ OperandInfo * load_store_reg(uint32_t reg, uint32_t val, int ls)
5597
oi->bit_length = 0;
5698
oi->operand_info_specific = ois;
5799
oi->operand_usage = ou;
58-
oi->value.len = 4;
100+
oi->value.len = sizeof(val);
59101
oi->value.data = malloc(oi->value.len);
60-
memcpy(oi->value.data, &val, 4);
102+
memcpy(oi->value.data, &val, sizeof(val));
61103

62104
return oi;
63105
}
64106

65-
void HELPER(trace_load_reg)(uint32_t reg, uint32_t val)
107+
void HELPER(trace_load_reg)(target_ulong reg, target_ulong val)
66108
{
67-
qemu_log("This register (r%d) was read. Value 0x%x\n", reg, val);
109+
qemu_log("This register (r" TARGET_FMT_ld ") was read. Value 0x" TARGET_FMT_lx "\n", reg, val);
68110

69111
OperandInfo *oi = load_store_reg(reg, val, 0);
70112

71113
qemu_trace_add_operand(oi, 0x1);
72114
}
73115

74-
void HELPER(trace_store_reg)(uint32_t reg, uint32_t val)
116+
void HELPER(trace_store_reg)(target_ulong reg, target_ulong val)
75117
{
76-
qemu_log("This register (r%d) was written. Value: 0x%x\n", reg, val);
118+
qemu_log("This register (r" TARGET_FMT_ld ") was written. Value: 0x" TARGET_FMT_lx "\n", reg, val);
77119

78120
OperandInfo *oi = load_store_reg(reg, val, 1);
79121

@@ -102,7 +144,7 @@ void HELPER(trace_store_eflags)(CPUArchState *env)
102144
qemu_trace_add_operand(oi, 0x2);
103145
}
104146

105-
OperandInfo * load_store_mem(uint32_t addr, uint32_t val, int ls, int len)
147+
OperandInfo * load_store_mem(target_ulong addr, target_ulong val, int ls, int len)
106148
{
107149
//fprintf(stderr, "load_store_mem: addr: 0x%08x, val: 0x%08x, ls: %d\n", addr, val, ls);
108150
MemOperand * mo = (MemOperand *)malloc(sizeof(MemOperand));
@@ -134,20 +176,20 @@ OperandInfo * load_store_mem(uint32_t addr, uint32_t val, int ls, int len)
134176
return oi;
135177
}
136178

137-
void HELPER(trace_ld)(CPUArchState *env, uint32_t val, uint32_t addr)
179+
void HELPER(trace_ld)(CPUArchState *env, target_ulong val, target_ulong addr)
138180
{
139-
qemu_log("This was a read 0x" TARGET_FMT_lx " addr:0x%x value:0x%x\n", env->eip, addr, val);
181+
qemu_log("This was a read 0x" TARGET_FMT_lx " addr:0x" TARGET_FMT_lx " value:0x" TARGET_FMT_lx "\n", env->eip, addr, val);
140182

141-
OperandInfo *oi = load_store_mem(addr, val, 0, 4);
183+
OperandInfo *oi = load_store_mem(addr, val, 0, sizeof(val));
142184

143185
qemu_trace_add_operand(oi, 0x1);
144186
}
145187

146-
void HELPER(trace_st)(CPUArchState *env, uint32_t val, uint32_t addr)
188+
void HELPER(trace_st)(CPUArchState *env, target_ulong val, target_ulong addr)
147189
{
148-
qemu_log("This was a store 0x" TARGET_FMT_lx " addr:0x%x value:0x%x\n", env->eip, addr, val);
190+
qemu_log("This was a store 0x" TARGET_FMT_lx " addr:0x" TARGET_FMT_lx " value:0x" TARGET_FMT_lx "\n", env->eip, addr, val);
149191

150-
OperandInfo *oi = load_store_mem(addr, val, 1, 4);
192+
OperandInfo *oi = load_store_mem(addr, val, 1, sizeof(val));
151193

152194
qemu_trace_add_operand(oi, 0x2);
153195
}

0 commit comments

Comments
 (0)