arch/openrisc/kernel/traps.c

Source file repositories/reference/linux-study-clean/arch/openrisc/kernel/traps.c

File Facts

System
Linux kernel
Corpus path
arch/openrisc/kernel/traps.c
Extension
.c
Size
10709 bytes
Lines
440
Domain
Architecture Layer
Bucket
arch/openrisc
Inferred role
Architecture Layer: implementation source
Status
source implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

if (__get_user(word, &((unsigned long *)esp)[i])) {
bad_stack:
				pr_info(" Bad Stack value.");
				break;
			}

			print_data(esp, word, i);
		}

		pr_info("\nCode: ");
		if (regs->pc < PAGE_OFFSET)
			goto bad;

		for (i = -6; i < 6; i += 1) {
			unsigned long word;

			if (__get_user(word, &((unsigned long *)regs->pc)[i])) {
bad:
				pr_info(" Bad PC value.");
				break;
			}

			print_data(regs->pc, word, i);
		}
	}
	pr_info("\n");
}

/* This is normally the 'Oops' routine */
void __noreturn die(const char *str, struct pt_regs *regs, long err)
{

	console_verbose();
	pr_emerg("\n%s#: %04lx\n", str, err & 0xffff);
	show_registers(regs);
#ifdef CONFIG_JUMP_UPON_UNHANDLED_EXCEPTION
	pr_emerg("\n\nUNHANDLED_EXCEPTION: entering infinite loop\n");

	/* shut down interrupts */
	local_irq_disable();

	__asm__ __volatile__("l.nop   1");
	do {} while (1);
#endif
	make_task_dead(SIGSEGV);
}

asmlinkage void unhandled_exception(struct pt_regs *regs, int ea, int vector)
{
	pr_emerg("Unable to handle exception at EA =0x%x, vector 0x%x",
		 ea, vector);
	die("Oops", regs, 9);
}

asmlinkage void do_fpe_trap(struct pt_regs *regs, unsigned long address)
{
	if (user_mode(regs)) {
		int code = FPE_FLTUNK;
#ifdef CONFIG_FPU
		unsigned long fpcsr;

		save_fpu(current);
		fpcsr = current->thread.fpcsr;

		if (fpcsr & SPR_FPCSR_IVF)
			code = FPE_FLTINV;
		else if (fpcsr & SPR_FPCSR_OVF)
			code = FPE_FLTOVF;
		else if (fpcsr & SPR_FPCSR_UNF)
			code = FPE_FLTUND;
		else if (fpcsr & SPR_FPCSR_DZF)
			code = FPE_FLTDIV;
		else if (fpcsr & SPR_FPCSR_IXF)
			code = FPE_FLTRES;

		/* Clear all flags */
		current->thread.fpcsr &= ~SPR_FPCSR_ALLF;
		restore_fpu(current);
#endif
		force_sig_fault(SIGFPE, code, (void __user *)regs->pc);
	} else {
		pr_emerg("KERNEL: Illegal fpe exception 0x%.8lx\n", regs->pc);
		die("Die:", regs, SIGFPE);
	}
}

asmlinkage void do_trap(struct pt_regs *regs, unsigned long address)
{
	if (user_mode(regs)) {
		force_sig_fault(SIGTRAP, TRAP_BRKPT, (void __user *)regs->pc);

Annotation

Implementation Notes