[PATCH] powerpc: G4+ oprofile support
This patch adds oprofile support for the 7450 and all its multitudinous derivatives. * Added 7450 (and derivatives) support for oprofile * Changed e500 cputable to have oprofile model and cpu_type fields * Added support for classic 32-bit performance monitor interrupt * Cleaned up common powerpc oprofile code to be as common as possible * Cleaned up oprofile_impl.h to reflect 32 bit classic code * Added 32-bit MMCRx bitfield definitions and SPR numbers Signed-off-by: Andy Fleming <afleming@freescale.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:

committed by
Paul Mackerras

parent
e5cd040409
commit
555d97ac87
@@ -545,7 +545,11 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_745x
|
||||
.cpu_setup = __setup_cpu_745x,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/7450",
|
||||
.oprofile_model = &op_model_7450,
|
||||
#endif
|
||||
},
|
||||
{ /* 7450 2.1 */
|
||||
.pvr_mask = 0xffffffff,
|
||||
@@ -556,7 +560,11 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_745x
|
||||
.cpu_setup = __setup_cpu_745x,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/7450",
|
||||
.oprofile_model = &op_model_7450,
|
||||
#endif
|
||||
},
|
||||
{ /* 7450 2.3 and newer */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -567,7 +575,11 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_745x
|
||||
.cpu_setup = __setup_cpu_745x,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/7450",
|
||||
.oprofile_model = &op_model_7450,
|
||||
#endif
|
||||
},
|
||||
{ /* 7455 rev 1.x */
|
||||
.pvr_mask = 0xffffff00,
|
||||
@@ -578,7 +590,11 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_745x
|
||||
.cpu_setup = __setup_cpu_745x,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/7450",
|
||||
.oprofile_model = &op_model_7450,
|
||||
#endif
|
||||
},
|
||||
{ /* 7455 rev 2.0 */
|
||||
.pvr_mask = 0xffffffff,
|
||||
@@ -589,7 +605,11 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_745x
|
||||
.cpu_setup = __setup_cpu_745x,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/7450",
|
||||
.oprofile_model = &op_model_7450,
|
||||
#endif
|
||||
},
|
||||
{ /* 7455 others */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -600,7 +620,11 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_745x
|
||||
.cpu_setup = __setup_cpu_745x,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/7450",
|
||||
.oprofile_model = &op_model_7450,
|
||||
#endif
|
||||
},
|
||||
{ /* 7447/7457 Rev 1.0 */
|
||||
.pvr_mask = 0xffffffff,
|
||||
@@ -611,7 +635,11 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_745x
|
||||
.cpu_setup = __setup_cpu_745x,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/7450",
|
||||
.oprofile_model = &op_model_7450,
|
||||
#endif
|
||||
},
|
||||
{ /* 7447/7457 Rev 1.1 */
|
||||
.pvr_mask = 0xffffffff,
|
||||
@@ -622,7 +650,11 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_745x
|
||||
.cpu_setup = __setup_cpu_745x,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/7450",
|
||||
.oprofile_model = &op_model_7450,
|
||||
#endif
|
||||
},
|
||||
{ /* 7447/7457 Rev 1.2 and later */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -633,7 +665,11 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_745x
|
||||
.cpu_setup = __setup_cpu_745x,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/7450",
|
||||
.oprofile_model = &op_model_7450,
|
||||
#endif
|
||||
},
|
||||
{ /* 7447A */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -644,7 +680,11 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_745x
|
||||
.cpu_setup = __setup_cpu_745x,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/7450",
|
||||
.oprofile_model = &op_model_7450,
|
||||
#endif
|
||||
},
|
||||
{ /* 7448 */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -655,7 +695,11 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 6,
|
||||
.cpu_setup = __setup_cpu_745x
|
||||
.cpu_setup = __setup_cpu_745x,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/7450",
|
||||
.oprofile_model = &op_model_7450,
|
||||
#endif
|
||||
},
|
||||
{ /* 82xx (8240, 8245, 8260 are all 603e cores) */
|
||||
.pvr_mask = 0x7fff0000,
|
||||
@@ -979,6 +1023,10 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 4,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/e500",
|
||||
.oprofile_model = &op_model_fsl_booke,
|
||||
#endif
|
||||
},
|
||||
{ /* e500v2 */
|
||||
.pvr_mask = 0xffff0000,
|
||||
@@ -992,6 +1040,10 @@ struct cpu_spec cpu_specs[] = {
|
||||
.icache_bsize = 32,
|
||||
.dcache_bsize = 32,
|
||||
.num_pmcs = 4,
|
||||
#ifdef CONFIG_OPROFILE
|
||||
.oprofile_cpu_type = "ppc/e500",
|
||||
.oprofile_model = &op_model_fsl_booke,
|
||||
#endif
|
||||
},
|
||||
#endif
|
||||
#if !CLASSIC_PPC
|
||||
|
@@ -466,16 +466,11 @@ SystemCall:
|
||||
* by executing an altivec instruction.
|
||||
*/
|
||||
. = 0xf00
|
||||
b Trap_0f
|
||||
b PerformanceMonitor
|
||||
|
||||
. = 0xf20
|
||||
b AltiVecUnavailable
|
||||
|
||||
Trap_0f:
|
||||
EXCEPTION_PROLOG
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_EE(0xf00, unknown_exception)
|
||||
|
||||
/*
|
||||
* Handle TLB miss for instruction on 603/603e.
|
||||
* Note: we get an alternate set of r0 - r3 to use automatically.
|
||||
@@ -719,6 +714,11 @@ AltiVecUnavailable:
|
||||
#endif /* CONFIG_ALTIVEC */
|
||||
EXC_XFER_EE_LITE(0xf20, altivec_unavailable_exception)
|
||||
|
||||
PerformanceMonitor:
|
||||
EXCEPTION_PROLOG
|
||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||
EXC_XFER_STD(0xf00, performance_monitor_exception)
|
||||
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
/* Note that the AltiVec support is closely modeled after the FP
|
||||
* support. Changes to one are likely to be applicable to the
|
||||
|
@@ -43,8 +43,13 @@ static void dummy_perf(struct pt_regs *regs)
|
||||
mtspr(SPRN_MMCR0, mmcr0);
|
||||
}
|
||||
#else
|
||||
/* Ensure exceptions are disabled */
|
||||
static void dummy_perf(struct pt_regs *regs)
|
||||
{
|
||||
unsigned int mmcr0 = mfspr(SPRN_MMCR0);
|
||||
|
||||
mmcr0 &= ~(MMCR0_PMXE);
|
||||
mtspr(SPRN_MMCR0, mmcr0);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@@ -901,12 +901,10 @@ void altivec_unavailable_exception(struct pt_regs *regs)
|
||||
die("Unrecoverable VMX/Altivec Unavailable Exception", regs, SIGABRT);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PPC64) || defined(CONFIG_E500)
|
||||
void performance_monitor_exception(struct pt_regs *regs)
|
||||
{
|
||||
perf_irq(regs);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_8xx
|
||||
void SoftwareEmulation(struct pt_regs *regs)
|
||||
|
Reference in New Issue
Block a user