summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRegina König2020-08-11 01:59:15 +0200
committerRegina König2020-08-11 01:59:15 +0200
commitc7cfeb1b02175c6809cfffcb8462869312974831 (patch)
tree675a70ca48890a020f88502a9fc10112555b6970
parentworking on doTest1 (diff)
downloadmemtest86-c7cfeb1b02175c6809cfffcb8462869312974831.tar.gz
memtest86-c7cfeb1b02175c6809cfffcb8462869312974831.tar.xz
memtest86-c7cfeb1b02175c6809cfffcb8462869312974831.zip
reading and processing efi-memoryMap
-rw-r--r--efi_memtest/memtest86+/efi/memory_tables.c175
-rw-r--r--efi_memtest/memtest86+/main.c2
-rw-r--r--efi_memtest/memtest86+/memory_tables.h2
-rw-r--r--efi_memtest/memtest86+/memsize.c6
-rw-r--r--efi_memtest/memtest86+/test.h2
-rw-r--r--memtestEDK/Memtest/Test1/doTest1.c25
-rw-r--r--memtestEDK/Memtest/Test1/memoryMap.h22
-rw-r--r--memtestEDK/Memtest/Test1/test.c2
8 files changed, 171 insertions, 65 deletions
diff --git a/efi_memtest/memtest86+/efi/memory_tables.c b/efi_memtest/memtest86+/efi/memory_tables.c
index 14e1037..d72665d 100644
--- a/efi_memtest/memtest86+/efi/memory_tables.c
+++ b/efi_memtest/memtest86+/efi/memory_tables.c
@@ -2,70 +2,137 @@
#include "Uefi.h"
#include "Library/UefiLib.h"
+#include "test.h"
+
+#define DATA_SIZE 1000
+
+extern EFI_SYSTEM_TABLE *gST;
+
+const CHAR16 *memory_types[] =
+{
+ L"EfiReservedMemoryType",
+ L"EfiLoaderCode",
+ L"EfiLoaderData",
+ L"EfiBootServicesCode",
+ L"EfiBootServicesData",
+ L"EfiRuntimeServicesCode",
+ L"EfiRuntimeServicesData",
+ L"EfiConventionalMemory",
+ L"EfiUnusableMemory",
+ L"EfiACPIReclaimMemory",
+ L"EfiACPIMemoryNVS",
+ L"EfiMemoryMappedIO",
+ L"EfiMemoryMappedIOPortSpace",
+ L"EfiPalCode",
+};
+
+
int query_memory_table(void) {
int flag = 0;
- // EFI_STATUS efiStatus;
- /*struct lb_header *head;
- struct lb_record *rec;
- struct lb_memory *mem;
- struct lb_forward *forward;
- int i, entries;*/
-
- /*head = find_lb_table();
- if (!head) {
- return 0;
- }*/
-
- /* coreboot also can forward the table to the high tables area. */
- /*rec = (struct lb_record *)(((char *)head) + sizeof(*head));
- if (rec->tag == LB_TAG_FORWARD) {
- forward = (struct lb_forward *)rec;
- head = (struct lb_header *)(unsigned long)(forward->forward);
- if (!head) { return 0; }
- }*/
-
- /*mem = 0;
- for_each_lbrec(head, rec) {
- if (rec->tag == LB_TAG_MEMORY) {
- mem = (struct lb_memory *)rec;
- break;
- }
- }*/
- /*if (!mem) {
- return 1;
- }*/
- /*entries = (mem->size - sizeof(*mem))/sizeof(mem->map[0]);
- if (entries == 0)
- return 1;
- mem_info.e820_nr = 0;*/
- /*for(i = 0; i < entries; i++) {
- unsigned long long start;
- unsigned long long size;
- unsigned long type;
- if (i >= E820MAX) {
- break;
- }
- start = mem->map[i].start;
- size = mem->map[i].size;
- type = (mem->map[i].type == LB_MEM_RAM)?E820_RAM: E820_RESERVED;
- mem_info.e820[mem_info.e820_nr].addr = start;
- mem_info.e820[mem_info.e820_nr].size = size;
- mem_info.e820[mem_info.e820_nr].type = type;
- mem_info.e820_nr++;
- }
- return 1;*/
+ UINTN MemoryMapSize = 0;
+ EFI_MEMORY_DESCRIPTOR *memoryMap = NULL;
+ UINTN LocalMapKey;
+ UINTN DescriptorSize;
+ UINT32 DescriptorVersion;
+ EFI_STATUS Status;
+
+ EFI_BOOT_SERVICES *bs = gST->BootServices;
+
+ /* Allocate the buffer for the MemoryMap. As the memory map changes every time we query it, the
+ size also may change. So we allocate a new buffer until it has sufficient space for the MemoryMap.
+ */
+ Status = bs->GetMemoryMap(&MemoryMapSize, memoryMap, &LocalMapKey, &DescriptorSize, &DescriptorVersion);
+ do {
+ bs->FreePool(memoryMap);
+ Status = bs->AllocatePool(EfiLoaderData, (UINTN) (MemoryMapSize + 1) , (void **)&memoryMap);
+ Status = bs->GetMemoryMap(&MemoryMapSize, memoryMap, &LocalMapKey, &DescriptorSize, &DescriptorVersion);
+ } while (Status == EFI_BUFFER_TOO_SMALL);
+
+ if (Status != EFI_SUCCESS) {
+ Print(L"Status = %r\n", Status);
+ return Status;
+ }
+
+/* Print(L"memoryMap location: %p\n", memoryMap);
+ //Print(L"Size of first element (and all other elements): %d\n", sizeof(secondElement));
+ Print(L"DescriptorSize: %d\n", DescriptorSize);
+ Print(L"DescriptorVersion: %d\n\n\n", DescriptorVersion);*/
+
+ UINT8 *startOfMemoryMap = (UINT8 *)memoryMap;
+ UINT8 *endOfMemoryMap = startOfMemoryMap + MemoryMapSize;
+ UINT8 *offset = startOfMemoryMap;
+ UINT32 counter = 0;
+ UINT64 totalPages = 0;
+ EFI_MEMORY_DESCRIPTOR *desc = NULL;
+
+ mem_info.e820_nr = 0;
- /*if(TRUE) {
+ while(offset < endOfMemoryMap) {
+ desc = (EFI_MEMORY_DESCRIPTOR *)offset;
+
+ if (desc->Type == 7) {
+ /*Print(L"Map %d:\n", counter);
+ Print(L" Type: %X, %s\n", desc->Type, memory_types[desc->Type]);
+ Print(L" PhysicalStart: %X\n", desc->PhysicalStart);
+ Print(L" VirtualStart: %X\n", desc->VirtualStart);
+ Print(L" NumberOfPages: %X (4k)\n", desc->NumberOfPages);
+ Print(L" Attribute: %X\n", desc->Attribute);*/
+
+ mem_info.e820[mem_info.e820_nr].addr = desc->PhysicalStart;
+ mem_info.e820[mem_info.e820_nr].size = desc->NumberOfPages; // 4k - pages
+ mem_info.e820[mem_info.e820_nr].type = desc->Type;
+ mem_info.e820_nr++;
+
+ if (mem_info.e820_nr >= E820MAX) {
+ break;
+ } // TODO why?
+ }
+
+ totalPages += desc->NumberOfPages;
+
+ offset += DescriptorSize;
+ counter++;
+ }
+
+ Print(L"Number of free memory segments: %d\n", mem_info.e820_nr);
+
+ bs->FreePool(memoryMap);
+
+ MemoryMapSize = totalPages * 4096;
+ Print(L"Memory detected: %d MB\n\n", MemoryMapSize / 1024 / 1024);
+
+
+ if(Status == EFI_SUCCESS) {
flag = 3;
- }*/
+ }
return flag;
}
-void get_mem_size(int flag) {
+//static void sort_pmap(void);
+
+void get_mem_size(int flag, short e820_nr, struct e820entry *e820) {
if (flag == 3) {
- // TODO
+ int i, n;
+
+ /* Build the memory map for testing */
+ n = 0;
+ for (i=0; i < e820_nr; i++) {
+ unsigned long long end;
+
+ if (e820[i].type != EFI_CONVENTIONAL_MEMORY) {
+ continue;
+ }
+ end = e820[i].addr;
+ end += e820[i].size;
+ vv->pmap[n].start = (e820[i].addr + 4095) >> 12; // TODO What's happeing there?
+ vv->pmap[n].end = end >> 12;
+ vv->test_pages += vv->pmap[n].end - vv->pmap[n].start;
+ n++;
+ }
+ vv->msegs = n;
+ Print(L"vv->msges: %d\n", n);
}
} \ No newline at end of file
diff --git a/efi_memtest/memtest86+/main.c b/efi_memtest/memtest86+/main.c
index 9cdf3df..ebcf253 100644
--- a/efi_memtest/memtest86+/main.c
+++ b/efi_memtest/memtest86+/main.c
@@ -395,7 +395,7 @@ void test_start(void)
/* Find memory size */
mem_size(); /* must be called before initialise_cpus(); */
/* Fill in the CPUID table */
- /* get_cpuid();*/
+ get_cpuid();
/* Startup the other CPUs */
/* start_seq = 1;*/
//initialise_cpus();
diff --git a/efi_memtest/memtest86+/memory_tables.h b/efi_memtest/memtest86+/memory_tables.h
index 82999fb..7a89454 100644
--- a/efi_memtest/memtest86+/memory_tables.h
+++ b/efi_memtest/memtest86+/memory_tables.h
@@ -1,3 +1,3 @@
int query_memory_table(void);
-void get_mem_size(int flag); \ No newline at end of file
+void get_mem_size(int flag, short e820_nr, struct e820entry *e820); \ No newline at end of file
diff --git a/efi_memtest/memtest86+/memsize.c b/efi_memtest/memtest86+/memsize.c
index c5ea660..1c2158f 100644
--- a/efi_memtest/memtest86+/memsize.c
+++ b/efi_memtest/memtest86+/memsize.c
@@ -34,7 +34,9 @@ void mem_size(void)
/* Determine the memory map */
flag = query_memory_table();
- char flg[] = { flag + '0', '\0'};
+ char flg[8] = "flag: ";
+ flg[6] = flag + '0';
+ flg[7] = '\0';
print_log(flg, sizeof(flg));
/* On the first time thru only */
@@ -51,7 +53,7 @@ void mem_size(void)
}
}
- get_mem_size(flag);
+ get_mem_size(flag, e820_nr, e820);
/* Guarantee that pmap entries are in ascending order */
sort_pmap();
diff --git a/efi_memtest/memtest86+/test.h b/efi_memtest/memtest86+/test.h
index 89d1dc4..2e00d80 100644
--- a/efi_memtest/memtest86+/test.h
+++ b/efi_memtest/memtest86+/test.h
@@ -23,6 +23,8 @@
#define E820_ACPI 3 /* usable as RAM once ACPI tables have been read */
#define E820_NVS 4
+#define EFI_CONVENTIONAL_MEMORY 7
+
struct e820entry {
unsigned long long addr; /* start of memory segment */
unsigned long long size; /* size of memory segment */
diff --git a/memtestEDK/Memtest/Test1/doTest1.c b/memtestEDK/Memtest/Test1/doTest1.c
index e6883ff..8b555db 100644
--- a/memtestEDK/Memtest/Test1/doTest1.c
+++ b/memtestEDK/Memtest/Test1/doTest1.c
@@ -7,6 +7,28 @@
#include "test.h"
+static inline void cache_off(void)
+{
+ asm(
+ "push %rax\n\t"
+ "movq %cr0,%eax\n\t"
+ "orl $0x40000000,%eax\n\t" /* Set CD */
+ "movq %eax,%cr0\n\t"
+ "wbinvd\n\t"
+ "pop %rax\n\t");
+}
+
+static inline void cache_on(void)
+{
+ asm(
+ "push %rax\n\t"
+ "movq %cr0,%eax\n\t"
+ "andl $0x9fffffff,%eax\n\t" /* Clear CD and NW */
+ "movq %eax,%cr0\n\t"
+ "pop %rax\n\t");
+}
+
+
EFI_STATUS
EFIAPI
UefiMain (
@@ -14,6 +36,9 @@ UefiMain (
IN EFI_SYSTEM_TABLE *SystemTable
)
{
+ cache_off();
+ addr_tst1(0);
+ cache_on();
return EFI_SUCCESS;
diff --git a/memtestEDK/Memtest/Test1/memoryMap.h b/memtestEDK/Memtest/Test1/memoryMap.h
index e887a4a..23ff7e7 100644
--- a/memtestEDK/Memtest/Test1/memoryMap.h
+++ b/memtestEDK/Memtest/Test1/memoryMap.h
@@ -1,6 +1,12 @@
+typedef unsigned long ulong;
-struct vars variables = {};
-struct vars * const vv = &variables;
+#define MAX_MEM_SEGMENTS 127
+
+struct mmap {
+ ulong pbase_addr;
+ ulong *start; // VA of segment start
+ ulong *end; // VA of the last dword within the segment.
+};
/* Define common variables across relocations of memtest86 */
struct vars {
@@ -15,9 +21,9 @@ struct vars {
int total_ticks;
int pptr;
int tptr;
- struct err_info erri;
+ // struct err_info erri;
// PA ranges from e820 table:
- struct pmap pmap[MAX_MEM_SEGMENTS];
+ //struct pmap pmap[MAX_MEM_SEGMENTS];
// VA mappings:
volatile struct mmap map[MAX_MEM_SEGMENTS];
ulong plim_lower; // phys page number
@@ -29,7 +35,7 @@ struct vars {
ulong snapl;
int printmode;
int numpatn;
- struct pair patn [BADRAM_MAXPATNS];
+ // struct pair patn [BADRAM_MAXPATNS];
ulong test_pages;
ulong selected_pages;
ulong reserved_pages;
@@ -38,4 +44,8 @@ struct vars {
int each_sec;
int beepmode;
int debugging; // Set in selftest only
-}; \ No newline at end of file
+};
+
+struct vars variables = {};
+struct vars * const vv = &variables;
+
diff --git a/memtestEDK/Memtest/Test1/test.c b/memtestEDK/Memtest/Test1/test.c
index c9bc36b..6b0403c 100644
--- a/memtestEDK/Memtest/Test1/test.c
+++ b/memtestEDK/Memtest/Test1/test.c
@@ -64,7 +64,7 @@ void foreach_segment
int done = 0;
do {
- do_tick(me);
+ // do_tick(me);
{ BAILR }
// ensure no overflow