summaryrefslogtreecommitdiffstats
path: root/memtestEDK/Memtest/SingleComponents/test.h
diff options
context:
space:
mode:
Diffstat (limited to 'memtestEDK/Memtest/SingleComponents/test.h')
-rw-r--r--memtestEDK/Memtest/SingleComponents/test.h346
1 files changed, 346 insertions, 0 deletions
diff --git a/memtestEDK/Memtest/SingleComponents/test.h b/memtestEDK/Memtest/SingleComponents/test.h
new file mode 100644
index 0000000..8b2e924
--- /dev/null
+++ b/memtestEDK/Memtest/SingleComponents/test.h
@@ -0,0 +1,346 @@
+/* test.h - MemTest-86 Version 3.4
+ *
+ * Released under version 2 of the Gnu Public License.
+ * By Chris Brady
+ */
+
+#ifndef _TEST_H_
+#define _TEST_H_
+#define E88 0x00
+#define E801 0x04
+#define E820NR 0x08 /* # entries in E820MAP */
+#define E820MAP 0x0c /* our map */
+#define E820MAX 127 /* number of entries in E820MAP */
+#define E820ENTRY_SIZE 20
+#define MEMINFO_SIZE (E820MAP + E820MAX * E820ENTRY_SIZE)
+
+#ifndef __ASSEMBLY__
+
+#define E820_RAM 1
+#define E820_RESERVED 2
+#define E820_ACPI 3 /* usable as RAM once ACPI tables have been read */
+#define E820_NVS 4
+
+struct e820entry {
+ unsigned long long addr; /* start of memory segment */
+ unsigned long long size; /* size of memory segment */
+ unsigned long type; /* type of memory segment */
+};
+
+struct mem_info_t {
+ unsigned long e88_mem_k; /* 0x00 */
+ unsigned long e801_mem_k; /* 0x04 */
+ unsigned long e820_nr; /* 0x08 */
+ struct e820entry e820[E820MAX]; /* 0x0c */
+ /* 0x28c */
+};
+
+typedef unsigned long ulong;
+#define STACKSIZE_BYTES (8*1024)
+#define MAX_MEM_PAGES 0x7FF00000 /* 8 TB; units are 4K pages */
+#define WIN_SZ_PAGES 0x80000 /* 2 GB; units are 4K pages */
+#define UNMAP_SZ_PAGES (0x100000-WIN_SZ_PAGES) /* Size of unmapped first segment */
+
+#define SPINSZ_DWORDS 0x4000000 /* 256 MB; units are dwords (32-bit words) */
+#define MOD_SZ 20
+#define BAILOUT if (bail) return(1);
+#define BAILR if (bail) return;
+
+#define RES_START 0xa0000
+#define RES_END 0x100000
+#define SCREEN_ADR 0xb8000
+#define SCREEN_END_ADR (SCREEN_ADR + 80*25*2)
+
+#define DMI_SEARCH_START 0x0000F000
+#define DMI_SEARCH_LENGTH 0x000F0FFF
+#define MAX_DMI_MEMDEVS 16
+
+#define TITLE_WIDTH 28
+#define LINE_TITLE 0
+#define LINE_TST 3
+#define LINE_RANGE 4
+#define LINE_PAT 5
+#define LINE_TIME 5
+#define LINE_STATUS 8
+#define LINE_INFO 9
+#define LINE_HEADER 12
+#define LINE_SCROLL 14
+#define LINE_SPD 14
+#define LINE_MSG 22
+#define LINE_CPU 7
+#define LINE_RAM 8
+#define LINE_DMI 23
+#define COL_INF1 15
+#define COL_INF2 32
+#define COL_INF3 51
+#define COL_INF4 70
+#define COL_MODE 15
+#define COL_MID 30
+#define COL_PAT 41
+#define BAR_SIZE (78-COL_MID-9)
+#define COL_MSG 23
+#define COL_TIME 67
+#define COL_SPEC 41
+
+#define POP_W 34
+#define POP_H 15
+#define POP_X 11
+#define POP_Y 8
+#define POP2_W 74
+#define POP2_H 21
+#define POP2_X 3
+#define POP2_Y 2
+
+/* CPU mode types */
+#define CPM_ALL 1
+#define CPM_RROBIN 2
+#define CPM_SEQ 3
+
+/* memspeed operations */
+#define MS_COPY 1
+#define MS_WRITE 2
+#define MS_READ 3
+
+#define SZ_MODE_BIOS 1
+#define SZ_MODE_PROBE 2
+
+#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
+
+int mt86_memcmp(const void *s1, const void *s2, ulong count);
+void *mt86_memmove(void *dest, const void *src, ulong n);
+int mt86_strncmp(const char *s1, const char *s2, ulong n);
+int mt86_strstr(char *str1, char *str2);
+int mt86_strlen(char *string);
+int query_linuxbios(void);
+int query_pcbios(void);
+int insertaddress(ulong);
+void printpatn(void);
+void printpatn(void);
+void itoa(char s[], int n);
+void reverse(char *p);
+void serial_console_setup(char *param);
+void serial_echo_init(void);
+void serial_echo_print(const char *s);
+void ttyprint(int y, int x, const char *s);
+void ttyprintc(int y, int x, char c);
+void cprint(int y,int x, const char *s);
+void cplace(int y,int x, const char s);
+void hprint(int y,int x, ulong val);
+void hprint2(int y,int x, ulong val, int len);
+void hprint3(int y,int x, ulong val, int len);
+void xprint(int y,int x,ulong val);
+void aprint(int y,int x,ulong page);
+void dprint(int y,int x,ulong val,int len, int right);
+void movinv1(int iter, ulong p1, ulong p2, int cpu);
+void movinvr(int cpu);
+void movinv32(int iter, ulong p1, ulong lb, ulong mb, int sval, int off,
+ int cpu);
+void modtst(int off, int iter, ulong p1, ulong p2, int cpu);
+#define ASSERT(n) do { \
+ if (!(n)) { \
+ assert_fail(__FILE__, __LINE__); \
+ } } while(0)
+void assert_fail(const char* file, int line_no);
+void mt86_error(ulong* adr, ulong good, ulong bad);
+void ad_err1(ulong *adr1, ulong *adr2, ulong good, ulong bad);
+void ad_err2(ulong *adr, ulong bad);
+void do_tick();
+void init(void);
+struct eregs;
+void inter(struct eregs *trap_regs);
+void set_cache(int val);
+void check_input(void);
+void footer(void);
+void scroll(void);
+void clear_scroll(void);
+void popup(void);
+void popdown(void);
+void popclear(void);
+void pop2up(void);
+void pop2down(void);
+void pop2clear(void);
+void get_config(void);
+void get_menu(void);
+void get_printmode(void);
+void addr_tst1(int cpu);
+void addr_tst2(int cpu);
+int getnum(ulong val);
+void sleep(long sec, int flag, int cpu, int sms);
+void block_move(int iter, int cpu);
+void find_ticks(void);
+void print_err(ulong *adr, ulong good, ulong bad, ulong xor);
+void print_ecc_err(ulong page, ulong offset, int corrected,
+ unsigned short syndrome, int channel);
+void mem_size(void);
+void adj_mem(void);
+ulong getval(int x, int y, int result_shift);
+int get_key(void);
+int ascii_to_keycode(int in);
+void wait_keyup(void);
+void print_hdr(void);
+void restart(void);
+void parity_err(ulong edi, ulong esi);
+void start_config(void);
+void clear_screen(void);
+void paging_off(void);
+void show_spd(void);
+int map_page(unsigned long page);
+void *mapping(unsigned long phys_page); // get VA for a physical page
+void *emapping(unsigned long phys_page);
+int mt86_isdigit(char c);
+ulong memspeed(ulong src, ulong len, int iter);
+unsigned long page_of(void *ptr);
+ulong correct_tsc(ulong el_org);
+void bit_fade_fill(unsigned long n, int cpu);
+void bit_fade_chk(unsigned long n, int cpu);
+void find_ticks_for_pass(void);
+void beep(unsigned int frequency);
+
+// Expose foreach_segment here for self_test, otherwise
+// it would be local to test.c:
+typedef void(*segment_fn)(ulong* start, // start address
+ ulong len_dw, // length of segment in dwords
+ const void* ctx); // any context data needed
+void foreach_segment(ulong* start, ulong* end,
+ int me, const void* ctx, segment_fn func);
+
+
+// In self-test, DEBUGF wraps libc's printf.
+// In memtest standalone, printf will be a stub
+// and 'vv->debugging' is false to avoid call overhead.
+int printf(const char *format, ...);
+#define DEBUGF(...) { \
+ if (vv->debugging) { \
+ printf(__VA_ARGS__); \
+ } \
+ }
+
+#define PRINTMODE_SUMMARY 0
+#define PRINTMODE_ADDRESSES 1
+#define PRINTMODE_PATTERNS 2
+#define PRINTMODE_NONE 3
+
+#define BADRAM_MAXPATNS 10
+
+struct pair {
+ ulong adr;
+ ulong mask;
+};
+
+static inline void cache_off(void)
+{
+ asm(
+ "push %eax\n\t"
+ "movl %cr0,%eax\n\t"
+ "orl $0x40000000,%eax\n\t" /* Set CD */
+ "movl %eax,%cr0\n\t"
+ "wbinvd\n\t"
+ "pop %eax\n\t");
+}
+
+static inline void cache_on(void)
+{
+ asm(
+ "push %eax\n\t"
+ "movl %cr0,%eax\n\t"
+ "andl $0x9fffffff,%eax\n\t" /* Clear CD and NW */
+ "movl %eax,%cr0\n\t"
+ "pop %eax\n\t");
+}
+
+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 tseq {
+ short sel; // enabled
+ short cpu_sel; // cpu_sel == 0 indicates end of tseq[] array
+ short pat; // the test #
+ short iter; // # of iterations to run
+ short errors; // error count, updated as tests run
+ char *msg;
+};
+
+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;
+};
+
+
+
+#define X86_FEATURE_PAE (0*32+ 6) /* Physical Address Extensions */
+
+#define MAX_MEM_SEGMENTS E820MAX
+
+/* Define common variables across relocations of memtest86 */
+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
+};
+
+#define FIRMWARE_UNKNOWN 0
+#define FIRMWARE_PCBIOS 1
+#define FIRMWARE_LINUXBIOS 2
+
+extern struct vars * const vv;
+extern unsigned char _start[], _end[], startup_32[];
+extern unsigned char _size, _pages;
+
+extern struct mem_info_t mem_info;
+
+#endif /* __ASSEMBLY__ */
+#endif /* _TEST_H_ */