@@ -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
6585type 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+
75101func 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
109135func (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+ >> >> >> > 11 cedbec (add UC_CTL go bindings )
191229}
192230
193231func (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+ >> >> >> > 11 cedbec (add UC_CTL go bindings )
198242}
199243
200244func (u * uc ) MemRead (addr , size uint64 ) ([]byte , error ) {
@@ -211,7 +255,13 @@ func (u *uc) MemMap(addr, size uint64) error {
211255}
212256
213257func (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+ >> >> >> > 11 cedbec (add UC_CTL go bindings )
215265}
216266
217267func (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+
235358func (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