summaryrefslogtreecommitdiff
path: root/kernel/syscalls.c
blob: 267c96fec088176d654a4f5b10837df70c6e5665 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#define FOOLOS_MODULE_NAME "syscalls"
#include "lib/buffer/ringbuffer.h"
#include "lib/logger/log.h"
#include "lib/bool/bool.h"
#include "fs/fs.h"
#include "fs/ext2.h"

//
int syscall_write(int file, char *buf, int len)
{
    // ALL output to stdout
    for(int i=0;i<len;i++)
    {
	PutConsoleChar(buf[i],0b1111111111000000);
    }
    return len;
}

int syscall_read(int file, char *buf, int len)
{

    // stdin
    if(file==1)
    {
    
	char c;

	while(1)
	{
	    asm("cli");
	    bool ret=ringbuffer_get(&c);
	    asm("sti");
	    
	    if(ret)
	    {
		*buf=c;
		if(c=='X')return 0;
		return 1;
	    }

	}
    }

}

int syscall_readdir(const char *name,fs_dirent *dirs,int max)
{
    return fs_readdir(name,dirs,max);
}

int syscall_execve(char *name, char **argv, char **env)
{
    ext2_inode_content(EXT2_RAM_ADDRESS,name,0x800000,0x100000);

    // autorun "user-space" prog
    asm("push $0x800000");
    asm("ret");
}