diff options
| -rw-r--r-- | fs/mount.c | 1 | ||||
| -rw-r--r-- | interface/README | 19 | ||||
| -rw-r--r-- | interface/crt0.s | 8 | ||||
| -rw-r--r-- | interface/fs.h | 4 | ||||
| -rw-r--r-- | interface/syscall.h | 2 | ||||
| -rw-r--r-- | interface/syscalls.c | 63 | ||||
| -rw-r--r-- | interface/syscalls.h | 2 | ||||
| -rw-r--r-- | video/compositor.c | 61 |
8 files changed, 97 insertions, 63 deletions
@@ -107,3 +107,4 @@ int mount_read_dir (char *path, fs_dirent *dirs, uint32_t *pos) char *p=get_mount_for_path(path,&m); return m.mount_read_dir(&m,p,dirs,pos); } + diff --git a/interface/README b/interface/README new file mode 100644 index 0000000..199cc8c --- /dev/null +++ b/interface/README @@ -0,0 +1,19 @@ +This files are required for compiling newlib for fool os. +they go into this dir or similar.. + +~/Downloads/newlib-foolos/newlib/libc/sys/foolos + +configure.in +Makefile.am + +syscall.h +syscall.s + +syscalls.h +syscalls.c + +crt0.h +crt0.s + +this should to /usr/include/sys +fs.h -> sys/dirent.h !! required by kernel/userspace and maybe clibrary diff --git a/interface/crt0.s b/interface/crt0.s index 935e5bd..337d51b 100644 --- a/interface/crt0.s +++ b/interface/crt0.s @@ -79,9 +79,12 @@ call main and $-16,%esp sub $4,%esp -push %eax +push %eax // preserve main return value + call _fini //desctructors from .dtors +call _flushing // force stdout flushin + // pop programmm return value pop %eax @@ -89,9 +92,6 @@ pop %eax and $-16,%esp sub $4,%esp -push stdout -call fflush - # push exit code and pass to _exit syscall push %eax call exit diff --git a/interface/fs.h b/interface/fs.h index a6168ae..25d4253 100644 --- a/interface/fs.h +++ b/interface/fs.h @@ -13,7 +13,6 @@ enum FS_FILE_TYPE{ FS_FILE_TYPE_FILE = 2 }; -/* typedef struct fs_dirent_struct { uint32_t mount; //mount identifier @@ -22,8 +21,8 @@ typedef struct fs_dirent_struct char name[255]; }fs_dirent; -*/ +/* typedef struct fs_dirent_struct { uint32_t inode; @@ -32,5 +31,6 @@ typedef struct fs_dirent_struct uint8_t type; char name[256]; }fs_dirent; +*/ #endif diff --git a/interface/syscall.h b/interface/syscall.h index 43a06fd..2cadce4 100644 --- a/interface/syscall.h +++ b/interface/syscall.h @@ -1,7 +1,7 @@ /* * Issue a System Call from Ring 3 / User Space * - * Syscalls Have up to 3 parameters. Unused Parameters are just ignored. + * Accepts up to 3 parameters. * Check syscalls.h for details. */ diff --git a/interface/syscalls.c b/interface/syscalls.c index 7d12002..06846bb 100644 --- a/interface/syscalls.c +++ b/interface/syscalls.c @@ -1,3 +1,5 @@ +#include "syscalls.h" + #include <stdint.h> #include <stdio.h> #include <string.h> @@ -7,8 +9,9 @@ #include <sys/stat.h> #include <sys/termios.h> -#include "fs.h" -#include "syscalls.h" +#include <errno.h> + +// BASICS // // everybody is root uid_t getuid(void) @@ -27,6 +30,20 @@ void sync(void) { } +// set working directory - we simply save this in PWD environment var +int chdir(const char *path) +{ + sprintf(buf,"PWD=%s",path); + putenv(buf); + return 0; // assume success +} + +// get working dir (see chdir) +char* getwd(char *buf) +{ + return getenv("PWD"); +} + // C NEWLIB // // first of all we have a few posix syscalls required by newlib @@ -202,7 +219,7 @@ int write(int file, char *ptr, int len) ////////////////////////////////////////////////////////////////////// -int _readdir(const char *name,fs_dirent *dirs,int max) +int _readdir(const char *name,void *dirs,int max) { return syscall(SYSCALL_READDIR,name,dirs,max); } @@ -222,23 +239,16 @@ int _lstat(const char *file, struct stat *st) return syscall(SYSCALL_LSTAT,file,st,0); } -// EXTRA STUFF - - static struct termios tty1; // only one global terminal managed here... more might/should follow - //TODO : implement this properly +// termios - int tcgetattr(int fd, struct termios *termios_p) + int tcgetattr(int fd, struct termios *termios_p) { - syscall(SYSCALL_UNIMPLEMENTED,"tcgetattr",0,0); - *termios_p=tty1; - return 0; + return syscall(SYSCALL_TCGETATTR,fd,termios_p,0); } int tcsetattr(int fd, int optional_actions, const struct termios *termios_p) { - syscall(SYSCALL_UNIMPLEMENTED,"tcsetattr",0,0); - tty1=*termios_p; - return 0; + return syscall(SYSCALL_TCSETATTR,fd,termios_p,0); } /* @@ -302,15 +312,6 @@ int _lstat(const char *file, struct stat *st) return syscall(SYSCALL_UNIMPLEMENTED,"mkdir",0,0); } - int chdir(const char *path) - { - return syscall(SYSCALL_UNIMPLEMENTED,"chdir",0,0); - } - - char* getwd(char *buf) - { - return syscall(SYSCALL_UNIMPLEMENTED,"getwd",0,0); - } char *ttyname(int fd) { @@ -319,14 +320,15 @@ int _lstat(const char *file, struct stat *st) // - struct dirent *readdir(DIR *dirp) + struct void *readdir(DIR *dirp) // returns dirent { return syscall(SYSCALL_UNIMPLEMENTED,"readdir",0,0); } DIR *opendir(const char *name) { - return syscall(SYSCALL_UNIMPLEMENTED,"opendir",0,0); + errno=EACCES; + return syscall(SYSCALL_UNIMPLEMENTED,"opendir",name,0); } int closedir(DIR *dirp) @@ -432,8 +434,7 @@ int gethostname(char *name, size_t len) ssize_t readlink(const char *pathname, char *buf, size_t bufsiz) { - syscall(SYSCALL_UNIMPLEMENTED,"readlink",0,0); - return 0; + return syscall(SYSCALL_UNIMPLEMENTED,"readlink",pathname,0); } int rmdir(const char *pathname) @@ -468,7 +469,7 @@ int execvp(const char *file, char *const argv[]) long sysconf(int name) { - syscall(SYSCALL_UNIMPLEMENTED,"sysconf",0,0); + return syscall(SYSCALL_UNIMPLEMENTED,"sysconf",name,0); return 0; } @@ -477,3 +478,9 @@ int chmod(const char *pathname, mode_t mode) syscall(SYSCALL_UNIMPLEMENTED,"chmod",0,0); return 0; } + +void _flushing() +{ + fflush(stdout); +} + diff --git a/interface/syscalls.h b/interface/syscalls.h index e758fd9..1595c2d 100644 --- a/interface/syscalls.h +++ b/interface/syscalls.h @@ -26,5 +26,7 @@ #define SYSCALL_GUI_RECT 87 #define SYSCALL_GUI_WIN 88 #define SYSCALL_SELECT 89 +#define SYSCALL_TCGETATTR 90 +#define SYSCALL_TCSETATTR 91 #define SYSCALL_UNIMPLEMENTED 255 diff --git a/video/compositor.c b/video/compositor.c index 3751c05..645900e 100644 --- a/video/compositor.c +++ b/video/compositor.c @@ -349,43 +349,48 @@ double sqroot(double n){ void compositor_set_background(char *ppm_raw_filename) { -// uint64_t t=timer_get_ms()/333; - /* - klog("loading bg..."); - fd bg=mount_file_open(ppm_raw_filename); - - uint32_t i=0; + // TODO: think about funny things to do with timer and update + // some generated / or modified bg regularly // + // uint64_t t=timer_get_ms()/333; // - for(int y=0;y<vesa_width;y++) + if(ppm_raw_filename!=0) { - for(int x=0;x<vesa_height;x++) + klog("loading bg..."); + fd bg=mount_file_open(ppm_raw_filename); + + uint32_t i=0; + + for(int y=0;y<vesa_width;y++) { - bgimage[i]=(fd_read(&bg)<<16)+(fd_read(&bg)<<8)+fd_read(&bg); - backbuffer[i]=bgimage[i]; - i++; + for(int x=0;x<vesa_height;x++) + { + bgimage[i]=(fd_read(&bg)<<16)+(fd_read(&bg)<<8)+fd_read(&bg); + backbuffer[i]=bgimage[i]; + i++; + } } - } - - klog("finished"); - */ - int center_x=vesa_width/2; - int center_y=vesa_height/2; + klog("finished"); + } + else + { + int center_x=vesa_width/2; + int center_y=vesa_height/2; - int max_dist = center_x*center_x+center_y*center_y; + int max_dist = center_x*center_x+center_y*center_y; - for(int x=0;x<vesa_width;x++) - { - for(int y=0;y<vesa_height;y++) + for(int x=0;x<vesa_width;x++) { - int diffx=center_x-x; - int diffy=center_y-y; - int dist=diffx*diffx+diffy*diffy; - int val = 0xff*dist/max_dist; + for(int y=0;y<vesa_height;y++) + { + int diffx=center_x-x; + int diffy=center_y-y; + int dist=diffx*diffx+diffy*diffy; + int val = 0xff*dist/max_dist; - bgimage[x+y*vesa_width]=val; - //backbuffer[x+y*vesa_width]=valr<<16; + bgimage[x+y*vesa_width]=val; + //backbuffer[x+y*vesa_width]=valr<<16; + } } } - } |
