bool user_yielding(struct ls_state *ls) { #ifdef USER_YIELD_ENTER /* Special case frumious logic. Compare to check_user_syscall(). Handles * p2s with assembly yield invocations (sounds like a WISE IDEA). */ return USER_MEMORY(ls->eip) && ls->instruction_text[0] == OPCODE_INT && ls->instruction_text[1] == YIELD_INT; #else return false; #endif }
static void mem_exit_bad_place(struct ls_state *ls, bool in_kernel, unsigned int base) { struct mem_state *m = in_kernel ? &ls->kern_mem : &ls->user_mem; assert(m->in_alloc && "attempt to exit malloc without being in!"); assert(!m->in_free && "attempt to exit malloc while in free!"); assert(!m->in_mm_init && "attempt to exit malloc while in init!"); if (in_kernel != testing_userspace()) { lsprintf(DEV, "Malloc [0x%x | %d]\n", base, m->alloc_request_size); } if (in_kernel) { assert(KERNEL_MEMORY(base)); } else { assert(base == 0 || USER_MEMORY(base)); } if (base == 0) { lsprintf(INFO, "%s seems to be out of memory.\n", K_STR(in_kernel)); } else { struct chunk *chunk = MM_XMALLOC(1, struct chunk); chunk->base = base; chunk->len = m->alloc_request_size; chunk->id = m->heap_next_id; chunk->malloc_trace = stack_trace(ls); chunk->free_trace = NULL; m->heap_size += m->alloc_request_size; assert(m->heap_next_id != INT_MAX && "need a wider type"); m->heap_next_id++; insert_chunk(&m->heap, chunk, false); } m->in_alloc = false; }