aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWojtek Kosior <kwojtus@protonmail.com>2019-11-11 01:16:40 +0100
committerWojtek Kosior <kwojtus@protonmail.com>2019-11-11 01:16:40 +0100
commitdc3c0827efdc184ecc4c5baecec834a0acfd3068 (patch)
tree4d2d4cbdbf025061c5cd200792508e6d123ef1fc
parentc9a43be4dbabad0d6f51712e60f2ff0834eed36a (diff)
downloadrpi-MMU-example-dc3c0827efdc184ecc4c5baecec834a0acfd3068.tar.gz
rpi-MMU-example-dc3c0827efdc184ecc4c5baecec834a0acfd3068.zip
represent page table descriptor as struct, fix #define conflicts between translation_table_descriptors.h and cp_regs.h, fix name of one #define'd field of section descriptors
-rw-r--r--cp_regs.h16
-rw-r--r--kernel.c4
-rw-r--r--translation_table_descriptors.h35
3 files changed, 39 insertions, 16 deletions
diff --git a/cp_regs.h b/cp_regs.h
index 98a8bb8..2bc6c9f 100644
--- a/cp_regs.h
+++ b/cp_regs.h
@@ -98,14 +98,14 @@ typedef union
// i'm not sure 'interprocess region bits' is the right name,
// I'm just guessing (by analogy to RGN -> region bits)
-#define CACHEABLE_BIT C
-#define INTERPROCESS_REGION_BITS_1 IRGN_1
-#define SHAREABLE_BIT S
-#define IMPLEMENTATION_DEFINED_BIT IMP
-#define REGION_BITS_1_0 RGN
-#define INTERPROCESS_REGION_BITS_0 IRGN_0
-#define NON_OUTER_SHAREABLE_BIT NOS
-#define TRANSLATION_TABLE_BASE_ADDRESS Bits_31_14
+#define TTBR_CACHEABLE_BIT C
+#define TTBR_INTERPROCESS_REGION_BITS_1 IRGN_1
+#define TTBR_SHAREABLE_BIT S
+#define TTBR_IMPLEMENTATION_DEFINED_BIT IMP
+#define TTBR_REGION_BITS_1_0 RGN
+#define TTBR_INTERPROCESS_REGION_BITS_0 IRGN_0
+#define TTBR_NON_OUTER_SHAREABLE_BIT NOS
+#define TTBR_TRANSLATION_TABLE_BASE_ADDRESS Bits_31_14
} fields;
} TTBR_t;
diff --git a/kernel.c b/kernel.c
index 8d2fdef..765b770 100644
--- a/kernel.c
+++ b/kernel.c
@@ -96,7 +96,7 @@ void kernel_main(uint32_t r0, uint32_t r1, uint32_t atags)
.SECTION_OR_SUPERSECTION_BIT = DESCRIBES_SECTION,
.ACCESS_PERMISSIONS_2 = AP_2_0_MODEL_RW_PL1 >> 2,
.ACCESS_PERMISSIONS_1_0 = AP_2_0_MODEL_RW_PL1 & 0b011,
- .DESCRIPTOR_TYPE_2 =
+ .DESCRIPTOR_TYPE_1 =
SHORT_DESCRIPTOR_SECTION_OR_SUPERSECTION >> 1,
// rest of fields are 0s
};
@@ -162,7 +162,7 @@ void kernel_main(uint32_t r0, uint32_t r1, uint32_t atags)
// Now do stuff with TTBR0
TTBR_t TTBR0;
TTBR0.raw = 0;
- TTBR0.fields.TRANSLATION_TABLE_BASE_ADDRESS =
+ TTBR0.fields.TTBR_TRANSLATION_TABLE_BASE_ADDRESS =
translation_table_base >> 14;
// rest of TTBR0 remains 0s
diff --git a/translation_table_descriptors.h b/translation_table_descriptors.h
index 8f92473..975ab61 100644
--- a/translation_table_descriptors.h
+++ b/translation_table_descriptors.h
@@ -11,6 +11,27 @@
// meanings depending on settings in coprocessor registers... (yeah, ARM
// looks a bit messy... all for backward compatibility, i guess)
+
+typedef struct
+{
+ uint32_t Bits_1_0 : 1; // bits 1:0
+ uint32_t PXN : 1; // bit 2
+ uint32_t NS : 1; // bit 3
+ uint32_t SBZ : 1; // bit 4
+ uint32_t Domain_3_0 : 4; // bits 8:5
+ uint32_t Bit_9 : 1; // bit 9
+ uint32_t Bits_31_10 : 22; // bits 31:10
+#define DESCRIPTOR_TYPE_1_0 Bits_1_0
+#define PRIVILEGED_EXECUTE_NEVER_BIT PXN
+#define NON_SECURE_BIT NS
+ // me thinks SBZ means "should be zero",
+ // but me sees no point #defining it
+#define DOMAIN_3_0 Domain_3_0
+#define IMPLEMENTATION_DEFINED_BIT Bit_9
+#define PAGE_TABLE_BASE_ADDRESS_31_10 Bits_31_10
+} short_page_table_descriptor_t;
+
+
typedef struct
{
uint32_t PXN : 1; // bit 0
@@ -28,20 +49,21 @@ typedef struct
uint32_t Bit_18 : 1; // bit 18
uint32_t NS : 1; // bit 19
uint32_t PA_31_20 : 12; // bits 31:20
-#define PRIVILEGED_EXECUTE_NEVER_BIT PXN
-#define DESCRIPTOR_TYPE_2 Bit_1
+ // some of these are already defined the same for page table
+ //#define PRIVILEGED_EXECUTE_NEVER_BIT PXN
+#define DESCRIPTOR_TYPE_1 Bit_1
#define BUFFERABLE_BIT B
#define CACHEABLE_BIT C
#define EXECUTE_NEVER_BIT XN
-#define DOMAIN_3_0 Domain_3_0
-#define IMPLEMENTATION_DEFINED_BIT Bit_9
+ //#define DOMAIN_3_0 Domain_3_0
+ //#define IMPLEMENTATION_DEFINED_BIT Bit_9
#define ACCESS_PERMISSIONS_1_0 AP_1_0
#define TYPE_EXTENSION_2_0 TEX_2_0
#define ACCESS_PERMISSIONS_2 AP_2
#define SHAREABLE_BIT S
#define NON_GLOBAL_BIT nG
#define SECTION_OR_SUPERSECTION_BIT Bit_18
-#define NON_SECURE_BIT NS
+ //#define NON_SECURE_BIT NS
#define SECTION_BASE_ADDRESS_31_20 PA_31_20
} short_section_descriptor_t;
@@ -79,6 +101,7 @@ typedef struct
#define DESCRIBES_SECTION 0b0
#define DESCRIBES_SUPERSECTION 0b1
+
typedef struct
{
uint32_t PXN : 1; // bit 0
@@ -99,7 +122,7 @@ typedef struct
uint32_t PA_31_24 : 8; // bits 31:24
// most of these are already defined the same for section
//#define PRIVILEGED_EXECUTE_NEVER_BIT PXN
- //#define DESCRIPTOR_TYPE_2 Bit_1
+ //#define DESCRIPTOR_TYPE_1 Bit_1
//#define BUFFERABLE_BIT B
//#define CACHEABLE_BIT C
//#define EXECUTE_NEVER_BIT XN