ContiguousPTE[5/12] modify lookup_pte
Change-Id: Ie5aa625e5a13596ff8294699d10114aeba9d991d
This commit is contained in:
committed by
Masamichi Takagi
parent
0449437c15
commit
c4fbbb6027
@ -2156,20 +2156,39 @@ static pte_t *lookup_pte(translation_table_t* tt, uintptr_t virt, int pgshift,
|
|||||||
|
|
||||||
ptep = NULL;
|
ptep = NULL;
|
||||||
if (!pgshift) {
|
if (!pgshift) {
|
||||||
pgshift = FIRST_LEVEL_BLOCK_SUPPORT ? PTL3_SHIFT : PTL2_SHIFT;
|
if (FIRST_LEVEL_BLOCK_SUPPORT) {
|
||||||
|
pgshift = PTL3_CONT_SHIFT;
|
||||||
|
} else {
|
||||||
|
pgshift = PTL2_CONT_SHIFT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ptep = ptl4_offset(tt, virt);
|
ptep = ptl4_offset(tt, virt);
|
||||||
if (ptl4_null(ptep)) {
|
if (ptl4_null(ptep)) {
|
||||||
if (pgshift > PTL3_SHIFT) {
|
if (pgshift >= PTL3_CONT_SHIFT) {
|
||||||
|
pgshift = PTL3_CONT_SHIFT;
|
||||||
|
} else if (pgshift > PTL3_SHIFT) {
|
||||||
pgshift = PTL3_SHIFT;
|
pgshift = PTL3_SHIFT;
|
||||||
}
|
}
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptep = ptl3_offset(ptep, virt);
|
ptep = ptl3_offset(ptep, virt);
|
||||||
if (ptl3_null(ptep) || ptl3_type_block(ptep)) {
|
if (ptl3_null(ptep)) {
|
||||||
if (pgshift >= PTL3_SHIFT) {
|
if (pgshift >= PTL3_CONT_SHIFT) {
|
||||||
|
pgshift = PTL3_CONT_SHIFT;
|
||||||
|
} else if (pgshift >= PTL3_SHIFT) {
|
||||||
|
pgshift = PTL3_SHIFT;
|
||||||
|
} else {
|
||||||
|
ptep = NULL;
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (ptl3_type_block(ptep)) {
|
||||||
|
if (ptl3_is_contiguous(ptep) &&
|
||||||
|
pgshift >= PTL3_CONT_SHIFT) {
|
||||||
|
pgshift = PTL3_CONT_SHIFT;
|
||||||
|
} else if (pgshift >= PTL3_SHIFT) {
|
||||||
pgshift = PTL3_SHIFT;
|
pgshift = PTL3_SHIFT;
|
||||||
} else {
|
} else {
|
||||||
ptep = NULL;
|
ptep = NULL;
|
||||||
@ -2178,17 +2197,43 @@ static pte_t *lookup_pte(translation_table_t* tt, uintptr_t virt, int pgshift,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ptep = ptl2_offset(ptep, virt);
|
ptep = ptl2_offset(ptep, virt);
|
||||||
if (ptl2_null(ptep) || ptl2_type_block(ptep)) {
|
if (ptl2_null(ptep)) {
|
||||||
if (pgshift >= PTL2_SHIFT) {
|
if (pgshift >= PTL2_CONT_SHIFT) {
|
||||||
|
pgshift = PTL2_CONT_SHIFT;
|
||||||
|
} else if (pgshift >= PTL2_SHIFT) {
|
||||||
pgshift = PTL2_SHIFT;
|
pgshift = PTL2_SHIFT;
|
||||||
} else {
|
} else {
|
||||||
ptep = NULL;;
|
ptep = NULL;
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (ptl2_type_block(ptep)) {
|
||||||
|
if (ptl2_is_contiguous(ptep) &&
|
||||||
|
pgshift >= PTL2_CONT_SHIFT) {
|
||||||
|
pgshift = PTL2_CONT_SHIFT;
|
||||||
|
} else if (pgshift >= PTL2_SHIFT) {
|
||||||
|
pgshift = PTL2_SHIFT;
|
||||||
|
} else {
|
||||||
|
ptep = NULL;
|
||||||
}
|
}
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptep = ptl1_offset(ptep, virt);
|
ptep = ptl1_offset(ptep, virt);
|
||||||
pgshift = PTL1_SHIFT;
|
if (ptl1_type_page(ptep)) {
|
||||||
|
if (ptl1_is_contiguous(ptep) &&
|
||||||
|
pgshift >= PTL1_CONT_SHIFT) {
|
||||||
|
pgshift = PTL1_CONT_SHIFT;
|
||||||
|
} else {
|
||||||
|
pgshift = PTL1_SHIFT;
|
||||||
|
}
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (pgshift >= PTL1_CONT_SHIFT) {
|
||||||
|
pgshift = PTL1_CONT_SHIFT;
|
||||||
|
} else {
|
||||||
|
pgshift = PTL1_SHIFT;
|
||||||
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
size = (size_t)1 << pgshift;
|
size = (size_t)1 << pgshift;
|
||||||
|
|||||||
Reference in New Issue
Block a user