diff options
author | Regina König | 2020-08-11 01:59:15 +0200 |
---|---|---|
committer | Regina König | 2020-08-11 01:59:15 +0200 |
commit | c7cfeb1b02175c6809cfffcb8462869312974831 (patch) | |
tree | 675a70ca48890a020f88502a9fc10112555b6970 | |
parent | working on doTest1 (diff) | |
download | memtest86-c7cfeb1b02175c6809cfffcb8462869312974831.tar.gz memtest86-c7cfeb1b02175c6809cfffcb8462869312974831.tar.xz memtest86-c7cfeb1b02175c6809cfffcb8462869312974831.zip |
reading and processing efi-memoryMap
-rw-r--r-- | efi_memtest/memtest86+/efi/memory_tables.c | 175 | ||||
-rw-r--r-- | efi_memtest/memtest86+/main.c | 2 | ||||
-rw-r--r-- | efi_memtest/memtest86+/memory_tables.h | 2 | ||||
-rw-r--r-- | efi_memtest/memtest86+/memsize.c | 6 | ||||
-rw-r--r-- | efi_memtest/memtest86+/test.h | 2 | ||||
-rw-r--r-- | memtestEDK/Memtest/Test1/doTest1.c | 25 | ||||
-rw-r--r-- | memtestEDK/Memtest/Test1/memoryMap.h | 22 | ||||
-rw-r--r-- | memtestEDK/Memtest/Test1/test.c | 2 |
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 |