summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorPratyush Anand <panand@redhat.com>2015-12-06 01:30:46 +0900
committerAtsushi Kumagai <ats-kumagai@wm.jp.nec.com>2015-12-09 08:46:25 +0900
commit28a4729799c5f5d4ec1a9fbd16eca8f68fb2d8bb (patch)
tree1c3790881549257e8490213d6da81a4e56202a04 /arch
parent1c01d4bfb383c10a97e256f4a6cbf1d92ed133f6 (diff)
[PATCH 1/4] ARM64: Refactor code to support multiple page level.
This patch refactor existing code, so that multiple page level can be supported. No functional change. Platform dependent values like page table level, page shift and VA bits are still hard coded as 2, 16 and 42, to support 2 level 64K pages. Signed-off-by: Pratyush Anand <panand@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm64.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/arch/arm64.c b/arch/arm64.c
index 06daf64..643c21f 100644
--- a/arch/arm64.c
+++ b/arch/arm64.c
@@ -23,7 +23,6 @@
#include "../makedumpfile.h"
#include "../print_info.h"
-#if CONFIG_ARM64_PGTABLE_LEVELS == 2
typedef struct {
unsigned long pgd;
} pgd_t;
@@ -45,8 +44,6 @@ typedef struct {
#define PUD_SHIFT PGDIR_SHIFT
#define PUD_SIZE (1UL << PUD_SHIFT)
-#endif
-
typedef struct {
unsigned long pte;
} pte_t;
@@ -96,6 +93,41 @@ typedef struct {
#define MODULES_END PAGE_OFFSET
#define MODULES_VADDR (MODULES_END - 0x4000000)
+static int pgtable_level;
+static int va_bits;
+static int page_shift;
+
+int
+get_pgtable_level_arm64(void)
+{
+ return pgtable_level;
+}
+
+int
+get_va_bits_arm64(void)
+{
+ return va_bits;
+}
+
+int
+get_page_shift_arm64(void)
+{
+ return page_shift;
+}
+
+static int calculate_plat_config(void)
+{
+ /*
+ * TODO: Keep it fixed for page level 2, size 64K and VA bits as
+ * 42, as of now. Will calculate them from symbol address values
+ * latter.
+ */
+ pgtable_level = 2;
+ va_bits = 42;
+ page_shift = 16;
+
+ return TRUE;
+}
static int
is_vtop_from_page_table_arm64(unsigned long vaddr)
@@ -114,6 +146,12 @@ get_phys_base_arm64(void)
unsigned long phys_base = ULONG_MAX;
unsigned long long phys_start;
int i;
+
+ if (!calculate_plat_config()) {
+ ERRMSG("Can't determine platform config values\n");
+ return FALSE;
+ }
+
/*
* We resolve phys_base from PT_LOAD segments. LMA contains physical
* address of the segment, and we use the lowest start as