summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexis211 <alexis211@gmail.com>2009-10-18 21:56:26 +0200
committerAlexis211 <alexis211@gmail.com>2009-10-18 21:56:26 +0200
commit0cca2d68451849b5ea96a3620566fd0b42dde3c0 (patch)
treefcdcaace870a59d0b8f2ccc6abb8418763960dbe
parent776753bfa0c411f4b1a5680409104904961fcbeb (diff)
downloadMelon-0cca2d68451849b5ea96a3620566fd0b42dde3c0.tar.gz
Melon-0cca2d68451849b5ea96a3620566fd0b42dde3c0.zip
More work on syscalls
-rw-r--r--Source/Applications/SampleApps/cxxdemo.cpp3
-rw-r--r--Source/Kernel/MemoryManager/Mem.ns.cpp5
-rw-r--r--Source/Kernel/MemoryManager/Mem.ns.h2
-rw-r--r--Source/Kernel/TaskManager/Thread.class.cpp13
-rw-r--r--Source/Kernel/TaskManager/Thread.class.h4
-rw-r--r--Source/Kernel/VTManager/VirtualTerminal-sc.proto.cpp15
-rw-r--r--Source/Kernel/VTManager/VirtualTerminal.proto.cpp3
-rw-r--r--Source/Kernel/VTManager/VirtualTerminal.proto.h3
-rw-r--r--Source/Library/Common/String.class.cpp20
-rw-r--r--Source/Library/Common/String.class.h5
-rw-r--r--Source/Library/Interface/VirtualTerminal.iface.h4
-rw-r--r--Source/Library/Userland/Binding/VirtualTerminal.class.h11
-rw-r--r--Source/Library/Userland/Start.cpp3
-rw-r--r--Source/Library/Userland/Syscall/RessourceCaller.class.h11
-rw-r--r--Source/Library/Userland/common.h1
15 files changed, 100 insertions, 3 deletions
diff --git a/Source/Applications/SampleApps/cxxdemo.cpp b/Source/Applications/SampleApps/cxxdemo.cpp
index 8da475a..01644a8 100644
--- a/Source/Applications/SampleApps/cxxdemo.cpp
+++ b/Source/Applications/SampleApps/cxxdemo.cpp
@@ -5,12 +5,15 @@
int main() {
VirtualTerminal x = VirtualTerminal::get();
+ String s = x.readLine();
+ x.write(s);
Thread t = Thread::get();
for (char c = ' '; c <= 'z'; c++) {
t.sleep((u32int)c / 4);
x.put(c);
}
x.put("\n");
+ x.write("Salut les gens ! c'est le progrès !!!\nLe boeuf mort est juste là : ");
x.writeHex(0xDEADBEEF);
x.put("\n");
}
diff --git a/Source/Kernel/MemoryManager/Mem.ns.cpp b/Source/Kernel/MemoryManager/Mem.ns.cpp
index c7f07f0..144b9f3 100644
--- a/Source/Kernel/MemoryManager/Mem.ns.cpp
+++ b/Source/Kernel/MemoryManager/Mem.ns.cpp
@@ -1,5 +1,6 @@
#include <common.h>
#include <MemoryManager/PhysMem.ns.h>
+#include <TaskManager/Task.ns.h>
#include <Heap.class.h>
namespace Mem {
@@ -50,6 +51,10 @@ void free(void *ptr) {
kheap.free(ptr);
}
+void* mkXchgSpace(u32int sz) {
+ return Task::currThread()->mkXchgSpace(sz);
+}
+
u32int kheapSize() {
return kheap.size();
}
diff --git a/Source/Kernel/MemoryManager/Mem.ns.h b/Source/Kernel/MemoryManager/Mem.ns.h
index 0d2b1da..b06ab79 100644
--- a/Source/Kernel/MemoryManager/Mem.ns.h
+++ b/Source/Kernel/MemoryManager/Mem.ns.h
@@ -11,6 +11,8 @@ namespace Mem {
void *alloc(u32int sz, bool align = false);
void free(void *ptr);
+ void* mkXchgSpace(u32int sz); //This creates a space between userland and kernel land where data can be exchanged
+
u32int kheapSize(), kheapFree();
}
diff --git a/Source/Kernel/TaskManager/Thread.class.cpp b/Source/Kernel/TaskManager/Thread.class.cpp
index 315eae2..98fa32d 100644
--- a/Source/Kernel/TaskManager/Thread.class.cpp
+++ b/Source/Kernel/TaskManager/Thread.class.cpp
@@ -52,6 +52,7 @@ void runThread(Thread* thread, void* data, thread_entry_t entry_point) {
}
Thread::Thread() : Ressource(TH_IFACE_OBJTYPE) { //Private constructor, does nothing
+ m_xchgspace = 0;
}
Thread::Thread(thread_entry_t entry_point, void* data, bool iskernel) : Ressource(TH_IFACE_OBJTYPE) {
@@ -69,10 +70,13 @@ Thread::Thread(Process* process, thread_entry_t entry_point, void* data) : Resso
Thread::~Thread() {
Task::unregisterThread(this);
Mem::free(m_kernelStack.addr);
+ m_process->getPagedir()->switchTo();
if (m_userStack.addr != 0) {
- m_process->getPagedir()->switchTo();
m_process->heap().free(m_userStack.addr);
}
+ if (m_xchgspace != 0) {
+ m_process->heap().free(m_xchgspace);
+ }
//Don't unregister thread in process, it has probably already been done
}
@@ -80,6 +84,7 @@ void Thread::setup(Process* process, thread_entry_t entry_point, void* data, boo
addCall1(TH_IFACE_SLEEP, (call1)&Thread::sleepSC);
addCall1(TH_IFACE_FINISH, (call1)&Thread::finishSC);
+ m_xchgspace = 0;
m_isKernel = isKernel;
m_process = process;
m_kernelStack.addr = Mem::alloc(STACKSIZE);
@@ -181,6 +186,12 @@ u32int Thread::getEip() { return m_eip; }
Process* Thread::getProcess() { return m_process; }
+void* Thread::mkXchgSpace(u32int sz) {
+ if (m_xchgspace != 0) m_process->heap().free(m_xchgspace);
+ m_xchgspace = m_process->heap().alloc(sz);
+ return m_xchgspace;
+}
+
void Thread::sleep(u32int msecs) {
m_state = T_SLEEPING;
waitfor.m_time = Time::time() + msecs;
diff --git a/Source/Kernel/TaskManager/Thread.class.h b/Source/Kernel/TaskManager/Thread.class.h
index 8a7d45e..42baa86 100644
--- a/Source/Kernel/TaskManager/Thread.class.h
+++ b/Source/Kernel/TaskManager/Thread.class.h
@@ -22,6 +22,8 @@ class Thread : public Ressource {
u32int m_esp, m_ebp, m_eip;
u8int m_state; //Is one of T_* defined above
+ void* m_xchgspace;
+
union { //What the thread might be waiting for
u32int m_time;
u8int m_irq; //An IRQ number
@@ -49,6 +51,8 @@ class Thread : public Ressource {
u32int getEip();
Process* getProcess();
+ void* mkXchgSpace(u32int sz);
+
void sleep(u32int msecs);
void waitIRQ(u8int irq);
bool runnable(); //Called by scheduler
diff --git a/Source/Kernel/VTManager/VirtualTerminal-sc.proto.cpp b/Source/Kernel/VTManager/VirtualTerminal-sc.proto.cpp
index 8948657..e0c6e8d 100644
--- a/Source/Kernel/VTManager/VirtualTerminal-sc.proto.cpp
+++ b/Source/Kernel/VTManager/VirtualTerminal-sc.proto.cpp
@@ -5,7 +5,22 @@ u32int VirtualTerminal::writeHexSC(u32int number) {
return 0;
}
+u32int VirtualTerminal::writeSC(u32int wat) {
+ write(String::unserialize(wat));
+ return 0;
+}
+
+u32int VirtualTerminal::writeDecSC(u32int n_hi, u32int n_lo) {
+ s64int n = ((u64int)n_hi << 32) | n_lo;
+ writeDec(n);
+ return 0;
+}
+
u32int VirtualTerminal::putSC(u32int code) {
put(WChar(code));
return 0;
}
+
+u32int VirtualTerminal::readLineSC() {
+ return readLine().serialize();
+}
diff --git a/Source/Kernel/VTManager/VirtualTerminal.proto.cpp b/Source/Kernel/VTManager/VirtualTerminal.proto.cpp
index b7c7340..dfd8f84 100644
--- a/Source/Kernel/VTManager/VirtualTerminal.proto.cpp
+++ b/Source/Kernel/VTManager/VirtualTerminal.proto.cpp
@@ -7,7 +7,10 @@
VirtualTerminal::VirtualTerminal() :
Ressource(VT_IFACE_OBJTYPE), m_kbdMutex(false), m_kbdbuffMutex(false), m_kbdbuff() {
addCall1(VT_IFACE_WRITEHEX, (call1)&VirtualTerminal::writeHexSC);
+ addCall2(VT_IFACE_WRITEDEC, (call2)&VirtualTerminal::writeDecSC);
+ addCall1(VT_IFACE_WRITE, (call1)&VirtualTerminal::writeSC);
addCall1(VT_IFACE_PUT, (call1)&VirtualTerminal::putSC);
+ addCall0(VT_IFACE_READLINE, (call0)&VirtualTerminal::readLineSC);
}
VirtualTerminal::~VirtualTerminal() {
diff --git a/Source/Kernel/VTManager/VirtualTerminal.proto.h b/Source/Kernel/VTManager/VirtualTerminal.proto.h
index b9d0eb8..b0cd224 100644
--- a/Source/Kernel/VTManager/VirtualTerminal.proto.h
+++ b/Source/Kernel/VTManager/VirtualTerminal.proto.h
@@ -21,7 +21,10 @@ class VirtualTerminal : public Ressource {
//SYSCALLS :
u32int writeHexSC(u32int);
+ u32int writeDecSC(u32int, u32int);
+ u32int writeSC(u32int);
u32int putSC(u32int);
+ u32int readLineSC();
public:
VirtualTerminal();
diff --git a/Source/Library/Common/String.class.cpp b/Source/Library/Common/String.class.cpp
index d8913d9..c217807 100644
--- a/Source/Library/Common/String.class.cpp
+++ b/Source/Library/Common/String.class.cpp
@@ -49,6 +49,26 @@ String String::number(s32int number) {
return ret;
}
+String String::unserialize(u32int w) {
+ u32int* a = (u32int*)w;
+ String ret;
+ ret.m_length = a[0];
+ ret.m_string = (WChar*)Mem::alloc(a[0] * sizeof(WChar));
+ for (u32int i = 0; i < a[0]; i++) {
+ ret[i] = a[i + 1];
+ }
+ return ret;
+}
+
+u32int String::serialize() {
+ u32int* x = (u32int*)Mem::mkXchgSpace((m_length + 1) * sizeof(u32int));
+ x[0] = m_length;
+ for (u32int i = 0; i < m_length; i++) {
+ x[i + 1] = m_string[i];
+ }
+ return (u32int)x;
+}
+
String::String(const char* string, u8int encoding) {
m_string = 0;
m_length = 0;
diff --git a/Source/Library/Common/String.class.h b/Source/Library/Common/String.class.h
index 3e50d35..5db9858 100644
--- a/Source/Library/Common/String.class.h
+++ b/Source/Library/Common/String.class.h
@@ -9,6 +9,9 @@ class String : public BasicString<WChar> {
static String hex(u32int number);
static String number(s32int number);
+ static String unserialize(u32int w);
+ u32int serialize();
+
String(const char* string, u8int encoding = UE_UTF8);
String() : BasicString<WChar>() {}
String(const String &other) : BasicString<WChar> (other) {}
@@ -34,7 +37,7 @@ class String : public BasicString<WChar> {
String operator+ (const String &other) const { return concat(other); }
String operator+ (const char* other) const { return concat(other); }
String operator+ (WChar other) const { return concat(other); }
-
+
s64int toInt() const; //Convert from DEC
u64int toInt16() const; //Convert from HEX
diff --git a/Source/Library/Interface/VirtualTerminal.iface.h b/Source/Library/Interface/VirtualTerminal.iface.h
index 661162f..1525b6c 100644
--- a/Source/Library/Interface/VirtualTerminal.iface.h
+++ b/Source/Library/Interface/VirtualTerminal.iface.h
@@ -4,5 +4,9 @@
#define VT_IFACE_OBJTYPE 0x10
#define VT_IFACE_PUT 0x01
#define VT_IFACE_WRITEHEX 0x02
+#define VT_IFACE_WRITEDEC 0x03
+#define VT_IFACE_WRITE 0x04
+
+#define VT_IFACE_READLINE 0x05
#endif
diff --git a/Source/Library/Userland/Binding/VirtualTerminal.class.h b/Source/Library/Userland/Binding/VirtualTerminal.class.h
index a7bb4c2..67683b8 100644
--- a/Source/Library/Userland/Binding/VirtualTerminal.class.h
+++ b/Source/Library/Userland/Binding/VirtualTerminal.class.h
@@ -2,6 +2,7 @@
#include <VirtualTerminal.iface.h>
+#include <String.class.h>
#include <WChar.class.h>
class VirtualTerminal : public RessourceCaller {
@@ -15,6 +16,16 @@ class VirtualTerminal : public RessourceCaller {
void writeHex(u32int number) {
doCall(VT_IFACE_WRITEHEX, number);
}
+ void writeDec(s64int number) {
+ doCall(VT_IFACE_WRITEDEC, (number >> 32), number);
+ }
+ void write(String s) {
+ Serialized a = s.serialize();
+ doCall(VT_IFACE_WRITE, a);
+ }
+ String readLine() {
+ return String::unserialize(doCall(VT_IFACE_READLINE));
+ }
void put(WChar c) {
doCall(VT_IFACE_PUT, c);
diff --git a/Source/Library/Userland/Start.cpp b/Source/Library/Userland/Start.cpp
index e185189..639210f 100644
--- a/Source/Library/Userland/Start.cpp
+++ b/Source/Library/Userland/Start.cpp
@@ -18,7 +18,7 @@ extern "C" void start() {
((void (*)(void))*call)();
}
- heap.create(0x40000000, 0x00100000, 0x00003000); //Initially create a 1M heap with 12ko index
+ heap.create(0x40000000, 0x00100000, 0x00004000); //Initially create a 1M heap with 16ko index
u32int r = main();
//Call static destructors
@@ -32,4 +32,5 @@ extern "C" void start() {
namespace Mem {
void* alloc (u32int sz) { return heap.alloc(sz); }
void free(void* ptr) { heap.free(ptr); }
+ void* mkXchgSpace (u32int sz) { return alloc(sz); }
}
diff --git a/Source/Library/Userland/Syscall/RessourceCaller.class.h b/Source/Library/Userland/Syscall/RessourceCaller.class.h
index 3ad8900..3602ef0 100644
--- a/Source/Library/Userland/Syscall/RessourceCaller.class.h
+++ b/Source/Library/Userland/Syscall/RessourceCaller.class.h
@@ -2,6 +2,17 @@
#define DEF_RESSOURCECALLER_CLASS_H
#include <Syscall/Syscall.wtf.h>
+#include <common.h>
+
+class Serialized {
+ private:
+ u32int m_value;
+
+ public:
+ Serialized(u32int v) : m_value(v) {}
+ ~Serialized() { Mem::free( (void*)m_value); }
+ operator u32int () { return m_value; }
+};
class RessourceCaller {
private:
diff --git a/Source/Library/Userland/common.h b/Source/Library/Userland/common.h
index 3508513..6257841 100644
--- a/Source/Library/Userland/common.h
+++ b/Source/Library/Userland/common.h
@@ -10,6 +10,7 @@
namespace Mem {
void* alloc(u32int);
void free(void*);
+ void* mkXchgSpace(u32int sz);
}
//Standard implemenations of operator new/delete