Skip to content

Commit b94ff99

Browse files
KaddateKaddate
authored andcommitted
add UC_CTL go bindings
1 parent 16d8d95 commit b94ff99

File tree

3 files changed

+270
-2
lines changed

3 files changed

+270
-2
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: 174 additions & 1 deletion
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,26 @@ func (u *uc) MemWrite(addr uint64, data []byte) error {
187219
if len(data) == 0 {
188220
return nil
189221
}
222+
<<<<<<< HEAD
190223
return errReturn(C.uc_mem_write(u.handle, C.uint64_t(addr), unsafe.Pointer(&data[0]), C.uint64_t(len(data))))
224+
=======
225+
return errReturn(
226+
C.uc_mem_write(u.handle, C.uint64_t(addr), unsafe.Pointer(&data[0]), C.size_t(len(data))),
227+
)
228+
>>>>>>> 11cedbec (add UC_CTL go bindings)
191229
}
192230

193231
func (u *uc) MemReadInto(dst []byte, addr uint64) error {
194232
if len(dst) == 0 {
195233
return nil
196234
}
235+
<<<<<<< HEAD
197236
return errReturn(C.uc_mem_read(u.handle, C.uint64_t(addr), unsafe.Pointer(&dst[0]), C.uint64_t(len(dst))))
237+
=======
238+
return errReturn(
239+
C.uc_mem_read(u.handle, C.uint64_t(addr), unsafe.Pointer(&dst[0]), C.size_t(len(dst))),
240+
)
241+
>>>>>>> 11cedbec (add UC_CTL go bindings)
198242
}
199243

200244
func (u *uc) MemRead(addr, size uint64) ([]byte, error) {
@@ -211,7 +255,13 @@ func (u *uc) MemMap(addr, size uint64) error {
211255
}
212256

213257
func (u *uc) MemMapPtr(addr, size uint64, prot int, ptr unsafe.Pointer) error {
258+
<<<<<<< HEAD
214259
return errReturn(C.uc_mem_map_ptr(u.handle, C.uint64_t(addr), C.uint64_t(size), C.uint32_t(prot), ptr))
260+
=======
261+
return errReturn(
262+
C.uc_mem_map_ptr(u.handle, C.uint64_t(addr), C.size_t(size), C.uint32_t(prot), ptr),
263+
)
264+
>>>>>>> 11cedbec (add UC_CTL go bindings)
215265
}
216266

217267
func (u *uc) MemProtect(addr, size uint64, prot int) error {
@@ -232,7 +282,130 @@ func (u *uc) Handle() *C.uc_engine {
232282
return u.handle
233283
}
234284

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

0 commit comments

Comments
 (0)