powerpc/cell: Fix iommu exception reporting
Currently, we will report a page fault as a segment fault, and report a segment fault as both a page and segment fault. Fix the SPF_P definition to be correct according to the iommu docs, and mask before comparing. Signed-off-by: Jeremy Kerr <jk@ozlabs.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
Родитель
2319f12395
Коммит
2a7d55fda5
|
@ -74,7 +74,7 @@
|
||||||
#define IOC_IO_ExcpStat_V 0x8000000000000000ul
|
#define IOC_IO_ExcpStat_V 0x8000000000000000ul
|
||||||
#define IOC_IO_ExcpStat_SPF_Mask 0x6000000000000000ul
|
#define IOC_IO_ExcpStat_SPF_Mask 0x6000000000000000ul
|
||||||
#define IOC_IO_ExcpStat_SPF_S 0x6000000000000000ul
|
#define IOC_IO_ExcpStat_SPF_S 0x6000000000000000ul
|
||||||
#define IOC_IO_ExcpStat_SPF_P 0x4000000000000000ul
|
#define IOC_IO_ExcpStat_SPF_P 0x2000000000000000ul
|
||||||
#define IOC_IO_ExcpStat_ADDR_Mask 0x00000007fffff000ul
|
#define IOC_IO_ExcpStat_ADDR_Mask 0x00000007fffff000ul
|
||||||
#define IOC_IO_ExcpStat_RW_Mask 0x0000000000000800ul
|
#define IOC_IO_ExcpStat_RW_Mask 0x0000000000000800ul
|
||||||
#define IOC_IO_ExcpStat_IOID_Mask 0x00000000000007fful
|
#define IOC_IO_ExcpStat_IOID_Mask 0x00000000000007fful
|
||||||
|
@ -247,17 +247,18 @@ static void tce_free_cell(struct iommu_table *tbl, long index, long npages)
|
||||||
|
|
||||||
static irqreturn_t ioc_interrupt(int irq, void *data)
|
static irqreturn_t ioc_interrupt(int irq, void *data)
|
||||||
{
|
{
|
||||||
unsigned long stat;
|
unsigned long stat, spf;
|
||||||
struct cbe_iommu *iommu = data;
|
struct cbe_iommu *iommu = data;
|
||||||
|
|
||||||
stat = in_be64(iommu->xlate_regs + IOC_IO_ExcpStat);
|
stat = in_be64(iommu->xlate_regs + IOC_IO_ExcpStat);
|
||||||
|
spf = stat & IOC_IO_ExcpStat_SPF_Mask;
|
||||||
|
|
||||||
/* Might want to rate limit it */
|
/* Might want to rate limit it */
|
||||||
printk(KERN_ERR "iommu: DMA exception 0x%016lx\n", stat);
|
printk(KERN_ERR "iommu: DMA exception 0x%016lx\n", stat);
|
||||||
printk(KERN_ERR " V=%d, SPF=[%c%c], RW=%s, IOID=0x%04x\n",
|
printk(KERN_ERR " V=%d, SPF=[%c%c], RW=%s, IOID=0x%04x\n",
|
||||||
!!(stat & IOC_IO_ExcpStat_V),
|
!!(stat & IOC_IO_ExcpStat_V),
|
||||||
(stat & IOC_IO_ExcpStat_SPF_S) ? 'S' : ' ',
|
(spf == IOC_IO_ExcpStat_SPF_S) ? 'S' : ' ',
|
||||||
(stat & IOC_IO_ExcpStat_SPF_P) ? 'P' : ' ',
|
(spf == IOC_IO_ExcpStat_SPF_P) ? 'P' : ' ',
|
||||||
(stat & IOC_IO_ExcpStat_RW_Mask) ? "Read" : "Write",
|
(stat & IOC_IO_ExcpStat_RW_Mask) ? "Read" : "Write",
|
||||||
(unsigned int)(stat & IOC_IO_ExcpStat_IOID_Mask));
|
(unsigned int)(stat & IOC_IO_ExcpStat_IOID_Mask));
|
||||||
printk(KERN_ERR " page=0x%016lx\n",
|
printk(KERN_ERR " page=0x%016lx\n",
|
||||||
|
|
Загрузка…
Ссылка в новой задаче