summaryrefslogtreecommitdiff
path: root/src/user/lib/tce
diff options
context:
space:
mode:
authorAlex AUVOLAT <alexis211@gmail.com>2012-05-01 23:48:56 +0200
committerAlex AUVOLAT <alexis211@gmail.com>2012-05-01 23:48:56 +0200
commit43d0bb8e3997022e5270f7f75f615a47819c929e (patch)
tree937992d286966edecf81b405e414230c85d19bad /src/user/lib/tce
parente9683297bf480f9590b0e5796f4520fb430e2e03 (diff)
downloadTCE-43d0bb8e3997022e5270f7f75f615a47819c929e.tar.gz
TCE-43d0bb8e3997022e5270f7f75f615a47819c929e.zip
Basic object system - THIS IS STILL A LONG WAY TO GO!!
Diffstat (limited to 'src/user/lib/tce')
-rw-r--r--src/user/lib/tce/Folder.c24
-rw-r--r--src/user/lib/tce/syscall.c48
2 files changed, 61 insertions, 11 deletions
diff --git a/src/user/lib/tce/Folder.c b/src/user/lib/tce/Folder.c
new file mode 100644
index 0000000..9b0a773
--- /dev/null
+++ b/src/user/lib/tce/Folder.c
@@ -0,0 +1,24 @@
+#include <tce/Folder.h>
+#include <stdio.h>
+
+static struct FolderMethods _folderMethods = { 0 };
+
+struct FolderMethods *Folder_getMethods() {
+ int i;
+ if (_folderMethods.GetChildNameAt == -1) return 0;
+ if (_folderMethods.GetChildNameAt == 0) {
+ i = get_methods("Folder", (int*)&_folderMethods);
+ if (i < 0) {
+ _folderMethods.GetChildNameAt = -1;
+ return 0;
+ }
+ }
+ return &_folderMethods;
+}
+
+int Folder_GetChildNameAt(Object object, int pos, char *to) {
+ struct FolderMethods *folder = Folder_getMethods();
+ if (folder == 0) return E_NOT_IMPLEMENTED;
+
+ return Call(folder->GetChildNameAt, object, pos, to, 0, 0);
+}
diff --git a/src/user/lib/tce/syscall.c b/src/user/lib/tce/syscall.c
index f9243b0..b779bb6 100644
--- a/src/user/lib/tce/syscall.c
+++ b/src/user/lib/tce/syscall.c
@@ -1,4 +1,5 @@
#include <tce/syscall.h>
+#include <tce/Object.h>
#include <stdlib.h>
#include <sched.h>
@@ -8,24 +9,26 @@ static size_t call(size_t a, size_t b, size_t c, size_t d, size_t e, size_t f) {
return ret;
}
+// Standard syscalls
+
void thread_exit() {
- call(0, 0, 0, 0, 0, 0);
+ call(0, 1, 0, 0, 0, 0);
}
void schedule() {
- call(1, 0, 0,0, 0, 0);
+ call(0, 2, 0,0, 0, 0);
}
void thread_sleep(int time) {
- call(2, time, 0, 0, 0, 0);
+ call(0, 3, time, 0, 0, 0);
}
void process_exit(int retval) {
- call(3, retval, 0, 0, 0, 0);
+ call(0, 4, retval, 0, 0, 0);
}
void printk(char* str) {
- call(4, (unsigned)str, 0, 0, 0, 0);
+ call(0, 5, (unsigned)str, 0, 0, 0);
}
//THREAD CREATION
@@ -44,28 +47,51 @@ void thread_start(void *data) {
if (_stack_to_free != 0) free(_stack_to_free);
_stack_to_free = tsd->stack;
asm volatile("movl %0, (_stack_freeing_mutex); int $64;" ::
- "a"(0), "r"(MUTEX_UNLOCKED));
+ "a"(0), "b"(1), "r"(MUTEX_UNLOCKED));
}
+
void thread_new(void (*entry)(void*), void *data) {
struct thread_start_data *tsd = malloc(sizeof(struct thread_start_data));
tsd->entry = entry;
tsd->data = data;
tsd->stack = malloc(NEW_STACK_SIZE);
- call(5, (unsigned)thread_start, (unsigned)tsd, (unsigned)(tsd->stack + NEW_STACK_SIZE), 0, 0);
+ call(0, 6, (unsigned)thread_start, (unsigned)tsd, (unsigned)(tsd->stack + NEW_STACK_SIZE), 0);
}
void irq_wait(int number) {
- call(6, number, 0, 0, 0, 0);
+ call(0, 7, number, 0, 0, 0);
}
int proc_priv() {
- return call(7, 0, 0, 0, 0, 0);
+ return call(0, 8, 0, 0, 0, 0);
}
void* sbrk(size_t s) {
- return (void*)call(8, s, 0, 0, 0, 0);
+ return (void*)call(0, 9, s, 0, 0, 0);
}
void brk(void* ptr) {
- return call (9, ptr, 0, 0, 0, 0);
+ return call (0, 10, ptr, 0, 0, 0);
+}
+
+// Has to do with objects
+
+Object open(char* name) {
+ return call(0, 20, name, 0, 0, 0);
+}
+
+Object open_relative(char* name, Object parent) {
+ return call(0, 21, name, parent, 0, 0);
+}
+
+void close(Object o) {
+ call(0, 22, o, 0, 0, 0);
+}
+
+int get_methods(char *iface, int* whereto) {
+ call(0, 23, iface, whereto, 0, 0);
+}
+
+int Call(int method, Object object, size_t a, size_t b, size_t c, size_t d) {
+ return call(object, method, a, b, c, d);
}