void exn_page_fault(void) { void *addr; struct vma *vma; unsigned long error; error = get_error_code(current->esp); MOV("cr2", addr); // address not mapped in process address space if (!(vma = vma_get(¤t->mm, addr))) { segfault(SEGV_MAPERR, error, addr); return; } // page not present (demand paging) if (!(error & PGF_PERM)) { if (vm_map_page(vma, addr) < 0) // FIXME: stall until memory available? segfault(SEGV_MAPERR, error, addr); return; } // write permission if (error & PGF_WRITE) { if (vm_write_perm(vma, addr) < 0) segfault(SEGV_ACCERR, error, addr); return; } // read permission if (vm_read_perm(vma, addr) < 0) segfault(SEGV_ACCERR, error, addr); }
void memory_manager::__register_pointer(void * p, size_t size, const std::type_info & t) { if (m_pointers.count(p) != 0) { log_error() << "Trying to register pointer " << p << " of size " << size << " which is already registered" << std::endl; segfault(); } m_pointers[p] = std::make_pair(size, &t);; }
int main(void) { segfault(); /* char buf[1]="a"; buf[10003]='A' printf("%c\n",buf[10003]); */ return 0; }
void memory_manager::__unregister_pointer(void * p, size_t size, const std::type_info & t) { auto i=m_pointers.find(p); if (i == m_pointers.end()) { log_error() << "Trying to deregister pointer " << p << " of size " << size << " which was never registered" << std::endl; segfault(); } else { if (i->second.first != size) { log_error() << "Trying to deregister pointer " << p << " of size " << size << " which was registered with size " << i->second.first << std::endl; segfault(); } if (*i->second.second != t) { log_error() << "Trying to deregister pointer " << p << " of type " << t.name() << " which was registered with size " << i->second.second->name() << std::endl; segfault(); } m_pointers.erase(i); } }
void memory_manager::register_deallocation(size_t bytes) { #ifndef TPIE_NDEBUG size_t usage = m_used.fetch_sub(bytes); if (bytes > usage) { log_error() << "Error in deallocation, trying to deallocate " << bytes << " bytes, while only " << usage << " were allocated" << std::endl; segfault(); } #else m_used.fetch_sub(bytes); #endif }
void op_call(void) { char flag; flag = *(core.memory.vmem + core.memory.pc + 1); if (flag == OP_FLAG_REG) op_call_reg(); else if (flag == OP_FLAG_DIRECT16) op_call_dir16(); else segfault(2); /* flag unknow */ }
int main(int argc, char **argd){ segfault(); return 0; }
static void handle_fault_store(trapframe_t* tf) { if (handle_page_fault(tf->badvaddr, PROT_WRITE) != 0) segfault(tf, tf->badvaddr, "store"); }
static void handle_fault_load(trapframe_t* tf) { if (handle_page_fault(tf->badvaddr, PROT_READ) != 0) segfault(tf, tf->badvaddr, "load"); }
static void handle_fault_fetch(trapframe_t* tf) { if (handle_page_fault(tf->badvaddr, PROT_EXEC) != 0) segfault(tf, tf->badvaddr, "fetch"); }
void memory_manager::__assert_tpie_ptr(void * p) { if (!p || m_pointers.count(p)) return; log_error() << p << " has not been allocated with tpie_new" << std::endl; segfault(); }
TEST(Fail, _unexpected_segfault) { segfault (); }
void handle_fault_store(trapframe_t* tf) { tf->badvaddr = read_csr(sbadaddr); if (handle_page_fault(tf->badvaddr, PROT_WRITE) != 0) segfault(tf, tf->badvaddr, "store"); }
void handle_fault_load(trapframe_t* tf) { tf->badvaddr = read_csr(sbadaddr); if (handle_page_fault(tf->badvaddr, PROT_READ) != 0) segfault(tf, tf->badvaddr, "load"); }