mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-25 14:44:28 +02:00
ArmPkg: Forbade user access to supervisor sections.
This commit is contained in:
parent
fb6fc31450
commit
1e5fbf7b87
@ -252,7 +252,7 @@ FillTranslationTable (
|
|||||||
break;
|
break;
|
||||||
case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_XP:
|
case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK_XP:
|
||||||
Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK;
|
Attributes = TT_DESCRIPTOR_SECTION_WRITE_BACK;
|
||||||
Attributes |= TT_DESCRIPTOR_SECTION_XN_MASK;
|
Attributes |= TT_DESCRIPTOR_SECTION_XN_MASK | TT_DESCRIPTOR_SECTION_PXN_MASK;
|
||||||
break;
|
break;
|
||||||
case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH:
|
case ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH:
|
||||||
Attributes = TT_DESCRIPTOR_SECTION_WRITE_THROUGH;
|
Attributes = TT_DESCRIPTOR_SECTION_WRITE_THROUGH;
|
||||||
|
@ -295,6 +295,9 @@ UpdateSectionEntries (
|
|||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((Attributes & EFI_MEMORY_USER) != 0) {
|
||||||
|
EntryValue |= TT_DESCRIPTOR_SECTION_PXN_MASK;
|
||||||
|
|
||||||
if ((Attributes & EFI_MEMORY_RO) != 0) {
|
if ((Attributes & EFI_MEMORY_RO) != 0) {
|
||||||
EntryValue |= TT_DESCRIPTOR_SECTION_AP_RO_RO;
|
EntryValue |= TT_DESCRIPTOR_SECTION_AP_RO_RO;
|
||||||
} else {
|
} else {
|
||||||
@ -304,6 +307,19 @@ UpdateSectionEntries (
|
|||||||
if ((Attributes & EFI_MEMORY_XP) != 0) {
|
if ((Attributes & EFI_MEMORY_XP) != 0) {
|
||||||
EntryValue |= TT_DESCRIPTOR_SECTION_XN_MASK;
|
EntryValue |= TT_DESCRIPTOR_SECTION_XN_MASK;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
EntryValue |= TT_DESCRIPTOR_SECTION_XN_MASK;
|
||||||
|
|
||||||
|
if ((Attributes & EFI_MEMORY_RO) != 0) {
|
||||||
|
EntryValue |= TT_DESCRIPTOR_SECTION_AP_NO_RO;
|
||||||
|
} else {
|
||||||
|
EntryValue |= TT_DESCRIPTOR_SECTION_AP_NO_RW;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((Attributes & EFI_MEMORY_XP) != 0) {
|
||||||
|
EntryValue |= TT_DESCRIPTOR_SECTION_PXN_MASK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ((Attributes & EFI_MEMORY_RP) == 0) {
|
if ((Attributes & EFI_MEMORY_RP) == 0) {
|
||||||
EntryValue |= TT_DESCRIPTOR_SECTION_AF;
|
EntryValue |= TT_DESCRIPTOR_SECTION_AF;
|
||||||
@ -549,7 +565,7 @@ ArmSetMemoryAttributes (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((AttributeMask & EFI_MEMORY_XP) != 0) {
|
if ((AttributeMask & EFI_MEMORY_XP) != 0) {
|
||||||
TtEntryMask |= TT_DESCRIPTOR_SECTION_XN_MASK;
|
TtEntryMask |= TT_DESCRIPTOR_SECTION_XN_MASK | TT_DESCRIPTOR_SECTION_PXN_MASK;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ASSERT (AttributeMask == 0);
|
ASSERT (AttributeMask == 0);
|
||||||
@ -559,6 +575,7 @@ ArmSetMemoryAttributes (
|
|||||||
|
|
||||||
TtEntryMask = TT_DESCRIPTOR_SECTION_TYPE_MASK |
|
TtEntryMask = TT_DESCRIPTOR_SECTION_TYPE_MASK |
|
||||||
TT_DESCRIPTOR_SECTION_XN_MASK |
|
TT_DESCRIPTOR_SECTION_XN_MASK |
|
||||||
|
TT_DESCRIPTOR_SECTION_PXN_MASK |
|
||||||
TT_DESCRIPTOR_SECTION_AP_MASK |
|
TT_DESCRIPTOR_SECTION_AP_MASK |
|
||||||
TT_DESCRIPTOR_SECTION_AF;
|
TT_DESCRIPTOR_SECTION_AF;
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,10 @@ SectionToGcdAttributes (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// now process eXectue Never attribute
|
// now process eXectue Never attribute
|
||||||
if ((SectionAttributes & TT_DESCRIPTOR_SECTION_XN_MASK) != 0) {
|
if ((((SectionAttributes & TT_DESCRIPTOR_SECTION_XN_MASK) != 0)
|
||||||
|
&& ((*GcdAttributes & EFI_MEMORY_USER) != 0))
|
||||||
|
|| (((SectionAttributes & TT_DESCRIPTOR_SECTION_PXN_MASK) != 0)
|
||||||
|
&& ((*GcdAttributes & EFI_MEMORY_USER) == 0))) {
|
||||||
*GcdAttributes |= EFI_MEMORY_XP;
|
*GcdAttributes |= EFI_MEMORY_XP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -159,19 +162,23 @@ PageToGcdAttributes (
|
|||||||
// determine protection attributes
|
// determine protection attributes
|
||||||
switch (PageAttributes & TT_DESCRIPTOR_PAGE_AP_MASK) {
|
switch (PageAttributes & TT_DESCRIPTOR_PAGE_AP_MASK) {
|
||||||
case TT_DESCRIPTOR_PAGE_AP_NO_RW:
|
case TT_DESCRIPTOR_PAGE_AP_NO_RW:
|
||||||
|
break;
|
||||||
case TT_DESCRIPTOR_PAGE_AP_RW_RW:
|
case TT_DESCRIPTOR_PAGE_AP_RW_RW:
|
||||||
// normal read/write access, do not add additional attributes
|
*GcdAttributes |= EFI_MEMORY_USER;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// read only cases map to write-protect
|
// read only cases map to write-protect
|
||||||
case TT_DESCRIPTOR_PAGE_AP_NO_RO:
|
case TT_DESCRIPTOR_PAGE_AP_NO_RO:
|
||||||
case TT_DESCRIPTOR_PAGE_AP_RO_RO:
|
|
||||||
*GcdAttributes |= EFI_MEMORY_RO;
|
*GcdAttributes |= EFI_MEMORY_RO;
|
||||||
break;
|
break;
|
||||||
|
case TT_DESCRIPTOR_PAGE_AP_RO_RO:
|
||||||
|
*GcdAttributes |= EFI_MEMORY_RO | EFI_MEMORY_USER;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// now process eXectue Never attribute
|
// now process eXectue Never attribute
|
||||||
if ((PageAttributes & TT_DESCRIPTOR_PAGE_XN_MASK) != 0) {
|
if (((PageAttributes & TT_DESCRIPTOR_PAGE_XN_MASK) != 0)
|
||||||
|
&& ((*GcdAttributes & EFI_MEMORY_USER) != 0)) {
|
||||||
*GcdAttributes |= EFI_MEMORY_XP;
|
*GcdAttributes |= EFI_MEMORY_XP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,6 +479,11 @@ EfiAttributeToArmAttribute (
|
|||||||
|
|
||||||
// Determine protection attributes
|
// Determine protection attributes
|
||||||
if ((EfiAttributes & EFI_MEMORY_USER) != 0) {
|
if ((EfiAttributes & EFI_MEMORY_USER) != 0) {
|
||||||
|
// Determine eXecute Never attribute
|
||||||
|
if ((EfiAttributes & EFI_MEMORY_XP) != 0) {
|
||||||
|
ArmAttributes |= TT_DESCRIPTOR_SECTION_XN_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// TODO: Add PXN for Translation table descriptors.
|
// TODO: Add PXN for Translation table descriptors.
|
||||||
//
|
//
|
||||||
@ -481,6 +493,11 @@ EfiAttributeToArmAttribute (
|
|||||||
ArmAttributes |= TT_DESCRIPTOR_SECTION_AP_RW_RW;
|
ArmAttributes |= TT_DESCRIPTOR_SECTION_AP_RW_RW;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// Determine eXecute Never attribute
|
||||||
|
if ((EfiAttributes & EFI_MEMORY_XP) != 0) {
|
||||||
|
ArmAttributes |= TT_DESCRIPTOR_SECTION_PXN_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
if ((EfiAttributes & EFI_MEMORY_RO) != 0) {
|
if ((EfiAttributes & EFI_MEMORY_RO) != 0) {
|
||||||
ArmAttributes |= TT_DESCRIPTOR_SECTION_AP_NO_RO;
|
ArmAttributes |= TT_DESCRIPTOR_SECTION_AP_NO_RO;
|
||||||
} else {
|
} else {
|
||||||
@ -488,11 +505,6 @@ EfiAttributeToArmAttribute (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Determine eXecute Never attribute
|
|
||||||
if ((EfiAttributes & EFI_MEMORY_XP) != 0) {
|
|
||||||
ArmAttributes |= TT_DESCRIPTOR_SECTION_XN_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((EfiAttributes & EFI_MEMORY_RP) == 0) {
|
if ((EfiAttributes & EFI_MEMORY_RP) == 0) {
|
||||||
ArmAttributes |= TT_DESCRIPTOR_SECTION_AF;
|
ArmAttributes |= TT_DESCRIPTOR_SECTION_AF;
|
||||||
}
|
}
|
||||||
|
@ -97,6 +97,7 @@
|
|||||||
#define TT_DESCRIPTOR_PAGE_AF (1UL << 4)
|
#define TT_DESCRIPTOR_PAGE_AF (1UL << 4)
|
||||||
|
|
||||||
#define TT_DESCRIPTOR_SECTION_XN_MASK (0x1UL << 4)
|
#define TT_DESCRIPTOR_SECTION_XN_MASK (0x1UL << 4)
|
||||||
|
#define TT_DESCRIPTOR_SECTION_PXN_MASK (0x1UL << 0)
|
||||||
#define TT_DESCRIPTOR_PAGE_XN_MASK (0x1UL << 0)
|
#define TT_DESCRIPTOR_PAGE_XN_MASK (0x1UL << 0)
|
||||||
|
|
||||||
#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK ((3UL << 12) | (1UL << 3) | (1UL << 2))
|
#define TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK ((3UL << 12) | (1UL << 3) | (1UL << 2))
|
||||||
@ -136,7 +137,7 @@
|
|||||||
|
|
||||||
#define TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK (TT_DESCRIPTOR_SECTION_NS_MASK | TT_DESCRIPTOR_SECTION_NG_MASK | \
|
#define TT_DESCRIPTOR_SECTION_ATTRIBUTE_MASK (TT_DESCRIPTOR_SECTION_NS_MASK | TT_DESCRIPTOR_SECTION_NG_MASK | \
|
||||||
TT_DESCRIPTOR_SECTION_S_MASK | TT_DESCRIPTOR_SECTION_AP_MASK | \
|
TT_DESCRIPTOR_SECTION_S_MASK | TT_DESCRIPTOR_SECTION_AP_MASK | \
|
||||||
TT_DESCRIPTOR_SECTION_AF | \
|
TT_DESCRIPTOR_SECTION_AF | TT_DESCRIPTOR_SECTION_PXN_MASK | \
|
||||||
TT_DESCRIPTOR_SECTION_XN_MASK | TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK)
|
TT_DESCRIPTOR_SECTION_XN_MASK | TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK)
|
||||||
|
|
||||||
#define TT_DESCRIPTOR_PAGE_ATTRIBUTE_MASK (TT_DESCRIPTOR_PAGE_NG_MASK | TT_DESCRIPTOR_PAGE_S_MASK | \
|
#define TT_DESCRIPTOR_PAGE_ATTRIBUTE_MASK (TT_DESCRIPTOR_PAGE_NG_MASK | TT_DESCRIPTOR_PAGE_S_MASK | \
|
||||||
@ -161,7 +162,7 @@
|
|||||||
TT_DESCRIPTOR_SECTION_NG_GLOBAL | \
|
TT_DESCRIPTOR_SECTION_NG_GLOBAL | \
|
||||||
TT_DESCRIPTOR_SECTION_S_SHARED | \
|
TT_DESCRIPTOR_SECTION_S_SHARED | \
|
||||||
TT_DESCRIPTOR_SECTION_DOMAIN(0) | \
|
TT_DESCRIPTOR_SECTION_DOMAIN(0) | \
|
||||||
TT_DESCRIPTOR_SECTION_AP_RW_RW | \
|
TT_DESCRIPTOR_SECTION_AP_NO_RW | \
|
||||||
TT_DESCRIPTOR_SECTION_AF)
|
TT_DESCRIPTOR_SECTION_AF)
|
||||||
|
|
||||||
#define TT_DESCRIPTOR_SECTION_WRITE_BACK (TT_DESCRIPTOR_SECTION_DEFAULT | \
|
#define TT_DESCRIPTOR_SECTION_WRITE_BACK (TT_DESCRIPTOR_SECTION_DEFAULT | \
|
||||||
@ -176,30 +177,26 @@
|
|||||||
#define TT_DESCRIPTOR_SECTION_UNCACHED (TT_DESCRIPTOR_SECTION_DEFAULT | \
|
#define TT_DESCRIPTOR_SECTION_UNCACHED (TT_DESCRIPTOR_SECTION_DEFAULT | \
|
||||||
TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE)
|
TT_DESCRIPTOR_SECTION_CACHE_POLICY_NON_CACHEABLE)
|
||||||
|
|
||||||
#define TT_DESCRIPTOR_PAGE_WRITE_BACK (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \
|
#define TT_DESCRIPTOR_PAGE_DEFAULT (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \
|
||||||
TT_DESCRIPTOR_PAGE_NG_GLOBAL | \
|
TT_DESCRIPTOR_PAGE_NG_GLOBAL | \
|
||||||
|
TT_DESCRIPTOR_PAGE_AP_NO_RW | \
|
||||||
|
TT_DESCRIPTOR_PAGE_AF)
|
||||||
|
|
||||||
|
#define TT_DESCRIPTOR_PAGE_WRITE_BACK (TT_DESCRIPTOR_PAGE_DEFAULT | \
|
||||||
TT_DESCRIPTOR_PAGE_S_SHARED | \
|
TT_DESCRIPTOR_PAGE_S_SHARED | \
|
||||||
TT_DESCRIPTOR_PAGE_AP_RW_RW | \
|
|
||||||
TT_DESCRIPTOR_PAGE_AF | \
|
|
||||||
TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC)
|
TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_BACK_ALLOC)
|
||||||
#define TT_DESCRIPTOR_PAGE_WRITE_THROUGH (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \
|
|
||||||
TT_DESCRIPTOR_PAGE_NG_GLOBAL | \
|
#define TT_DESCRIPTOR_PAGE_WRITE_THROUGH (TT_DESCRIPTOR_PAGE_DEFAULT | \
|
||||||
TT_DESCRIPTOR_PAGE_S_SHARED | \
|
TT_DESCRIPTOR_PAGE_S_SHARED | \
|
||||||
TT_DESCRIPTOR_PAGE_AP_RW_RW | \
|
|
||||||
TT_DESCRIPTOR_PAGE_AF | \
|
|
||||||
TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC)
|
TT_DESCRIPTOR_PAGE_CACHE_POLICY_WRITE_THROUGH_NO_ALLOC)
|
||||||
#define TT_DESCRIPTOR_PAGE_DEVICE (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \
|
|
||||||
TT_DESCRIPTOR_PAGE_NG_GLOBAL | \
|
#define TT_DESCRIPTOR_PAGE_DEVICE (TT_DESCRIPTOR_PAGE_DEFAULT | \
|
||||||
TT_DESCRIPTOR_PAGE_S_NOT_SHARED | \
|
TT_DESCRIPTOR_PAGE_S_NOT_SHARED | \
|
||||||
TT_DESCRIPTOR_PAGE_AP_RW_RW | \
|
|
||||||
TT_DESCRIPTOR_PAGE_AF | \
|
|
||||||
TT_DESCRIPTOR_PAGE_XN_MASK | \
|
TT_DESCRIPTOR_PAGE_XN_MASK | \
|
||||||
TT_DESCRIPTOR_PAGE_CACHE_POLICY_SHAREABLE_DEVICE)
|
TT_DESCRIPTOR_PAGE_CACHE_POLICY_SHAREABLE_DEVICE)
|
||||||
#define TT_DESCRIPTOR_PAGE_UNCACHED (TT_DESCRIPTOR_PAGE_TYPE_PAGE | \
|
|
||||||
TT_DESCRIPTOR_PAGE_NG_GLOBAL | \
|
#define TT_DESCRIPTOR_PAGE_UNCACHED (TT_DESCRIPTOR_PAGE_DEFAULT | \
|
||||||
TT_DESCRIPTOR_PAGE_S_NOT_SHARED | \
|
TT_DESCRIPTOR_PAGE_S_NOT_SHARED | \
|
||||||
TT_DESCRIPTOR_PAGE_AP_RW_RW | \
|
|
||||||
TT_DESCRIPTOR_PAGE_AF | \
|
|
||||||
TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_CACHEABLE)
|
TT_DESCRIPTOR_PAGE_CACHE_POLICY_NON_CACHEABLE)
|
||||||
|
|
||||||
// First Level Descriptors
|
// First Level Descriptors
|
||||||
|
Loading…
x
Reference in New Issue
Block a user