diff options
| author | David Feng <fenghua@phytium.com.cn> | 2013-12-14 11:47:35 +0800 | 
|---|---|---|
| committer | Albert ARIBAUD <albert.u.boot@aribaud.net> | 2014-01-09 16:08:44 +0100 | 
| commit | 0ae7653128c80a4f2920cbe9b124792c2fd9d9e0 (patch) | |
| tree | 14fea7a80e4ea84c7b6a3bc32298daeec55054c7 /arch/arm/cpu/armv8/exceptions.S | |
| parent | 54799e4596bf8af33fd4a8dee153be7011c06d8d (diff) | |
| download | olio-uboot-2014.01-0ae7653128c80a4f2920cbe9b124792c2fd9d9e0.tar.xz olio-uboot-2014.01-0ae7653128c80a4f2920cbe9b124792c2fd9d9e0.zip | |
arm64: core support
Relocation code based on a patch by Scott Wood, which is:
Signed-off-by: Scott Wood <scottwood@freescale.com>
Signed-off-by: David Feng <fenghua@phytium.com.cn>
Diffstat (limited to 'arch/arm/cpu/armv8/exceptions.S')
| -rw-r--r-- | arch/arm/cpu/armv8/exceptions.S | 113 | 
1 files changed, 113 insertions, 0 deletions
| diff --git a/arch/arm/cpu/armv8/exceptions.S b/arch/arm/cpu/armv8/exceptions.S new file mode 100644 index 000000000..b91a1b662 --- /dev/null +++ b/arch/arm/cpu/armv8/exceptions.S @@ -0,0 +1,113 @@ +/* + * (C) Copyright 2013 + * David Feng <fenghua@phytium.com.cn> + * + * SPDX-License-Identifier:	GPL-2.0+ + */ + +#include <asm-offsets.h> +#include <config.h> +#include <version.h> +#include <asm/ptrace.h> +#include <asm/macro.h> +#include <linux/linkage.h> + +/* + * Enter Exception. + * This will save the processor state that is ELR/X0~X30 + * to the stack frame. + */ +.macro	exception_entry +	stp	x29, x30, [sp, #-16]! +	stp	x27, x28, [sp, #-16]! +	stp	x25, x26, [sp, #-16]! +	stp	x23, x24, [sp, #-16]! +	stp	x21, x22, [sp, #-16]! +	stp	x19, x20, [sp, #-16]! +	stp	x17, x18, [sp, #-16]! +	stp	x15, x16, [sp, #-16]! +	stp	x13, x14, [sp, #-16]! +	stp	x11, x12, [sp, #-16]! +	stp	x9, x10, [sp, #-16]! +	stp	x7, x8, [sp, #-16]! +	stp	x5, x6, [sp, #-16]! +	stp	x3, x4, [sp, #-16]! +	stp	x1, x2, [sp, #-16]! + +	/* Could be running at EL3/EL2/EL1 */ +	switch_el x11, 3f, 2f, 1f +3:	mrs	x1, esr_el3 +	mrs	x2, elr_el3 +	b	0f +2:	mrs	x1, esr_el2 +	mrs	x2, elr_el2 +	b	0f +1:	mrs	x1, esr_el1 +	mrs	x2, elr_el1 +0: +	stp	x2, x0, [sp, #-16]! +	mov	x0, sp +.endm + +/* + * Exception vectors. + */ +	.align	11 +	.globl	vectors +vectors: +	.align	7 +	b	_do_bad_sync	/* Current EL Synchronous Thread */ + +	.align	7 +	b	_do_bad_irq	/* Current EL IRQ Thread */ + +	.align	7 +	b	_do_bad_fiq	/* Current EL FIQ Thread */ + +	.align	7 +	b	_do_bad_error	/* Current EL Error Thread */ + +	.align	7 +	b	_do_sync	/* Current EL Synchronous Handler */ + +	.align	7 +	b	_do_irq		/* Current EL IRQ Handler */ + +	.align	7 +	b	_do_fiq		/* Current EL FIQ Handler */ + +	.align	7 +	b	_do_error	/* Current EL Error Handler */ + + +_do_bad_sync: +	exception_entry +	bl	do_bad_sync + +_do_bad_irq: +	exception_entry +	bl	do_bad_irq + +_do_bad_fiq: +	exception_entry +	bl	do_bad_fiq + +_do_bad_error: +	exception_entry +	bl	do_bad_error + +_do_sync: +	exception_entry +	bl	do_sync + +_do_irq: +	exception_entry +	bl	do_irq + +_do_fiq: +	exception_entry +	bl	do_fiq + +_do_error: +	exception_entry +	bl	do_error |