|
@@ -47,6 +47,11 @@
|
|
|
#include <asm/irq.h>
|
|
|
#include <asm/traps.h>
|
|
|
|
|
|
+#define FIQ_OFFSET ({ \
|
|
|
+ extern void *vector_fiq_offset; \
|
|
|
+ (unsigned)&vector_fiq_offset; \
|
|
|
+ })
|
|
|
+
|
|
|
static unsigned long no_fiq_insn;
|
|
|
|
|
|
/* Default reacquire function
|
|
@@ -80,13 +85,16 @@ int show_fiq_list(struct seq_file *p, int prec)
|
|
|
void set_fiq_handler(void *start, unsigned int length)
|
|
|
{
|
|
|
#if defined(CONFIG_CPU_USE_DOMAINS)
|
|
|
- memcpy((void *)0xffff001c, start, length);
|
|
|
+ void *base = (void *)0xffff0000;
|
|
|
#else
|
|
|
- memcpy(vectors_page + 0x1c, start, length);
|
|
|
+ void *base = vectors_page;
|
|
|
#endif
|
|
|
- flush_icache_range(0xffff001c, 0xffff001c + length);
|
|
|
+ unsigned offset = FIQ_OFFSET;
|
|
|
+
|
|
|
+ memcpy(base + offset, start, length);
|
|
|
+ flush_icache_range(0xffff0000 + offset, 0xffff0000 + offset + length);
|
|
|
if (!vectors_high())
|
|
|
- flush_icache_range(0x1c, 0x1c + length);
|
|
|
+ flush_icache_range(offset, offset + length);
|
|
|
}
|
|
|
|
|
|
int claim_fiq(struct fiq_handler *f)
|
|
@@ -144,6 +152,7 @@ EXPORT_SYMBOL(disable_fiq);
|
|
|
|
|
|
void __init init_FIQ(int start)
|
|
|
{
|
|
|
- no_fiq_insn = *(unsigned long *)0xffff001c;
|
|
|
+ unsigned offset = FIQ_OFFSET;
|
|
|
+ no_fiq_insn = *(unsigned long *)(0xffff0000 + offset);
|
|
|
fiq_start = start;
|
|
|
}
|