summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/kernel/core/kmain.cpp6
-rw-r--r--src/kernel/linker/elf.cpp2
-rw-r--r--src/kernel/linker/elf.h2
-rw-r--r--src/kernel/task/sched.cpp1
-rw-r--r--src/user/lib/tce/syscall.c4
-rw-r--r--src/user/test/main.c67
6 files changed, 51 insertions, 31 deletions
diff --git a/src/kernel/core/kmain.cpp b/src/kernel/core/kmain.cpp
index 314c033..9ec06df 100644
--- a/src/kernel/core/kmain.cpp
+++ b/src/kernel/core/kmain.cpp
@@ -77,15 +77,15 @@ extern "C" void kmain(multiboot_info_t* mbd, int32_t magic) {
*ke_vt << "Loading modules :\n";
for (unsigned i = 0; i < mbd->mods_count; i++) {
*ke_vt << " * " << (char*)mods[i].string;
- if (elf_check((uint8_t*)mods[i].mod_start)) {
- *ke_vt << " : Invalid ELF file\n";
- } else {
+ if (elf_check((uint8_t*)mods[i].mod_start) == 0) {
process *pr = elf_exec((uint8_t*)mods[i].mod_start, PL_USER);
if (pr == 0) {
*ke_vt << " : Error loading\n";
} else {
*ke_vt << " : OK, pid=" << (int)pr->pid << "\n";
}
+ } else {
+ *ke_vt << " : Invalid ELF file\n";
}
}
diff --git a/src/kernel/linker/elf.cpp b/src/kernel/linker/elf.cpp
index c6aebaa..0375e40 100644
--- a/src/kernel/linker/elf.cpp
+++ b/src/kernel/linker/elf.cpp
@@ -7,7 +7,7 @@
int elf_check(uint8_t *data) {
elf_ehdr *h = (elf_ehdr*)data;
if (h->e_ident[0] == 0x7F && h->e_ident[1] == 'E' && h->e_ident[2] == 'L' && h->e_ident[3] == 'F') return 0;
- return 1;
+ return -1;
}
thread_entry elf_load(uint8_t *data, process* process) {
diff --git a/src/kernel/linker/elf.h b/src/kernel/linker/elf.h
index bb61795..184f410 100644
--- a/src/kernel/linker/elf.h
+++ b/src/kernel/linker/elf.h
@@ -56,7 +56,7 @@ struct phdr {
uint8_t* data;
};
-int elf_check(uint8_t *data); //0 if ok, 1 if not a valid ELF
+int elf_check(uint8_t *data); //0 if ok, -1 if not a valid ELF
thread_entry elf_load(uint8_t *data, process* process); //Load an ELF to a process, return entry point
process* elf_exec(uint8_t *data, int privilege); //Creates a new process and a thread for running ELF file
diff --git a/src/kernel/task/sched.cpp b/src/kernel/task/sched.cpp
index 2629a33..d7e16d2 100644
--- a/src/kernel/task/sched.cpp
+++ b/src/kernel/task/sched.cpp
@@ -1,6 +1,7 @@
#include "sched.h"
#include <core/sys.h>
#include <mem/mem.h>
+#include <ui/vt.h>
// Lower priority numbers have high priority. Priorities must start at 0.
#define PRIORITIES 3 // we have 3 priority levels
diff --git a/src/user/lib/tce/syscall.c b/src/user/lib/tce/syscall.c
index 4e81475..3e8d75e 100644
--- a/src/user/lib/tce/syscall.c
+++ b/src/user/lib/tce/syscall.c
@@ -44,8 +44,8 @@ void thread_start(void *data) {
mutex_lock(&_stack_freeing_mutex);
if (_stack_to_free != 0) free(_stack_to_free);
_stack_to_free = tsd->stack;
- asm volatile("movl %0, (_stack_freeing_mutex); int $64;" ::
- "a"(SC_THREAD_EXIT), "r"(MUTEX_UNLOCKED));
+ asm volatile("movl %%ebx, (_stack_freeing_mutex); int $64;" ::
+ "a"(SC_THREAD_EXIT), "b"(MUTEX_UNLOCKED));
}
void thread_new(void (*entry)(void*), void *data) {
struct thread_start_data *tsd = malloc(sizeof(struct thread_start_data));
diff --git a/src/user/test/main.c b/src/user/test/main.c
index e7a6b4f..c98a619 100644
--- a/src/user/test/main.c
+++ b/src/user/test/main.c
@@ -41,24 +41,31 @@ void list_dir(FILE f, int lv) {
file_info info;
while ((r = read(f, i, 256, buf)) > 0) {
+ if (strcmp(buf, ".") == 0 || strcmp(buf, "..") == 0) {
+ i++;
+ continue;
+ }
for (k = 0; k < lv; k++) printk(" ");
- printk(buf); printk("\t\t");
-
+ printk(buf);
stat_relative(f, buf, &info);
- printk_hex(info.type);
+ if (info.type & FT_DIR) printk("/");
+ printk(" \t");
+
+ if (info.type & FT_FILE) printk("file ");
+ if (info.type & FT_DIR) printk("dir ");
+ if (info.type & FT_SYMLINK) printk("symlink ");
+ if (info.type & FT_DEV) printk("dev ");
+ if (info.type & FT_TERMINAL) printk("term ");
+
if (info.type & FT_DIR) {
- printk("\t");
- if (strcmp(buf, ".") != 0 && strcmp(buf, "..") != 0) {
- FILE ff = open_relative(f, buf, 0);
- if (ff <= 0) {
- printk("error: "); printk_int(ff); printk("\n");
- } else {
- printk("fd: "); printk_int(ff); printk("\n");
- list_dir(ff, lv+1);
- close(ff);
- }
+ printk(" \t");
+ FILE ff = open_relative(f, buf, 0);
+ if (ff <= 0) {
+ printk("error: "); printk_int(ff); printk("\n");
} else {
- printk("\n");
+ printk("fd: "); printk_int(ff); printk("\n");
+ list_dir(ff, lv+1);
+ close(ff);
}
} else {
printk("\n");
@@ -67,6 +74,10 @@ void list_dir(FILE f, int lv) {
}
}
+void fprint(FILE f, char *s) {
+ write(f, 0, strlen(s), s);
+}
+
int main() {
printk("(test app) malloc(42) = ");
printk_hex((uint32_t)malloc(42));
@@ -93,27 +104,35 @@ int main() {
close(f);
}
- printk(" -> YOUR SHELL IS STARTING UP, SIR.\n");
f = open("/.ui/klog", 0);
if (f <= 0) {
printk(" -> Error #"); printk_int(f); printk(" - too bad. Exiting.\n");
} else {
- char *s = "Hello, writing from your opened file!\n";
- write(f, 0, strlen(s), s);
+ fprint(f, " -> Now reading && writing from/to virtual terminal '/.ui/klog'\n");
while (1) {
- char *s = " > ";
- write(f, 0, strlen(s), s);
+ fprint(f, " > ");
char buffer[256];
int l = read(f, 0, 255, buffer);
buffer[l] = 0;
if (buffer[l-1] == '\n') {
- char *s = "You said: ";
- write(f, 0, strlen(s), s);
- write(f, 0, l, buffer);
+ buffer[l-1] = 0; l--;
+
+ if (strcmp(buffer, "about") == 0) {
+ fprint(f, "Trivial/Computing Environment v0.1.0 - useless shell, first ediiton.\n");
+ } else if (strcmp(buffer, "help") == 0) {
+ fprint(f, "Available commands: about, help, exit.\n");
+ } else if (strcmp(buffer, "exit") == 0) {
+ fprint(f, "Exiting the shell. I think the system is pretty likely to panic.\n");
+ break;
+ } else if (strcmp(buffer, "gotosleep") == 0) {
+ while (1) thread_sleep(1000);
+ } else {
+ fprint(f, "Unknown command. ");
+ fprint(f, buffer);
+ }
} else {
- char *s = "oops\n";
- write(f, 0, strlen(s), s);
+ fprint(f, " - - - oops\n");
}
}
}