Add uc_ctl_get/set_tcg_buffer_size

We still need this API because the virtual memory address space of

32 bits os is only 4GB and we default need 1G per instance

Credits to @ZehMatt for original idea

Co-authored-by: ζeh Matt <5415177+ZehMatt@users.noreply.github.com>
This commit is contained in:
mio 2023-06-10 23:36:02 +02:00
parent f8c7969d65
commit 8dffbc159c
No known key found for this signature in database
GPG Key ID: DFF27E34A47CB873
6 changed files with 25 additions and 6 deletions

View File

@ -90,7 +90,7 @@ typedef void (*uc_args_void_t)(void *);
typedef void (*uc_args_uc_t)(struct uc_struct *); typedef void (*uc_args_uc_t)(struct uc_struct *);
typedef void (*uc_args_int_uc_t)(struct uc_struct *); typedef void (*uc_args_int_uc_t)(struct uc_struct *);
typedef void (*uc_args_uc_long_t)(struct uc_struct *, unsigned long); typedef void (*uc_args_uc_long_t)(struct uc_struct *, uint32_t);
typedef void (*uc_args_uc_u64_t)(struct uc_struct *, uint64_t addr); typedef void (*uc_args_uc_u64_t)(struct uc_struct *, uint64_t addr);
@ -400,6 +400,7 @@ struct uc_struct {
FlatView *empty_view; // Static function variable moved from flatviews_init FlatView *empty_view; // Static function variable moved from flatviews_init
uint32_t tcg_buffer_size; // The buffer size we are going to use
#ifdef WIN32 #ifdef WIN32
PVOID seh_handle; PVOID seh_handle;
void* seh_closure; void* seh_closure;

View File

@ -571,8 +571,12 @@ typedef enum uc_control_type {
// Change the tlb implementation // Change the tlb implementation
// see uc_tlb_type for current implemented types // see uc_tlb_type for current implemented types
// Write: @args = (int) // Write: @args = (int)
UC_CTL_TLB_TYPE UC_CTL_TLB_TYPE,
// Change the tcg translation buffer size, note that
// unicorn may adjust this value.
// Write: @args = (uint32_t)
// Read: @args = (uint32_t*)
UC_CTL_TCG_BUFFER_SIZE,
} uc_control_type; } uc_control_type;
/* /*

View File

@ -1209,7 +1209,7 @@ static uc_err uc_gen_tb(struct uc_struct *uc, uint64_t addr, uc_tb *out_tb)
/* Must be called before using the QEMU cpus. 'tb_size' is the size /* Must be called before using the QEMU cpus. 'tb_size' is the size
(in bytes) allocated to the translation buffer. Zero means default (in bytes) allocated to the translation buffer. Zero means default
size. */ size. */
void tcg_exec_init(struct uc_struct *uc, unsigned long tb_size) void tcg_exec_init(struct uc_struct *uc, uint32_t tb_size)
{ {
/* remove tcg object. init here. */ /* remove tcg object. init here. */
/* tcg class init: tcg-all.c:tcg_accel_class_init(), skip all. */ /* tcg class init: tcg-all.c:tcg_accel_class_init(), skip all. */

View File

@ -14,6 +14,6 @@
struct uc_struct; struct uc_struct;
void tcg_exec_init(struct uc_struct *uc, unsigned long tb_size); void tcg_exec_init(struct uc_struct *uc, uint32_t tb_size);
#endif #endif

View File

@ -10,7 +10,7 @@
// codes for unicorns purposes. // codes for unicorns purposes.
void vm_start(struct uc_struct*); void vm_start(struct uc_struct*);
void tcg_exec_init(struct uc_struct *uc, unsigned long tb_size); void tcg_exec_init(struct uc_struct *uc, uint32_t tb_size);
bool unicorn_fill_tlb(CPUState *cs, vaddr address, int size, bool unicorn_fill_tlb(CPUState *cs, vaddr address, int size,
MMUAccessType rw, int mmu_idx, MMUAccessType rw, int mmu_idx,
bool probe, uintptr_t retaddr); bool probe, uintptr_t retaddr);

14
uc.c
View File

@ -2374,6 +2374,20 @@ uc_err uc_ctl(uc_engine *uc, uc_control_type control, ...)
break; break;
} }
case UC_CTL_TCG_BUFFER_SIZE: {
if (rw == UC_CTL_IO_WRITE) {
uint32_t size = va_arg(args, uint32_t);
uc->tcg_buffer_size = size;
} else {
UC_INIT(uc);
uint32_t *size = va_arg(args, uint32_t *);
*size = uc->tcg_buffer_size;
}
break;
}
default: default:
err = UC_ERR_ARG; err = UC_ERR_ARG;
break; break;