Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/scottwood/linux into next
Freescale updates from Scott: "Highlights include 8xx breakpoints and perf, t1042rdb display support, and board updates."
This commit is contained in:
@@ -205,6 +205,9 @@ transfer_to_handler_cont:
|
||||
mflr r9
|
||||
lwz r11,0(r9) /* virtual address of handler */
|
||||
lwz r9,4(r9) /* where to go when done */
|
||||
#ifdef CONFIG_PPC_8xx_PERF_EVENT
|
||||
mtspr SPRN_NRI, r0
|
||||
#endif
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
lis r12,reenable_mmu@h
|
||||
ori r12,r12,reenable_mmu@l
|
||||
@@ -292,7 +295,9 @@ stack_ovf:
|
||||
lis r9,StackOverflow@ha
|
||||
addi r9,r9,StackOverflow@l
|
||||
LOAD_MSR_KERNEL(r10,MSR_KERNEL)
|
||||
FIX_SRR1(r10,r12)
|
||||
#ifdef CONFIG_PPC_8xx_PERF_EVENT
|
||||
mtspr SPRN_NRI, r0
|
||||
#endif
|
||||
mtspr SPRN_SRR0,r9
|
||||
mtspr SPRN_SRR1,r10
|
||||
SYNC
|
||||
@@ -417,9 +422,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX)
|
||||
mtlr r4
|
||||
mtcr r5
|
||||
lwz r7,_NIP(r1)
|
||||
FIX_SRR1(r8, r0)
|
||||
lwz r2,GPR2(r1)
|
||||
lwz r1,GPR1(r1)
|
||||
#ifdef CONFIG_PPC_8xx_PERF_EVENT
|
||||
mtspr SPRN_NRI, r0
|
||||
#endif
|
||||
mtspr SPRN_SRR0,r7
|
||||
mtspr SPRN_SRR1,r8
|
||||
SYNC
|
||||
@@ -703,6 +710,9 @@ fast_exception_return:
|
||||
lwz r10,_LINK(r11)
|
||||
mtlr r10
|
||||
REST_GPR(10, r11)
|
||||
#ifdef CONFIG_PPC_8xx_PERF_EVENT
|
||||
mtspr SPRN_NRI, r0
|
||||
#endif
|
||||
mtspr SPRN_SRR1,r9
|
||||
mtspr SPRN_SRR0,r12
|
||||
REST_GPR(9, r11)
|
||||
@@ -951,7 +961,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX)
|
||||
.globl exc_exit_restart
|
||||
exc_exit_restart:
|
||||
lwz r12,_NIP(r1)
|
||||
FIX_SRR1(r9,r10)
|
||||
#ifdef CONFIG_PPC_8xx_PERF_EVENT
|
||||
mtspr SPRN_NRI, r0
|
||||
#endif
|
||||
mtspr SPRN_SRR0,r12
|
||||
mtspr SPRN_SRR1,r9
|
||||
REST_4GPRS(9, r1)
|
||||
@@ -1294,7 +1306,6 @@ _GLOBAL(enter_rtas)
|
||||
1: tophys(r9,r1)
|
||||
lwz r8,INT_FRAME_SIZE+4(r9) /* get return address */
|
||||
lwz r9,8(r9) /* original msr value */
|
||||
FIX_SRR1(r9,r0)
|
||||
addi r1,r1,INT_FRAME_SIZE
|
||||
li r0,0
|
||||
mtspr SPRN_SPRG_RTAS,r0
|
||||
|
@@ -869,7 +869,6 @@ __secondary_start:
|
||||
|
||||
/* enable MMU and jump to start_secondary */
|
||||
li r4,MSR_KERNEL
|
||||
FIX_SRR1(r4,r5)
|
||||
lis r3,start_secondary@h
|
||||
ori r3,r3,start_secondary@l
|
||||
mtspr SPRN_SRR0,r3
|
||||
@@ -977,7 +976,6 @@ start_here:
|
||||
ori r4,r4,2f@l
|
||||
tophys(r4,r4)
|
||||
li r3,MSR_KERNEL & ~(MSR_IR|MSR_DR)
|
||||
FIX_SRR1(r3,r5)
|
||||
mtspr SPRN_SRR0,r4
|
||||
mtspr SPRN_SRR1,r3
|
||||
SYNC
|
||||
@@ -1001,7 +999,6 @@ start_here:
|
||||
|
||||
/* Now turn on the MMU for real! */
|
||||
li r4,MSR_KERNEL
|
||||
FIX_SRR1(r4,r5)
|
||||
lis r3,start_kernel@h
|
||||
ori r3,r3,start_kernel@l
|
||||
mtspr SPRN_SRR0,r3
|
||||
|
@@ -329,6 +329,12 @@ InstructionTLBMiss:
|
||||
mtspr SPRN_SPRG_SCRATCH2, r3
|
||||
#endif
|
||||
EXCEPTION_PROLOG_0
|
||||
#ifdef CONFIG_PPC_8xx_PERF_EVENT
|
||||
lis r10, (itlb_miss_counter - PAGE_OFFSET)@ha
|
||||
lwz r11, (itlb_miss_counter - PAGE_OFFSET)@l(r10)
|
||||
addi r11, r11, 1
|
||||
stw r11, (itlb_miss_counter - PAGE_OFFSET)@l(r10)
|
||||
#endif
|
||||
|
||||
/* If we are faulting a kernel address, we have to use the
|
||||
* kernel page tables.
|
||||
@@ -429,6 +435,12 @@ InstructionTLBMiss:
|
||||
DataStoreTLBMiss:
|
||||
mtspr SPRN_SPRG_SCRATCH2, r3
|
||||
EXCEPTION_PROLOG_0
|
||||
#ifdef CONFIG_PPC_8xx_PERF_EVENT
|
||||
lis r10, (dtlb_miss_counter - PAGE_OFFSET)@ha
|
||||
lwz r11, (dtlb_miss_counter - PAGE_OFFSET)@l(r10)
|
||||
addi r11, r11, 1
|
||||
stw r11, (dtlb_miss_counter - PAGE_OFFSET)@l(r10)
|
||||
#endif
|
||||
mfcr r3
|
||||
|
||||
/* If we are faulting a kernel address, we have to use the
|
||||
@@ -561,6 +573,7 @@ InstructionTLBError:
|
||||
andis. r10,r5,0x4000
|
||||
beq+ 1f
|
||||
tlbie r4
|
||||
itlbie:
|
||||
/* 0x400 is InstructionAccess exception, needed by bad_page_fault() */
|
||||
1: EXC_XFER_LITE(0x400, handle_page_fault)
|
||||
|
||||
@@ -585,6 +598,7 @@ DARFixed:/* Return from dcbx instruction bug workaround */
|
||||
andis. r10,r5,0x4000
|
||||
beq+ 1f
|
||||
tlbie r4
|
||||
dtlbie:
|
||||
1: li r10,RPN_PATTERN
|
||||
mtspr SPRN_DAR,r10 /* Tag DAR, to be used in DTLB Error */
|
||||
/* 0x300 is DataAccess exception, needed by bad_page_fault() */
|
||||
@@ -602,8 +616,43 @@ DARFixed:/* Return from dcbx instruction bug workaround */
|
||||
* support of breakpoints and such. Someday I will get around to
|
||||
* using them.
|
||||
*/
|
||||
EXCEPTION(0x1c00, Trap_1c, unknown_exception, EXC_XFER_EE)
|
||||
. = 0x1c00
|
||||
DataBreakpoint:
|
||||
EXCEPTION_PROLOG_0
|
||||
mfcr r10
|
||||
mfspr r11, SPRN_SRR0
|
||||
cmplwi cr0, r11, (dtlbie - PAGE_OFFSET)@l
|
||||
cmplwi cr7, r11, (itlbie - PAGE_OFFSET)@l
|
||||
beq- cr0, 11f
|
||||
beq- cr7, 11f
|
||||
EXCEPTION_PROLOG_1
|
||||
EXCEPTION_PROLOG_2
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
mfspr r4,SPRN_BAR
|
||||
stw r4,_DAR(r11)
|
||||
mfspr r5,SPRN_DSISR
|
||||
EXC_XFER_EE(0x1c00, do_break)
|
||||
11:
|
||||
mtcr r10
|
||||
EXCEPTION_EPILOG_0
|
||||
rfi
|
||||
|
||||
#ifdef CONFIG_PPC_8xx_PERF_EVENT
|
||||
. = 0x1d00
|
||||
InstructionBreakpoint:
|
||||
EXCEPTION_PROLOG_0
|
||||
lis r10, (instruction_counter - PAGE_OFFSET)@ha
|
||||
lwz r11, (instruction_counter - PAGE_OFFSET)@l(r10)
|
||||
addi r11, r11, -1
|
||||
stw r11, (instruction_counter - PAGE_OFFSET)@l(r10)
|
||||
lis r10, 0xffff
|
||||
ori r10, r10, 0x01
|
||||
mtspr SPRN_COUNTA, r10
|
||||
EXCEPTION_EPILOG_0
|
||||
rfi
|
||||
#else
|
||||
EXCEPTION(0x1d00, Trap_1d, unknown_exception, EXC_XFER_EE)
|
||||
#endif
|
||||
EXCEPTION(0x1e00, Trap_1e, unknown_exception, EXC_XFER_EE)
|
||||
EXCEPTION(0x1f00, Trap_1f, unknown_exception, EXC_XFER_EE)
|
||||
|
||||
@@ -977,6 +1026,14 @@ initial_mmu:
|
||||
lis r8, IDC_ENABLE@h
|
||||
mtspr SPRN_DC_CST, r8
|
||||
#endif
|
||||
/* Disable debug mode entry on breakpoints */
|
||||
mfspr r8, SPRN_DER
|
||||
#ifdef CONFIG_PPC_8xx_PERF_EVENT
|
||||
rlwinm r8, r8, 0, ~0xc
|
||||
#else
|
||||
rlwinm r8, r8, 0, ~0x8
|
||||
#endif
|
||||
mtspr SPRN_DER, r8
|
||||
blr
|
||||
|
||||
|
||||
@@ -1010,3 +1067,16 @@ cpu6_errata_word:
|
||||
.space 16
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PPC_8xx_PERF_EVENT
|
||||
.globl itlb_miss_counter
|
||||
itlb_miss_counter:
|
||||
.space 4
|
||||
|
||||
.globl dtlb_miss_counter
|
||||
dtlb_miss_counter:
|
||||
.space 4
|
||||
|
||||
.globl instruction_counter
|
||||
instruction_counter:
|
||||
.space 4
|
||||
#endif
|
||||
|
@@ -211,9 +211,11 @@ int hw_breakpoint_handler(struct die_args *args)
|
||||
int rc = NOTIFY_STOP;
|
||||
struct perf_event *bp;
|
||||
struct pt_regs *regs = args->regs;
|
||||
#ifndef CONFIG_PPC_8xx
|
||||
int stepped = 1;
|
||||
struct arch_hw_breakpoint *info;
|
||||
unsigned int instr;
|
||||
#endif
|
||||
struct arch_hw_breakpoint *info;
|
||||
unsigned long dar = regs->dar;
|
||||
|
||||
/* Disable breakpoints during exception handling */
|
||||
@@ -257,6 +259,7 @@ int hw_breakpoint_handler(struct die_args *args)
|
||||
(dar - bp->attr.bp_addr < bp->attr.bp_len)))
|
||||
info->type |= HW_BRK_TYPE_EXTRANEOUS_IRQ;
|
||||
|
||||
#ifndef CONFIG_PPC_8xx
|
||||
/* Do not emulate user-space instructions, instead single-step them */
|
||||
if (user_mode(regs)) {
|
||||
current->thread.last_hit_ubp = bp;
|
||||
@@ -280,6 +283,7 @@ int hw_breakpoint_handler(struct die_args *args)
|
||||
perf_event_disable_inatomic(bp);
|
||||
goto out;
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
* As a policy, the callback is invoked in a 'trigger-after-execute'
|
||||
* fashion
|
||||
|
@@ -736,6 +736,28 @@ static inline int __set_dabr(unsigned long dabr, unsigned long dabrx)
|
||||
mtspr(SPRN_DABRX, dabrx);
|
||||
return 0;
|
||||
}
|
||||
#elif defined(CONFIG_PPC_8xx)
|
||||
static inline int __set_dabr(unsigned long dabr, unsigned long dabrx)
|
||||
{
|
||||
unsigned long addr = dabr & ~HW_BRK_TYPE_DABR;
|
||||
unsigned long lctrl1 = 0x90000000; /* compare type: equal on E & F */
|
||||
unsigned long lctrl2 = 0x8e000002; /* watchpoint 1 on cmp E | F */
|
||||
|
||||
if ((dabr & HW_BRK_TYPE_RDWR) == HW_BRK_TYPE_READ)
|
||||
lctrl1 |= 0xa0000;
|
||||
else if ((dabr & HW_BRK_TYPE_RDWR) == HW_BRK_TYPE_WRITE)
|
||||
lctrl1 |= 0xf0000;
|
||||
else if ((dabr & HW_BRK_TYPE_RDWR) == 0)
|
||||
lctrl2 = 0;
|
||||
|
||||
mtspr(SPRN_LCTRL2, 0);
|
||||
mtspr(SPRN_CMPE, addr);
|
||||
mtspr(SPRN_CMPF, addr + 4);
|
||||
mtspr(SPRN_LCTRL1, lctrl1);
|
||||
mtspr(SPRN_LCTRL2, lctrl2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static inline int __set_dabr(unsigned long dabr, unsigned long dabrx)
|
||||
{
|
||||
|
Reference in New Issue
Block a user