@@ -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,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
193227func (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
200236func (u * uc ) MemRead (addr , size uint64 ) ([]byte , error ) {
@@ -211,7 +247,9 @@ func (u *uc) MemMap(addr, size uint64) error {
211247}
212248
213249func (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
217255func (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+
235346func (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