/* * Save the context of an error report. */ void kmemcheck_error_save(enum kmemcheck_shadow state, unsigned long address, unsigned int size, struct pt_regs *regs) { static unsigned long prev_ip; struct kmemcheck_error *e; void *shadow_copy; void *memory_copy; /* Don't report several adjacent errors from the same EIP. */ if (regs->ip == prev_ip) return; prev_ip = regs->ip; e = error_next_wr(); if (!e) return; e->type = KMEMCHECK_ERROR_INVALID_ACCESS; e->state = state; e->address = address; e->size = size; /* Save regs */ memcpy(&e->regs, regs, sizeof(*regs)); /* Save stack trace */ e->trace.nr_entries = 0; e->trace.entries = e->trace_entries; e->trace.max_entries = ARRAY_SIZE(e->trace_entries); e->trace.skip = 0; <<<<<<< HEAD
/* * Save the context of an error report. */ void kmemcheck_error_save(enum kmemcheck_shadow state, unsigned long address, unsigned int size, struct pt_regs *regs) { static unsigned long prev_ip; struct kmemcheck_error *e; void *shadow_copy; void *memory_copy; /* Don't report several adjacent errors from the same EIP. */ if (regs->ip == prev_ip) return; prev_ip = regs->ip; e = error_next_wr(); if (!e) return; e->type = KMEMCHECK_ERROR_INVALID_ACCESS; e->state = state; e->address = address; e->size = size; /* Save regs */ memcpy(&e->regs, regs, sizeof(*regs)); /* Save stack trace */ e->trace.nr_entries = 0; e->trace.entries = e->trace_entries; e->trace.max_entries = ARRAY_SIZE(e->trace_entries); e->trace.skip = 0; save_stack_trace_bp(&e->trace, regs->bp); /* Round address down to nearest 16 bytes */ shadow_copy = kmemcheck_shadow_lookup(address & ~(SHADOW_COPY_SIZE - 1)); BUG_ON(!shadow_copy); memcpy(e->shadow_copy, shadow_copy, SHADOW_COPY_SIZE); kmemcheck_show_addr(address); memory_copy = (void *) (address & ~(SHADOW_COPY_SIZE - 1)); memcpy(e->memory_copy, memory_copy, SHADOW_COPY_SIZE); kmemcheck_hide_addr(address); tasklet_hi_schedule_first(&kmemcheck_tasklet); }
/* * Save the context of a kmemcheck bug. */ void kmemcheck_error_save_bug(struct pt_regs *regs) { struct kmemcheck_error *e; e = error_next_wr(); if (!e) return; e->type = KMEMCHECK_ERROR_BUG; memcpy(&e->regs, regs, sizeof(*regs)); e->trace.nr_entries = 0; e->trace.entries = e->trace_entries; e->trace.max_entries = ARRAY_SIZE(e->trace_entries); e->trace.skip = 1; save_stack_trace(&e->trace); tasklet_hi_schedule_first(&kmemcheck_tasklet); }