Skip to content

Commit 11cedbe

Browse files
KaddateKaddate
authored andcommitted
add UC_CTL go bindings
1 parent f8c6db9 commit 11cedbe

File tree

3 files changed

+261
-5
lines changed

3 files changed

+261
-5
lines changed

bindings/go/unicorn/uc.c

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,82 @@ uc_err uc_reg_write_batch_helper(uc_engine *handle, int *regs, uint64_t *val_in,
2424
return ret;
2525
}
2626

27+
uc_err uc_ctl_get_mode_helper(uc_engine *handle, int *mode) {
28+
return uc_ctl(handle, UC_CTL_READ(UC_CTL_UC_MODE, 1), (mode));
29+
}
30+
31+
uc_err uc_ctl_get_page_size_helper(uc_engine *handle, uint32_t *ptr) {
32+
return uc_ctl(handle, UC_CTL_READ(UC_CTL_UC_PAGE_SIZE, 1), (ptr));
33+
}
34+
35+
uc_err uc_ctl_set_page_size_helper(uc_engine *handle, uint32_t page_size) {
36+
return uc_ctl(handle, UC_CTL_WRITE(UC_CTL_UC_PAGE_SIZE, 1), (page_size));
37+
}
38+
39+
uc_err uc_ctl_get_arch_helper(uc_engine *handle, int *arch) {
40+
return uc_ctl(handle, UC_CTL_READ(UC_CTL_UC_ARCH, 1), (arch));
41+
}
42+
43+
uc_err uc_ctl_get_timeout_helper(uc_engine *handle, uint64_t *ptr) {
44+
return uc_ctl(handle, UC_CTL_READ(UC_CTL_UC_TIMEOUT, 1), (ptr));
45+
}
46+
47+
uc_err uc_ctl_exits_enable_helper(uc_engine *handle) {
48+
return uc_ctl(handle, UC_CTL_WRITE(UC_CTL_UC_USE_EXITS, 1), 1);
49+
}
50+
51+
uc_err uc_ctl_exits_disable_helper(uc_engine *handle) {
52+
return uc_ctl(handle, UC_CTL_WRITE(UC_CTL_UC_USE_EXITS, 1), 0);
53+
}
54+
55+
uc_err uc_ctl_get_exits_cnt_helper(uc_engine *handle, size_t *ptr) {
56+
return uc_ctl(handle, UC_CTL_READ(UC_CTL_UC_EXITS_CNT, 1), (ptr));
57+
}
58+
59+
uc_err uc_ctl_get_exits_helper(uc_engine *handle, uint64_t *exits, size_t len) {
60+
return uc_ctl(handle, UC_CTL_READ(UC_CTL_UC_EXITS, 2), (exits), (len));
61+
}
62+
63+
uc_err uc_ctl_set_exits_helper(uc_engine *handle, uint64_t *exits, size_t len) {
64+
return uc_ctl(handle, UC_CTL_WRITE(UC_CTL_UC_EXITS, 2), (exits), (len));
65+
}
66+
67+
uc_err uc_ctl_get_cpu_model_helper(uc_engine *handle, int *model) {
68+
return uc_ctl(handle, UC_CTL_READ(UC_CTL_CPU_MODEL, 1), (model));
69+
}
70+
2771
uc_err uc_ctl_set_cpu_model_helper(uc_engine *handle, int model) {
28-
return uc_ctl_set_cpu_model(handle, model);
72+
return uc_ctl(handle, UC_CTL_WRITE(UC_CTL_CPU_MODEL, 1), (model));
73+
}
74+
75+
uc_err uc_ctl_remove_cache_helper(uc_engine *handle, uint64_t address, uint64_t end) {
76+
return uc_ctl(handle, UC_CTL_WRITE(UC_CTL_TB_REMOVE_CACHE, 2), (address), (end));
77+
}
78+
79+
uc_err uc_ctl_request_cache_helper(uc_engine *handle, uint64_t address, uc_tb *tb) {
80+
return uc_ctl(handle, UC_CTL_READ_WRITE(UC_CTL_TB_REQUEST_CACHE, 2), (address), (tb));
81+
}
82+
83+
uc_err uc_ctl_flush_tb_helper(uc_engine *handle) {
84+
return uc_ctl(handle, UC_CTL_WRITE(UC_CTL_TB_FLUSH, 0));
85+
}
86+
87+
uc_err uc_ctl_flush_tlb_helper(uc_engine *handle) {
88+
return uc_ctl(handle, UC_CTL_WRITE(UC_CTL_TLB_FLUSH, 0));
89+
}
90+
91+
uc_err uc_ctl_tlb_mode_helper(uc_engine *handle, int mode) {
92+
return uc_ctl(handle, UC_CTL_WRITE(UC_CTL_TLB_TYPE, 1), (mode));
93+
}
94+
95+
uc_err uc_ctl_get_tcg_buffer_size_helper(uc_engine *handle, uint32_t *size) {
96+
return uc_ctl(handle, UC_CTL_READ(UC_CTL_TCG_BUFFER_SIZE, 1), (size));
97+
}
98+
99+
uc_err uc_ctl_set_tcg_buffer_size_helper(uc_engine *handle, uint32_t size) {
100+
return uc_ctl(handle, UC_CTL_WRITE(UC_CTL_TCG_BUFFER_SIZE, 1), (size));
101+
}
102+
103+
uc_err uc_ctl_context_mode_helper(uc_engine *handle, int mode) {
104+
return uc_ctl(handle, UC_CTL_WRITE(UC_CTL_CONTEXT_MODE, 1), (mode));
29105
}

bindings/go/unicorn/uc.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,22 @@
11
uc_err uc_reg_read_batch_helper(uc_engine *handle, int *regs, uint64_t *val_out, int count);
22
uc_err uc_reg_write_batch_helper(uc_engine *handle, int *regs, uint64_t *val_in, int count);
3+
uc_err uc_ctl_get_mode_helper(uc_engine *handle, int *mode);
4+
uc_err uc_ctl_get_page_size_helper(uc_engine *handle, uint32_t *ptr);
5+
uc_err uc_ctl_set_page_size_helper(uc_engine *handle, uint32_t page_size);
6+
uc_err uc_ctl_get_arch_helper(uc_engine *handle, int *arch);
7+
uc_err uc_ctl_get_timeout_helper(uc_engine *handle, uint64_t *ptr);
8+
uc_err uc_ctl_exits_enable_helper(uc_engine *handle);
9+
uc_err uc_ctl_exits_disable_helper(uc_engine *handle);
10+
uc_err uc_ctl_get_exits_cnt_helper(uc_engine *handle, size_t *ptr);
11+
uc_err uc_ctl_get_exits_helper(uc_engine *handle, uint64_t *exits, size_t len);
12+
uc_err uc_ctl_set_exits_helper(uc_engine *handle, uint64_t *exits, size_t len);
13+
uc_err uc_ctl_get_cpu_model_helper(uc_engine *handle, int *model);
314
uc_err uc_ctl_set_cpu_model_helper(uc_engine *handle, int model);
15+
uc_err uc_ctl_remove_cache_helper(uc_engine *handle, uint64_t address, uint64_t end);
16+
uc_err uc_ctl_request_cache_helper(uc_engine *handle, uint64_t address, uc_tb *tb);
17+
uc_err uc_ctl_flush_tb_helper(uc_engine *handle);
18+
uc_err uc_ctl_flush_tlb_helper(uc_engine *handle);
19+
uc_err uc_ctl_tlb_mode_helper(uc_engine *handle, int mode);
20+
uc_err uc_ctl_get_tcg_buffer_size_helper(uc_engine *handle, uint32_t *size);
21+
uc_err uc_ctl_set_tcg_buffer_size_helper(uc_engine *handle, uint32_t size);
22+
uc_err uc_ctl_context_mode_helper(uc_engine *handle, int mode);

bindings/go/unicorn/unicorn.go

Lines changed: 165 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,27 @@ type Unicorn interface {
5959
Handle() *C.uc_engine
6060
RegWriteX86Msr(reg uint64, val uint64) error
6161
RegReadX86Msr(reg uint64) (uint64, error)
62+
63+
GetMode() (int, error)
64+
GetPageSize() (uint32, error)
65+
SetPageSize(pageSize uint32) error
66+
GetArch() (int, error)
67+
GetTimeout() (uint64, error)
68+
ExitsEnable() error
69+
ExitsDisable() error
70+
GetExitsCnt() (uint32, error)
71+
GetExits() ([]uint64, error)
72+
SetExits(exits []uint64) error
73+
GetCPUModel() (int, error)
6274
SetCPUModel(model int) error
75+
RemoveCache(address, end uint64) error
76+
RequestCache(address uint64) (UcTb, error)
77+
FlushTB() error
78+
FlushTLB() error
79+
TLBMode(mode int) error
80+
GetTCGBufferSize() (uint32, error)
81+
SetTCGBufferSize(size uint32) error
82+
ContextMode(mode int) error
6383
}
6484

6585
type uc struct {
@@ -72,6 +92,12 @@ type UcOptions struct {
7292
Timeout, Count uint64
7393
}
7494

95+
type UcTb struct {
96+
Pc uint64
97+
Icount uint16
98+
Size uint16
99+
}
100+
75101
func Version() (int, int) {
76102
var major, minor C.uint
77103
C.uc_version(&major, &minor)
@@ -107,7 +133,13 @@ func (u *uc) Close() (err error) {
107133
}
108134

109135
func (u *uc) StartWithOptions(begin, until uint64, options *UcOptions) error {
110-
ucerr := C.uc_emu_start(u.handle, C.uint64_t(begin), C.uint64_t(until), C.uint64_t(options.Timeout), C.size_t(options.Count))
136+
ucerr := C.uc_emu_start(
137+
u.handle,
138+
C.uint64_t(begin),
139+
C.uint64_t(until),
140+
C.uint64_t(options.Timeout),
141+
C.size_t(options.Count),
142+
)
111143
return errReturn(ucerr)
112144
}
113145

@@ -187,14 +219,18 @@ func (u *uc) MemWrite(addr uint64, data []byte) error {
187219
if len(data) == 0 {
188220
return nil
189221
}
190-
return errReturn(C.uc_mem_write(u.handle, C.uint64_t(addr), unsafe.Pointer(&data[0]), C.size_t(len(data))))
222+
return errReturn(
223+
C.uc_mem_write(u.handle, C.uint64_t(addr), unsafe.Pointer(&data[0]), C.size_t(len(data))),
224+
)
191225
}
192226

193227
func (u *uc) MemReadInto(dst []byte, addr uint64) error {
194228
if len(dst) == 0 {
195229
return nil
196230
}
197-
return errReturn(C.uc_mem_read(u.handle, C.uint64_t(addr), unsafe.Pointer(&dst[0]), C.size_t(len(dst))))
231+
return errReturn(
232+
C.uc_mem_read(u.handle, C.uint64_t(addr), unsafe.Pointer(&dst[0]), C.size_t(len(dst))),
233+
)
198234
}
199235

200236
func (u *uc) MemRead(addr, size uint64) ([]byte, error) {
@@ -211,7 +247,9 @@ func (u *uc) MemMap(addr, size uint64) error {
211247
}
212248

213249
func (u *uc) MemMapPtr(addr, size uint64, prot int, ptr unsafe.Pointer) error {
214-
return errReturn(C.uc_mem_map_ptr(u.handle, C.uint64_t(addr), C.size_t(size), C.uint32_t(prot), ptr))
250+
return errReturn(
251+
C.uc_mem_map_ptr(u.handle, C.uint64_t(addr), C.size_t(size), C.uint32_t(prot), ptr),
252+
)
215253
}
216254

217255
func (u *uc) MemProtect(addr, size uint64, prot int) error {
@@ -232,7 +270,130 @@ func (u *uc) Handle() *C.uc_engine {
232270
return u.handle
233271
}
234272

273+
func (u *uc) GetMode() (int, error) {
274+
var mode C.int
275+
ucerr := C.uc_ctl_get_mode_helper(u.handle, &mode)
276+
return int(mode), errReturn(ucerr)
277+
}
278+
279+
func (u *uc) GetPageSize() (uint32, error) {
280+
var ptr C.uint32_t
281+
ucerr := C.uc_ctl_get_page_size_helper(u.handle, &ptr)
282+
return uint32(ptr), errReturn(ucerr)
283+
}
284+
285+
func (u *uc) SetPageSize(pageSize uint32) error {
286+
ucerr := C.uc_ctl_set_page_size_helper(u.handle, C.uint32_t(pageSize))
287+
return errReturn(ucerr)
288+
}
289+
290+
func (u *uc) GetArch() (int, error) {
291+
var arch C.int
292+
ucerr := C.uc_ctl_get_arch_helper(u.handle, &arch)
293+
return int(arch), errReturn(ucerr)
294+
}
295+
296+
func (u *uc) GetTimeout() (uint64, error) {
297+
var timeout C.uint64_t
298+
ucerr := C.uc_ctl_get_timeout_helper(u.handle, &timeout)
299+
return uint64(timeout), errReturn(ucerr)
300+
}
301+
302+
func (u *uc) ExitsEnable() error {
303+
return errReturn(C.uc_ctl_exits_enable_helper(u.handle))
304+
}
305+
306+
func (u *uc) ExitsDisable() error {
307+
return errReturn(C.uc_ctl_exits_disable_helper(u.handle))
308+
}
309+
310+
func (u *uc) GetExitsCnt() (uint32, error) {
311+
var count C.size_t
312+
ucerr := C.uc_ctl_get_timeout_helper(u.handle, &count)
313+
return uint32(count), errReturn(ucerr)
314+
}
315+
316+
func (u *uc) GetExits() ([]uint64, error) {
317+
count, err := u.GetExitsCnt()
318+
if err != nil {
319+
return nil, err
320+
}
321+
exits := make([]C.uint64_t, count)
322+
ucerr := C.uc_ctl_get_exits_helper(u.handle, &exits[0], C.size_t(count))
323+
324+
res := make([]uint64, count)
325+
for i := 0; i < int(count); i++ {
326+
res[i] = uint64(exits[i])
327+
}
328+
return res, errReturn(ucerr)
329+
}
330+
331+
func (u *uc) SetExits(exits []uint64) error {
332+
cExits := make([]C.uint64_t, len(exits))
333+
for i := 0; i < len(exits); i++ {
334+
cExits[i] = C.uint64_t(exits[i])
335+
}
336+
ucerr := C.uc_ctl_set_exits_helper(u.handle, &cExits[0], C.size_t(len(exits)))
337+
return errReturn(ucerr)
338+
}
339+
340+
func (u *uc) GetCPUModel() (int, error) {
341+
var model C.int
342+
ucerr := C.uc_ctl_get_cpu_model_helper(u.handle, &model)
343+
return int(model), errReturn(ucerr)
344+
}
345+
235346
func (u *uc) SetCPUModel(model int) error {
236347
ucerr := C.uc_ctl_set_cpu_model_helper(u.handle, C.int(model))
237348
return errReturn(ucerr)
238349
}
350+
351+
func (u *uc) RemoveCache(address, end uint64) error {
352+
ucerr := C.uc_ctl_remove_cache_helper(u.handle, C.uint64_t(address), C.uint64_t(end))
353+
return errReturn(ucerr)
354+
}
355+
356+
func (u *uc) RequestCache(address uint64) (UcTb, error) {
357+
var tb C.uc_tb
358+
ucerr := C.uc_ctl_request_cache_helper(u.handle, C.uint64_t(address), &tb)
359+
err := errReturn(ucerr)
360+
if err != nil {
361+
return UcTb{}, err
362+
}
363+
return UcTb{
364+
Pc: uint64(tb.pc),
365+
Icount: uint16(tb.icount),
366+
Size: uint16(tb.size),
367+
}, nil
368+
}
369+
370+
func (u *uc) FlushTB() error {
371+
ucerr := C.uc_ctl_flush_tb_helper(u.handle)
372+
return errReturn(ucerr)
373+
}
374+
375+
func (u *uc) FlushTLB() error {
376+
ucerr := C.uc_ctl_flush_tlb_helper(u.handle)
377+
return errReturn(ucerr)
378+
}
379+
380+
func (u *uc) TLBMode(mode int) error {
381+
ucerr := C.uc_ctl_tlb_mode_helper(u.handle, C.int(mode))
382+
return errReturn(ucerr)
383+
}
384+
385+
func (u *uc) GetTCGBufferSize() (uint32, error) {
386+
var size C.uint32_t
387+
ucerr := C.uc_ctl_get_tcg_buffer_size_helper(u.handle, &size)
388+
return uint32(size), errReturn(ucerr)
389+
}
390+
391+
func (u *uc) SetTCGBufferSize(size uint32) error {
392+
ucerr := C.uc_ctl_set_tcg_buffer_size_helper(u.handle, C.uint32_t(size))
393+
return errReturn(ucerr)
394+
}
395+
396+
func (u *uc) ContextMode(mode int) error {
397+
ucerr := C.uc_ctl_context_mode_helper(u.handle, C.int(mode))
398+
return errReturn(ucerr)
399+
}

0 commit comments

Comments
 (0)