diff options
Diffstat (limited to 'memtestEDK/Memtest/Cpuid/apic_test.c')
-rw-r--r-- | memtestEDK/Memtest/Cpuid/apic_test.c | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/memtestEDK/Memtest/Cpuid/apic_test.c b/memtestEDK/Memtest/Cpuid/apic_test.c new file mode 100644 index 0000000..3e6ff2a --- /dev/null +++ b/memtestEDK/Memtest/Cpuid/apic_test.c @@ -0,0 +1,161 @@ +#include <Library/UefiLib.h> + +/*#include "cpuid.h" +#include "smp.h"*/ + +#include "apic_test.h" + + +extern void smp_find_cpus(); + +// Defined in test.h +typedef unsigned long ulong; +#define E820MAX 127 +#define MAX_MEM_SEGMENTS E820MAX +#define BADRAM_MAXPATNS 10 +#define LINE_SCROLL 14 + +struct pair { + ulong adr; + ulong mask; +}; + +struct mmap { + ulong pbase_addr; + ulong *start; // VA of segment start + ulong *end; // VA of the last dword within the segment. +}; + +struct pmap { + ulong start; /* phys page number of RAM segment start, + in 4K pages. */ + ulong end; // phys page number (past the end? or inclusive?) +}; + +struct xadr { + ulong page; + ulong offset; +}; + +struct err_info { + struct xadr low_addr; + struct xadr high_addr; + unsigned long ebits; + long tbits; + short min_bits; + short max_bits; + unsigned long maxl; + unsigned long eadr; + unsigned long exor; + unsigned long cor_err; + short hdr_flag; +}; + +struct vars { + int pass; + int msg_line; + int ecount; + int ecc_ecount; + int msegs; // number of entries in pmap[] + int testsel; + int scroll_start; + int pass_ticks; + int total_ticks; + int pptr; + int tptr; + struct err_info erri; + // PA ranges from e820 table: + struct pmap pmap[MAX_MEM_SEGMENTS]; + // VA mappings: + volatile struct mmap map[MAX_MEM_SEGMENTS]; + ulong plim_lower; // phys page number + ulong plim_upper; // phys page number + ulong clks_msec; + ulong starth; + ulong startl; + ulong snaph; + ulong snapl; + int printmode; + int numpatn; + struct pair patn [BADRAM_MAXPATNS]; + ulong test_pages; + ulong selected_pages; + ulong reserved_pages; + int check_temp; + int fail_safe; + int each_sec; + int beepmode; + int debugging; // Set in selftest only +}; + +// Defined in main.c +struct vars variables = {}; +struct vars * const vv = &variables; + +#define PRINTMODE_ADDRESSES 1 + + + + + +void set_values() { +vv->printmode=PRINTMODE_ADDRESSES; +vv->numpatn=0; +vv->plim_lower = 0; +vv->plim_upper = vv->pmap[vv->msegs-1].end; +vv->pass = 0; +vv->msg_line = 0; +vv->ecount = 0; +vv->ecc_ecount = 0; +vv->msg_line = LINE_SCROLL-1; +vv->scroll_start = vv->msg_line * 160; +vv->debugging = 0; +vv->erri.low_addr.page = 0x7fffffff; +vv->erri.low_addr.offset = 0xfff; +vv->erri.high_addr.page = 0; +vv->erri.high_addr.offset = 0; +vv->erri.min_bits = 32; +vv->erri.max_bits = 0; +vv->erri.min_bits = 32; +vv->erri.max_bits = 0; +vv->erri.maxl = 0; +vv->erri.cor_err = 0; +vv->erri.ebits = 0; +vv->erri.hdr_flag = 0; +vv->erri.tbits = 0; +} + +void smp_find_cpus_test() { + +// TODO search rsdp and other stuff in efi system table + set_values(); + smp_find_cpus(); +} + +void read_mp_config_table_test() { + +} + +void APIC_WRITE_test() { + +} + +void APIC_READ_test() { + +} + +void SEND_IPI_test() { + +} + +void kick_cpu_test() { + +} + +void my_apic_id_test() { + +} + +void smp_my_cpu_num_test() { + +}
\ No newline at end of file |