prot = PROT_READ | PROT_WRITE;
cell alloc_size = 2 * pagesize + size;
+#if defined(__APPLE__) && defined(FACTOR_ARM64) // FIXME: could be in header file
+ char* array = (char*)mmap(NULL, alloc_size, prot,
+ MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0);
+#else
char* array = (char*)mmap(NULL, alloc_size, prot,
MAP_ANON | MAP_PRIVATE, -1, 0);
+#endif
if (array == (char*)-1)
fatal_error("Out of memory in mmap", alloc_size);
segment::~segment() {
int pagesize = getpagesize();
- int retval = munmap((void*)(start - pagesize), pagesize + size + pagesize);
+ int retval = munmap((void*)(start - pagesize), 2 * pagesize + size);
if (retval)
fatal_error("Segment deallocation failed", 0);
}
-void factor_vm::dispatch_signal(void* uap, void(handler)()) {
- dispatch_signal_handler((cell*)&UAP_STACK_POINTER(uap),
- (cell*)&UAP_PROGRAM_COUNTER(uap),
- (cell)FUNCTION_CODE_POINTER(handler));
- UAP_SET_TOC_POINTER(uap, (cell)FUNCTION_TOC_POINTER(handler));
-}
-
void factor_vm::start_sampling_profiler_timer() {
struct itimerval timer;
memset((void*)&timer, 0, sizeof(struct itimerval));
setitimer(ITIMER_REAL, &timer, NULL);
}
-void memory_signal_handler(int signal, siginfo_t* siginfo, void* uap) {
+void factor_vm::dispatch_signal(void* uap, void(handler)()) {
+ dispatch_signal_handler((cell*)&UAP_STACK_POINTER(uap),
+ (cell*)&UAP_PROGRAM_COUNTER(uap),
+ (cell)FUNCTION_CODE_POINTER(handler));
+}
+void memory_signal_handler(int signal, siginfo_t* siginfo, void* uap) {
+ (void) signal;
cell fault_addr = (cell)siginfo->si_addr;
cell fault_pc = (cell)UAP_PROGRAM_COUNTER(uap);
factor_vm* vm = current_vm();
- vm->verify_memory_protection_error(fault_addr);
- vm->signal_fault_addr = fault_addr;
- vm->signal_fault_pc = fault_pc;
+ vm->set_memory_protection_error(fault_addr, fault_pc);
vm->dispatch_signal(uap, factor::memory_signal_handler_impl);
}
void synchronous_signal_handler(int signal, siginfo_t* siginfo, void* uap) {
+ (void) siginfo;
if (factor_vm::fatal_erroring_p)
return;
}
void enqueue_signal_handler(int signal, siginfo_t* siginfo, void* uap) {
+ (void) siginfo;
+ (void) uap;
if (factor_vm::fatal_erroring_p)
return;
}
void fep_signal_handler(int signal, siginfo_t* siginfo, void* uap) {
+ (void) siginfo;
+ (void) uap;
if (factor_vm::fatal_erroring_p)
return;
}
void sample_signal_handler(int signal, siginfo_t* siginfo, void* uap) {
+ (void) siginfo;
factor_vm* vm = current_vm_p();
bool foreign_thread = false;
if (vm == NULL) {
enqueue_signal(vm, signal);
}
-void ignore_signal_handler(int signal, siginfo_t* siginfo, void* uap) {}
+void ignore_signal_handler(int signal, siginfo_t* siginfo, void* uap) {
+ (void) signal;
+ (void) siginfo;
+ (void) uap;
+}
void fpe_signal_handler(int signal, siginfo_t* siginfo, void* uap) {
factor_vm* vm = current_vm();
}
void* stdin_loop(void* arg) {
+ (void) arg;
unsigned char buf[4096];
bool loop_running = true;
sigaction_safe(SIGINT, &fep_sigaction, NULL);
}
+void factor_vm::primitive_disable_ctrl_break() {
+ stop_on_ctrl_break = false;
+}
+
+void factor_vm::primitive_enable_ctrl_break() {
+ stop_on_ctrl_break = true;
+}
+
void abort() {
sig_t ret;
do {