SMMU: supporting cap deletion on control caps

Providing support to delete the two control caps: the
stream ID control cap and the context bank control cap.

Signed-off-by: Oliver Scott <Oliver.Scott@data61.csiro.au>
This commit is contained in:
Qian Ge
2020-01-22 15:49:42 +11:00
committed by Oliver Scott
parent 69c9f55f4d
commit 35bb485e29

View File

@@ -299,19 +299,28 @@ bool_t CONST Arch_sameRegionAs(cap_t cap_a, cap_t cap_b)
}
#endif
#ifdef CONFIG_ARM_SMMU
case cap_cb_cap:
if (cap_get_capType(cap_b) == cap_cb_cap) {
return cap_cb_cap_get_capCB(cap_a) ==
cap_cb_cap_get_capCB(cap_b);
case cap_sid_control_cap:
if (cap_get_capType(cap_b) == cap_sid_control_cap ||
cap_get_capType(cap_b) == cap_sid_cap) {
return true;
}
case cap_cb_control_cap:
if (cap_get_capType(cap_b) == cap_cb_control_cap ||
cap_get_capType(cap_b) == cap_cb_cap) {
return true;
}
case cap_sid_cap:
if (cap_get_capType(cap_b) == cap_sid_cap) {
return cap_sid_cap_get_capSID(cap_a) ==
cap_sid_cap_get_capSID(cap_b);
}
case cap_cb_cap:
if (cap_get_capType(cap_b) == cap_cb_cap) {
return cap_cb_cap_get_capCB(cap_a) ==
cap_cb_cap_get_capCB(cap_b);
}
#endif
}
return false;
}
@@ -327,6 +336,16 @@ bool_t CONST Arch_sameObjectAs(cap_t cap_a, cap_t cap_b)
(cap_frame_cap_get_capFIsDevice(cap_b) == 0)));
}
}
#ifdef CONFIG_ARM_SMMU
if (cap_get_capType(cap_a) == cap_sid_control_cap &&
cap_get_capType(cap_b) == cap_sid_cap) {
return false;
}
if (cap_get_capType(cap_a) == cap_cb_control_cap &&
cap_get_capType(cap_b) == cap_cb_cap) {
return false;
}
#endif
return Arch_sameRegionAs(cap_a, cap_b);
}