1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-18 10:35:55 +00:00

For data and instruction prefetch aborts, call the same handler in the C

code, passing a 0/1 flag that indicates which type of abort it was.  This
sets the stage for unifying the handling of page faults in a single routine.

Submitted by: Svatopluk Kraus <onwahe@gmail.com>,
	      Michal Meloun <meloun@miracle.cz
This commit is contained in:
Ian Lepore 2014-12-25 17:06:58 +00:00
parent b05d247e35
commit 26659812e2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=276206
3 changed files with 12 additions and 8 deletions

View File

@ -320,7 +320,8 @@ ASENTRY_NP(prefetch_abort_entry)
PUSHFRAMEINSVC /* mode stack, build trapframe there. */ PUSHFRAMEINSVC /* mode stack, build trapframe there. */
adr lr, exception_exit /* Return from handler via standard */ adr lr, exception_exit /* Return from handler via standard */
mov r0, sp /* exception exit routine. Pass the */ mov r0, sp /* exception exit routine. Pass the */
b prefetch_abort_handler /* trapframe to the handler. */ mov r1, #1 /* Type flag */
b _C_LABEL(abort_handler)
END(prefetch_abort_entry) END(prefetch_abort_entry)
/* /*
@ -337,9 +338,10 @@ ASENTRY_NP(data_abort_entry)
#endif #endif
sub lr, lr, #8 /* Adjust the lr. Transition to scv32 */ sub lr, lr, #8 /* Adjust the lr. Transition to scv32 */
PUSHFRAMEINSVC /* mode stack, build trapframe there. */ PUSHFRAMEINSVC /* mode stack, build trapframe there. */
adr lr, exception_exit /* Return from handler via standard */ adr lr, exception_exit /* Exception exit routine */
mov r0, sp /* exception exit routine. Pass the */ mov r0, sp /* Trapframe to the handler */
b data_abort_handler /* trapframe to the handler. */ mov r1, #0 /* Type flag */
b _C_LABEL(abort_handler)
END(data_abort_entry) END(data_abort_entry)
/* /*

View File

@ -127,6 +127,7 @@ static int dab_align(struct trapframe *, u_int, u_int, struct thread *,
struct ksig *); struct ksig *);
static int dab_buserr(struct trapframe *, u_int, u_int, struct thread *, static int dab_buserr(struct trapframe *, u_int, u_int, struct thread *,
struct ksig *); struct ksig *);
static void prefetch_abort_handler(struct trapframe *);
static const struct data_abort data_aborts[] = { static const struct data_abort data_aborts[] = {
{dab_fatal, "Vector Exception"}, {dab_fatal, "Vector Exception"},
@ -171,7 +172,7 @@ call_trapsignal(struct thread *td, int sig, u_long code)
} }
void void
data_abort_handler(struct trapframe *tf) abort_handler(struct trapframe *tf, int type)
{ {
struct vm_map *map; struct vm_map *map;
struct pcb *pcb; struct pcb *pcb;
@ -184,6 +185,8 @@ data_abort_handler(struct trapframe *tf)
struct ksig ksig; struct ksig ksig;
struct proc *p; struct proc *p;
if (type == 1)
return (prefetch_abort_handler(tf));
/* Grab FAR/FSR before enabling interrupts */ /* Grab FAR/FSR before enabling interrupts */
far = cpu_faultaddress(); far = cpu_faultaddress();
@ -605,7 +608,7 @@ dab_buserr(struct trapframe *tf, u_int fsr, u_int far, struct thread *td,
* does no have read permission so send it a signal. * does no have read permission so send it a signal.
* Otherwise fault the page in and try again. * Otherwise fault the page in and try again.
*/ */
void static void
prefetch_abort_handler(struct trapframe *tf) prefetch_abort_handler(struct trapframe *tf)
{ {
struct thread *td; struct thread *td;

View File

@ -20,8 +20,7 @@ struct trapframe;
void arm_lock_cache_line(vm_offset_t); void arm_lock_cache_line(vm_offset_t);
void init_proc0(vm_offset_t kstack); void init_proc0(vm_offset_t kstack);
void halt(void); void halt(void);
void data_abort_handler(struct trapframe *); void abort_handler(struct trapframe *, int );
void prefetch_abort_handler(struct trapframe *);
void set_stackptrs(int cpu); void set_stackptrs(int cpu);
void undefinedinstruction_bounce(struct trapframe *); void undefinedinstruction_bounce(struct trapframe *);