70 lines
1.3 KiB
C
70 lines
1.3 KiB
C
|
#include <inc/lib.h>
|
||
|
|
||
|
struct {
|
||
|
char msg1[5000];
|
||
|
char msg2[1000];
|
||
|
} data = {
|
||
|
"this is initialized data",
|
||
|
"so is this"
|
||
|
};
|
||
|
|
||
|
char bss[6000];
|
||
|
|
||
|
int
|
||
|
sum(const char *s, int n)
|
||
|
{
|
||
|
int i, tot = 0;
|
||
|
for (i = 0; i < n; i++)
|
||
|
tot ^= i * s[i];
|
||
|
return tot;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
umain(int argc, char **argv)
|
||
|
{
|
||
|
int i, r, x, want;
|
||
|
char args[256];
|
||
|
|
||
|
cprintf("init: running\n");
|
||
|
|
||
|
want = 0xf989e;
|
||
|
if ((x = sum((char*)&data, sizeof data)) != want)
|
||
|
cprintf("init: data is not initialized: got sum %08x wanted %08x\n",
|
||
|
x, want);
|
||
|
else
|
||
|
cprintf("init: data seems okay\n");
|
||
|
if ((x = sum(bss, sizeof bss)) != 0)
|
||
|
cprintf("bss is not initialized: wanted sum 0 got %08x\n", x);
|
||
|
else
|
||
|
cprintf("init: bss seems okay\n");
|
||
|
|
||
|
// output in one syscall per line to avoid output interleaving
|
||
|
strcat(args, "init: args:");
|
||
|
for (i = 0; i < argc; i++) {
|
||
|
strcat(args, " '");
|
||
|
strcat(args, argv[i]);
|
||
|
strcat(args, "'");
|
||
|
}
|
||
|
cprintf("%s\n", args);
|
||
|
|
||
|
cprintf("init: running sh\n");
|
||
|
|
||
|
// being run directly from kernel, so no file descriptors open yet
|
||
|
close(0);
|
||
|
if ((r = opencons()) < 0)
|
||
|
panic("opencons: %e", r);
|
||
|
if (r != 0)
|
||
|
panic("first opencons used fd %d", r);
|
||
|
if ((r = dup(0, 1)) < 0)
|
||
|
panic("dup: %e", r);
|
||
|
while (1) {
|
||
|
cprintf("init: starting sh\n");
|
||
|
r = spawnl("/sh", "sh", (char*)0);
|
||
|
if (r < 0) {
|
||
|
cprintf("init: spawn sh: %e\n", r);
|
||
|
continue;
|
||
|
}
|
||
|
wait(r);
|
||
|
}
|
||
|
}
|