|
24 | 24 | * ID_AA64MMFR4_EL1.E2H0 < 0. On such CPUs HCR_EL2.E2H is RES1, but it |
25 | 25 | * can reset into an UNKNOWN state and might not read as 1 until it has |
26 | 26 | * been initialized explicitly. |
27 | | - * |
28 | | - * Fruity CPUs seem to have HCR_EL2.E2H set to RAO/WI, but |
29 | | - * don't advertise it (they predate this relaxation). |
30 | | - * |
31 | 27 | * Initalize HCR_EL2.E2H so that later code can rely upon HCR_EL2.E2H |
32 | 28 | * indicating whether the CPU is running in E2H mode. |
33 | 29 | */ |
34 | 30 | mrs_s x1, SYS_ID_AA64MMFR4_EL1 |
35 | 31 | sbfx x1, x1, #ID_AA64MMFR4_EL1_E2H0_SHIFT, #ID_AA64MMFR4_EL1_E2H0_WIDTH |
36 | 32 | cmp x1, #0 |
37 | | - b.ge .LnVHE_\@ |
| 33 | + b.lt .LnE2H0_\@ |
38 | 34 |
|
| 35 | + /* |
| 36 | + * Unfortunately, HCR_EL2.E2H can be RES1 even if not advertised |
| 37 | + * as such via ID_AA64MMFR4_EL1.E2H0: |
| 38 | + * |
| 39 | + * - Fruity CPUs predate the !FEAT_E2H0 relaxation, and seem to |
| 40 | + * have HCR_EL2.E2H implemented as RAO/WI. |
| 41 | + * |
| 42 | + * - On CPUs that lack FEAT_FGT, a hypervisor can't trap guest |
| 43 | + * reads of ID_AA64MMFR4_EL1 to advertise !FEAT_E2H0. NV |
| 44 | + * guests on these hosts can write to HCR_EL2.E2H without |
| 45 | + * trapping to the hypervisor, but these writes have no |
| 46 | + * functional effect. |
| 47 | + * |
| 48 | + * Handle both cases by checking for an essential VHE property |
| 49 | + * (system register remapping) to decide whether we're |
| 50 | + * effectively VHE-only or not. |
| 51 | + */ |
| 52 | + msr_hcr_el2 x0 // Setup HCR_EL2 as nVHE |
| 53 | + isb |
| 54 | + mov x1, #1 // Write something to FAR_EL1 |
| 55 | + msr far_el1, x1 |
| 56 | + isb |
| 57 | + mov x1, #2 // Try to overwrite it via FAR_EL2 |
| 58 | + msr far_el2, x1 |
| 59 | + isb |
| 60 | + mrs x1, far_el1 // If we see the latest write in FAR_EL1, |
| 61 | + cmp x1, #2 // we can safely assume we are VHE only. |
| 62 | + b.ne .LnVHE_\@ // Otherwise, we know that nVHE works. |
| 63 | + |
| 64 | +.LnE2H0_\@: |
39 | 65 | orr x0, x0, #HCR_E2H |
40 | | -.LnVHE_\@: |
41 | 66 | msr_hcr_el2 x0 |
42 | 67 | isb |
| 68 | +.LnVHE_\@: |
43 | 69 | .endm |
44 | 70 |
|
45 | 71 | .macro __init_el2_sctlr |
|
0 commit comments