From dc3c0827efdc184ecc4c5baecec834a0acfd3068 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Mon, 11 Nov 2019 01:16:40 +0100 Subject: 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 --- cp_regs.h | 16 ++++++++-------- kernel.c | 4 ++-- translation_table_descriptors.h | 35 +++++++++++++++++++++++++++++------ 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 -- cgit v1.2.3