summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorrtm <rtm>2006-06-22 20:47:23 +0000
committerrtm <rtm>2006-06-22 20:47:23 +0000
commitdf5cc91659b0a2190072e6fc305060c8de95ed82 (patch)
tree0965b8a673f0e2ddab08b2135ab1499f6455c648 /main.c
parentbf49aedbed02cdbf40430178847d34c48c36c693 (diff)
downloadxv6-labs-df5cc91659b0a2190072e6fc305060c8de95ed82.tar.gz
xv6-labs-df5cc91659b0a2190072e6fc305060c8de95ed82.tar.bz2
xv6-labs-df5cc91659b0a2190072e6fc305060c8de95ed82.zip
compile "user programs"
curproc array
Diffstat (limited to 'main.c')
-rw-r--r--main.c54
1 files changed, 47 insertions, 7 deletions
diff --git a/main.c b/main.c
index 5b17297..206daf3 100644
--- a/main.c
+++ b/main.c
@@ -6,9 +6,13 @@
#include "x86.h"
#include "traps.h"
#include "syscall.h"
+#include "elf.h"
+#include "param.h"
extern char edata[], end[];
extern int acpu;
+extern char _binary_user1_start[];
+extern char _binary_user1_size[];
char buf[512];
@@ -16,12 +20,14 @@ int
main()
{
struct proc *p;
- int i;
if (acpu) {
cprintf("an application processor\n");
release_spinlock(&kernel_lock);
- while (1) ;
+ acquire_spinlock(&kernel_lock);
+ lapic_init(cpu());
+ curproc[cpu()] = &proc[0]; // XXX
+ swtch();
}
acpu = 1;
// clear BSS
@@ -34,11 +40,9 @@ main()
tinit(); // traps and interrupts
pic_init();
- while (1);
-
// create fake process zero
p = &proc[0];
- curproc = p;
+ curproc[cpu()] = p;
p->state = WAITING;
p->sz = PAGE;
p->mem = kalloc(p->sz);
@@ -54,17 +58,20 @@ main()
setupsegs(p);
// turn on interrupts
+ irq_setmask_8259A(0xff);
write_eflags(read_eflags() | FL_IF);
- irq_setmask_8259A(0);
#if 0
ide_read(0, buf, 1);
cprintf("sec0.0 %x\n", buf[0] & 0xff);
#endif
-#if 0
+#if 1
p = newproc();
+ load_icode(p, _binary_user1_start, (unsigned) _binary_user1_size);
+#endif
+#if 0
i = 0;
p->mem[i++] = 0x90; // nop
p->mem[i++] = 0xb8; // mov ..., %eax
@@ -96,3 +103,36 @@ main()
return 0;
}
+
+void
+load_icode(struct proc *p, uint8_t *binary, unsigned size)
+{
+ int i;
+ struct Elf *elf;
+ struct Proghdr *ph;
+
+ // Check magic number on binary
+ elf = (struct Elf*) binary;
+ cprintf("elf %x magic %x\n", elf, elf->e_magic);
+ if (elf->e_magic != ELF_MAGIC)
+ panic("load_icode: not an ELF binary");
+
+ p->tf->tf_eip = elf->e_entry;
+ p->tf->tf_esp = p->sz;
+
+ // Map and load segments as directed.
+ ph = (struct Proghdr*) (binary + elf->e_phoff);
+ for (i = 0; i < elf->e_phnum; i++, ph++) {
+ if (ph->p_type != ELF_PROG_LOAD)
+ continue;
+ cprintf("va %x memsz %d\n", ph->p_va, ph->p_memsz);
+ if (ph->p_va + ph->p_memsz < ph->p_va)
+ panic("load_icode: overflow in elf header segment");
+ if (ph->p_va + ph->p_memsz >= p->sz)
+ panic("load_icode: icode wants to be above UTOP");
+
+ // Load/clear the segment
+ memcpy(p->mem + ph->p_va, binary + ph->p_offset, ph->p_filesz);
+ memset(p->mem + ph->p_va + ph->p_filesz, 0, ph->p_memsz - ph->p_filesz);
+ }
+}