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);
}
Beispiel #2
0
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])