-
Notifications
You must be signed in to change notification settings - Fork 0
/
kmain.c
194 lines (160 loc) · 3.56 KB
/
kmain.c
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/**
* Use this file as an alternative to main.cpp,
* if you does not like C++
*
* I am going to upload some C style starter codes soon.
*/
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned long ulong;
typedef unsigned int uint32;
typedef unsigned long uint64;
typedef unsigned long k_addr_t;
#ifndef size_t
typedef unsigned long size_t;
#endif
static char* print(char* pos, const char* str)
{
char* p = (char*)str;
while (*p)
{
*pos++ = *p++;
*pos++ = 0x1f;
}
return pos;
}
static void clear(char* pos)
{
for (int i = 0; i < (160*25); i++)
{
*pos++ = ' ';
*pos++ = 0x1f;
}
}
/**
* If nothing works, then we may need to implement
* our own serial access here.
*/
static inline uchar k_debug_read(ushort index)
{
uchar retval;
asm volatile ("inb (%%dx), %%al" : "=a"(retval) : "d"(0x3f8+index));
return retval;
}
static inline void k_debug_write(ushort index, uchar value)
{
asm volatile ("outb %%al, (%%dx)" : : "a"(value), "d"(0x3f8+index));
}
static void k_debug_init(void)
{
k_debug_write(1, 0);
k_debug_write(3, 128);
k_debug_write(0, 3);
k_debug_write(1, 0);
k_debug_write(3, 3);
k_debug_write(2, 199);
k_debug_write(4, 11);
}
static void k_debug_print(const char* str)
{
char* c = (char*)str;
uchar status = k_debug_read(5) & 0x20;
while (!status)
status = k_debug_read(5) & 0x20;
while (*c)
k_debug_write(0, *c++);
k_debug_write(0, '\n');
}
static void k_debug_addr(const char* title, k_addr_t addr)
{
char buf[50];
char* p = (char*)title;
ulong ud = addr;
uchar status = k_debug_read(5) & 0x20;
while (!status)
status = k_debug_read(5);
while (*p)
k_debug_write(0, *p++);
buf[0] = '0';
buf[1] = 'x';
p = &buf[2];
do
{
int remainder = ud % 16;
*p++ = (remainder < 10) ? remainder + '0' : remainder + 'A' - 10;
} while (ud /= 16);
*p = 0;
char *p1 = &buf[2];
char *p2 = p - 1;
while (p1 < p2)
{
char tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2--;
}
status = k_debug_read(5) & 0x20;
while (!status)
status = k_debug_read(5) & 0x20;
p = buf;
while (*p)
k_debug_write(0, *p++);
/* add new line */
k_debug_write(0, '\n');
}
static void k_debug_size(const char* title, size_t nsize)
{
char buf[50];
char* p = (char*)title;
ulong ud = nsize;
uchar status = k_debug_read(5) & 0x20;
while (!status)
status = k_debug_read(5);
while (*p)
k_debug_write(0, *p++);
p = buf;
do
{
int remainder = ud % 10;
*p++ = remainder + '0';
} while (ud /= 10);
*p = 0;
char *p1 = buf;
char *p2 = p - 1;
while (p1 < p2)
{
char tmp = *p1;
*p1 = *p2;
*p2 = tmp;
p1++;
p2--;
}
status = k_debug_read(5) & 0x20;
while (!status)
status = k_debug_read(5) & 0x20;
p = buf;
while (*p)
k_debug_write(0, *p++);
/* add new line */
k_debug_write(0, '\n');
}
#define DEBUG_PTR(title, val) k_debug_addr(((const char*)(title)), ((k_addr_t)(val)))
void kmain(unsigned long mbi)
{
unsigned long pos = 0xffffffff800b8000;
clear((char*)pos);
print((char*)pos, "=============== C Kernel Started ==============");
pos += 160;
print((char*)pos, "[kmain] Bootstrap is more stable now.");
k_debug_init();
k_debug_print("\n\033[1;31m============================= C Kernel Started ===========================");
k_debug_print("If we got here, then the mystery of Virtual Address space has been solved.\n:-)\n\033[1;34m");
k_debug_addr("[kmain] Got MBI address: ", mbi);
unsigned* ptr = (unsigned*)mbi;
k_debug_size("\nMBI Size = ", ptr[0]);
ptr = (unsigned*)(mbi + 8);
DEBUG_PTR("First tag => ", ptr[0]);
k_debug_print("[kmain] Ended (for now)...\033[0m\n");
while (1);
}