struct intrinfo_entry * add_interrupt(const struct startup_intrinfo *startup_intr) { struct intrinfo_entry *intr; unsigned i; if(intr_prev_output_rtn == NULL) { //Hook into the sizing/writing list intr_prev_output_rtn = callout_output_rtn; callout_output_rtn = (output_callout_t *)callout_output_intr; } intr = grow_syspage_section(&lsp.intrinfo, sizeof(*intr)); //Point at newly allocated entry intr = (void *)((uint8_t *)intr + lsp.intrinfo.size - sizeof(*intr)); *intr = *(struct intrinfo_entry *)startup_intr; if(startup_intr->id.rtn != NULL) { intr->id.size = startup_intr->id.rtn->rtn_size; } if(startup_intr->eoi.rtn != NULL) { intr->eoi.size = startup_intr->eoi.rtn->rtn_size; } for(i = 0; i < NUM_ELTS(offsets); ++i) { void (**rtn)(void) = (void (**)(void))((uintptr_t)intr + offsets[i]); callout_register_data(rtn, startup_intr->patch_data); } return(intr); }
void add_callout(unsigned offset, const struct callout_rtn *callout) { void (**call)(void) = (void (**)(void))lsp.callout.p; call += offset / sizeof(*call); *call = (void (*)(void))callout; if( offset >= offsetof(struct callout_entry, debug[0]) && offset < offsetof(struct callout_entry, debug[1])) { callout_register_data(call, &dbg_device[0]); } else if( offset >= offsetof(struct callout_entry, debug[1])