static void info_from_sigcontext(struct call_info *info, os_context_t * csp) { unsigned long pc; info->interrupted = 1; if (LowtagOf(SC_REG(csp, reg_CODE)) == type_FunctionPointer) { /* We tried to call a function, but crapped out before $CODE could be fixed up. Probably an undefined function. */ info->frame = (struct call_frame *) SC_REG(csp, reg_OCFP); info->lra = (lispobj) SC_REG(csp, reg_LRA); info->code = code_pointer(info->lra); pc = (unsigned long) PTR(info->lra); } else { info->frame = (struct call_frame *) SC_REG(csp, reg_CFP); info->code = code_pointer(SC_REG(csp, reg_CODE)); info->lra = NIL; pc = SC_PC(csp); } if (info->code != NULL) info->pc = pc - (unsigned long) info->code - #ifndef alpha (HEADER_LENGTH(info->code->header) * sizeof(lispobj)); #else (HEADER_LENGTH(((struct code *) info->code)->header) * sizeof(lispobj)); #endif else
static void call_info_from_context(struct call_info *info, os_context_t *context) { unsigned long pc; info->interrupted = 1; if (lowtag_of(*os_context_register_addr(context, reg_CODE)) == FUN_POINTER_LOWTAG) { /* We tried to call a function, but crapped out before $CODE could * be fixed up. Probably an undefined function. */ info->frame = (struct call_frame *)(unsigned long) (*os_context_register_addr(context, reg_OCFP)); info->lra = (lispobj)(*os_context_register_addr(context, reg_LRA)); info->code = code_pointer(info->lra); pc = (unsigned long)native_pointer(info->lra); } else { info->frame = (struct call_frame *)(unsigned long) (*os_context_register_addr(context, reg_CFP)); info->code = code_pointer(*os_context_register_addr(context, reg_CODE)); info->lra = NIL; pc = *os_context_pc_addr(context); } if (info->code != NULL) info->pc = pc - (unsigned long) info->code - #ifndef LISP_FEATURE_ALPHA (HEADER_LENGTH(info->code->header) * sizeof(lispobj)); #else (HEADER_LENGTH(((struct code *)info->code)->header) * sizeof(lispobj)); #endif else
static irqreturn_t navpoint_irq(int irq, void *dev_id) { struct navpoint *navpoint = dev_id; struct ssp_device *ssp = navpoint->ssp; irqreturn_t ret = IRQ_NONE; u32 status; status = pxa_ssp_read_reg(ssp, SSSR); if (status & sssr) { dev_warn(navpoint->dev, "unexpected interrupt: status=0x%08x\n", status); pxa_ssp_write_reg(ssp, SSSR, (status & sssr)); ret = IRQ_HANDLED; } while (status & SSSR_RNE) { u32 data; data = pxa_ssp_read_reg(ssp, SSDR); navpoint->data[navpoint->index + 0] = (data >> 8); navpoint->data[navpoint->index + 1] = data; navpoint->index += 2; if (HEADER_LENGTH(navpoint->data[0]) < navpoint->index) { navpoint_packet(navpoint); navpoint->index = 0; } status = pxa_ssp_read_reg(ssp, SSSR); ret = IRQ_HANDLED; } return ret; }
static struct code * code_pointer(lispobj object) { lispobj *headerp, header; int type, len; headerp = (lispobj *) native_pointer(object); header = *headerp; type = widetag_of(header); switch (type) { case CODE_HEADER_WIDETAG: break; case RETURN_PC_HEADER_WIDETAG: case SIMPLE_FUN_HEADER_WIDETAG: len = HEADER_LENGTH(header); if (len == 0) headerp = NULL; else headerp -= len; break; default: headerp = NULL; } return (struct code *) headerp; }
static struct code * code_pointer(lispobj object) { lispobj *headerp, header; int type, len; headerp = (lispobj *) PTR(object); header = *headerp; type = TypeOf(header); switch (type) { case type_CodeHeader: break; case type_ReturnPcHeader: case type_FunctionHeader: case type_ClosureFunctionHeader: len = HEADER_LENGTH(header); if (len == 0) headerp = NULL; else headerp -= len; break; default: headerp = NULL; } return (struct code *) headerp; }