summaryrefslogtreecommitdiffstats
path: root/memtestEDK/Memtest/SingleComponents/SmpTestFunctions/apic_test.c
blob: 3e6ff2ae1dd82e010ec5b8e4f32b243a25a424ff (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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() {

}