|
@@ -71,7 +71,7 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
|
|
|
{
|
|
|
struct spu_priv2 __iomem *priv2 = spu->priv2;
|
|
|
struct mm_struct *mm = spu->mm;
|
|
|
- u64 esid, vsid;
|
|
|
+ u64 esid, vsid, llp;
|
|
|
|
|
|
pr_debug("%s\n", __FUNCTION__);
|
|
|
|
|
@@ -91,9 +91,14 @@ static int __spu_trap_data_seg(struct spu *spu, unsigned long ea)
|
|
|
}
|
|
|
|
|
|
esid = (ea & ESID_MASK) | SLB_ESID_V;
|
|
|
- vsid = (get_vsid(mm->context.id, ea) << SLB_VSID_SHIFT) | SLB_VSID_USER;
|
|
|
+#ifdef CONFIG_HUGETLB_PAGE
|
|
|
if (in_hugepage_area(mm->context, ea))
|
|
|
- vsid |= SLB_VSID_L;
|
|
|
+ llp = mmu_psize_defs[mmu_huge_psize].sllp;
|
|
|
+ else
|
|
|
+#endif
|
|
|
+ llp = mmu_psize_defs[mmu_virtual_psize].sllp;
|
|
|
+ vsid = (get_vsid(mm->context.id, ea) << SLB_VSID_SHIFT) |
|
|
|
+ SLB_VSID_USER | llp;
|
|
|
|
|
|
out_be64(&priv2->slb_index_W, spu->slb_replace);
|
|
|
out_be64(&priv2->slb_vsid_RW, vsid);
|