3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
4 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
5 * Copyright (C) 2009 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
6 * Copyright (C) 2009 Martin 'povik' Poviser (martin.povik@gmail.com)
7 * Copyright (C) 2010 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
9 * This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program. If not, see <http://www.gnu.org/licenses/>.
29 #include <net/socket.h>
39 #include <sound/audio.h>
43 void sys_exit (struct regs
*r
)
45 task_t
*taskc
= task_find (0);
50 page_dir_switch (taskc
->page_cover
->page_dir
);
52 proc_t
*proc
= proc_find (_curr_task
);
57 task_t
*task
= proc
->tty
->task
;
62 longjmp (task
->state
, 1);
68 void sys_getch (struct regs
*r
)
70 proc_t
*proc
= proc_find (_curr_task
);
75 if (proc
->tty
!= currtty
)
78 unsigned char c
= (unsigned char) getkey ();
83 *SYSV_GETCH
= (unsigned) c
;
87 void sys_sleep (struct regs
*r
)
89 unsigned long timer_start
= timer_ticks
+ ((unsigned) r
->ebx
* 1000);
91 while (timer_start
> timer_ticks
)
95 void sys_putch (struct regs
*r
)
97 //page_dir_switch (taskc->page_cover->page_dir);
99 proc_t
*proc
= proc_find (_curr_task
);
106 tty_putnch (proc
->tty
, c
);
108 //page_dir_switch (proc->task->page_cover->page_dir);
111 void sys_color (struct regs
*r
)
113 video_color (r
->ebx
, r
->ecx
);
117 void sys_cls (struct regs
*r
)
119 proc_t
*proc
= proc_find (_curr_task
);
124 if (proc
->tty
!= currtty
)
127 /* NOTE: Why we should disable interrupts ? Nobody know, but works better */
128 if (int_disable ()) {
134 void sys_getkey (struct regs
*r
)
136 proc_t
*proc
= proc_find (_curr_task
);
141 if (proc
->tty
!= currtty
)
144 *SYSV_GETKEY
= (unsigned) scancode
;
149 void sys_gotoxy (struct regs
*r
)
151 proc_t
*proc
= proc_find (_curr_task
);
156 tty_gotoxy (proc
->tty
, r
->ebx
, r
->ecx
);
159 void sys_fork (struct regs
*r
)
161 *SYSV_FORK
= fork ();
164 void sys_schedule (struct regs
*r
)
169 void sys_write (struct regs
*r
)
171 unsigned len
= r
->ecx
;
172 unsigned fd
= r
->edx
;
174 unsigned char *buf
= (unsigned char *) r
->ebx
;
186 proc
= proc_find (_curr_task
);
195 //printf ("data: %s | 0x%x | %d\n", mem, proc->data, len);
197 tty_write (proc
->tty
, (char *) mem
, len
);
203 proc
= proc_find (_curr_task
);
210 if (len
> KBD_MAX_QUAUE
)
216 for (i
= len
; i
>= 0; i
--)
226 ret
= write (fd
, (char *) mem
, len
);
233 void sys_socket (struct regs
*r
)
235 *SYSV_SOCKET
= socket (r
->ebx
, r
->ecx
, r
->edx
);
238 void sys_connect (struct regs
*r
)
240 sockaddr
*addr
= (sockaddr
*) r
->ebx
;
242 *SYSV_CONNECT
= connect (r
->ecx
, addr
, r
->edx
);
245 void sys_malloc (struct regs
*r
)
247 proc_t
*proc
= proc_find (_curr_task
);
250 r
->eax
= (unsigned) umalloc (proc
, (int) r
->ebx
);
253 DPRINT (DBG_SYSCALL
, "malloc (): 0x%x", r
->eax
);
256 void sys_send (struct regs
*r
)
258 *SYSV_SEND
= send ((int) r
->ecx
, (char *) r
->ebx
, (unsigned) r
->edx
, 0);
261 void sys_recv (struct regs
*r
)
263 unsigned char *msg
= (unsigned char *) r
->ebx
;
264 unsigned size
= (unsigned) r
->edx
;
265 int fd
= (int) r
->ecx
;
267 *SYSV_RECV
= recv (fd
, (char *) msg
, size
, 0);
270 void sys_close (struct regs
*r
)
275 void sys_open (struct regs
*r
)
277 *SYSV_OPEN
= open ((char *) r
->ebx
, (unsigned) r
->ecx
);
280 void sys_pcspk (struct regs
*r
)
282 dev_t
*dev
= dev_find ("/dev/pcspk");
285 dev
->handler (DEV_ACT_PLAY
, (unsigned) r
->ebx
);
288 void sys_usleep (struct regs
*r
)
290 //unsigned long timer_start = timer_ticks + ((unsigned) r->ebx);
292 //while (timer_start > timer_ticks)
294 usleep ((unsigned) r
->ebx
);
297 void sys_read (struct regs
*r
)
299 unsigned fd
= r
->ecx
;
300 unsigned len
= r
->edx
;
302 unsigned char *buf
= (unsigned char *) r
->ebx
;
312 proc
= proc_find (_curr_task
);
317 //if (proc->tty != currtty)
320 ret
= tty_read (proc
->tty
, (char *) buf
, len
);
323 ret
= read (fd
, (char *) buf
, len
);
330 void sys_time (struct regs
*r
)
332 time_t *memptr
= (time_t *) SYSV_TIME
;
334 tm
*t
= rtc_getcurrtime ();
337 *memptr
= (time_t) t
->__tm_gmtoff
;
340 void sys_system (struct regs
*r
)
342 proc_t
*proc
= proc_find (_curr_task
);
347 task_t
*oldtask
= _curr_task
;
349 unsigned char *cmd
= (unsigned char *) r
->ebx
;
352 page_dir_switch (task->page_cover->page_dir);
358 command_parser ((char *) cmd
, strlen (cmd
));
360 page_dir_switch (oldtask
->page_cover
->page_dir
);
362 /* needed for correct scheduling (when you execute new process, _curr_task is tasj of current tty) */
363 _curr_task
= oldtask
;
369 void sys_chdir (struct regs
*r
)
371 char *dir
= (unsigned char *) r
->ebx
;
373 *SYSV_CHDIR
= vfs_cd (dir
, strlen (dir
)) ? 0 : -1;
376 void sys_getdir (struct regs
*r
)
378 r
->eax
= (unsigned) vfs_dirent ();
381 void sys_procarg (struct regs
*r
)
383 proc_t
*proc
= proc_find (_curr_task
);
390 r
->eax
= (unsigned) proc
->argv
;
393 r
->eax
= (unsigned) proc
->argc
;
400 void sys_signal (struct regs
*r
)
402 signal (r
->ebx
, (sighandler_t
) r
->ecx
);
405 void sys_mount (struct regs
*r
)
407 partition_t
*p
= partition_find ((char *) r
->ebx
);
410 mount (p
, "", (char *) r
->ecx
);
416 void sys_kputs (struct regs
*r
)
420 module_t
*kmod
= module_find (_curr_task
);
425 if (kmod
->task
!= _curr_task
)
428 unsigned char *buf
= (unsigned char *) r
->ebx
;
431 //kprintf ("yeah, sys_kputs: '%s' '0x%x'\n", buf, buf);
436 void sys_bind (struct regs
*r
)
438 *SYSV_BIND
= bind (r
->ecx
, (sockaddr
*) r
->ebx
, r
->edx
);
441 void sys_listen (struct regs
*r
)
443 *SYSV_LISTEN
= listen (r
->ebx
, r
->ecx
);
446 void sys_accept (struct regs
*r
)
448 *SYSV_ACCEPT
= accept (r
->ecx
, r
->ebx
, r
->edx
);
451 void sys_fcntl (struct regs
*r
)
453 *SYSV_FCNTL
= fcntl (r
->ebx
, r
->ecx
, r
->edx
);
456 void sys_gvgafb (struct regs
*r
)
458 proc_t
*proc
= proc_find (_curr_task
);
464 printf ("Please start this program in graphical VESA mode\n");
469 *SYSV_GVGAFB
= (unsigned) init_vgafb ();
472 void sys_gcls (struct regs
*r
)
477 void sys_gfbswap (struct regs
*r
)
479 proc_t
*proc
= proc_find (_curr_task
);
484 if (proc
->tty
== currtty
)
490 void sys_rs232read (struct regs
*r
)
492 *SYSV_RS232READ
= (int) rs232_read ();
495 void sys_rs232write (struct regs
*r
)
497 rs232_write ((char) r
->ebx
);
500 void sys_gttyexit (struct regs
*r
)
502 proc_t
*proc
= proc_find (_curr_task
);
507 tty_change (proc
->tty
);
510 void sys_gexit (struct regs
*r
)
515 void sys_gttyinit (struct regs
*r
)
517 tty_t
*tty
= gtty_init ();
522 r
->eax
= (unsigned) &tty
->screen
;
525 void sys_getenv (struct regs
*r
)
527 char *name
= (char *) r
->ebx
;
529 char *val
= (char *) env_get (name
);
531 r
->eax
= (unsigned) val
;
534 void sys_free (struct regs
*r
)
536 proc_t
*proc
= proc_find (_curr_task
);
540 ufree (proc
, (void *) r
->ebx
);
542 DPRINT (DBG_SYSCALL
, "free (): 0x%x", r
->ebx
);
547 void sys_realloc (struct regs
*r
)
549 proc_t
*proc
= proc_find (_curr_task
);
553 r
->eax
= (unsigned) urealloc (proc
, (void *) r
->ebx
, (size_t) r
->ecx
);
555 DPRINT (DBG_SYSCALL
, "realloc (): 0x%x", r
->eax
);
560 void sys_gethostbyname (struct regs
*r
)
562 char *buf
= (char *) r
->ebx
;
569 r
->eax
= (unsigned) gethostbyname (buf
);
572 void sys_vfsent (struct regs
*r
)
574 char *pathname
= (char *) r
->ebx
;
576 r
->eax
= (unsigned) vfs_find (pathname
, strlen (pathname
));
579 void sys_sendto (struct regs
*r
)
581 /* HACK: bleeh, there is problem with fourth argument,
582 so we need to use another way to getting address */
583 sockaddr_in
*to
= (sockaddr_in
*) *SYSV_SENDTO
;
585 *SYSV_SENDTO
= sendto ((int) r
->ecx
, (char *) r
->ebx
, (unsigned) r
->edx
, 0, to
, 0);
588 void sys_recvfrom (struct regs
*r
)
590 unsigned char *msg
= (unsigned char *) r
->ebx
;
592 /* HACK: bleeh, there is problem with fourth argument,
593 so we need to use another way to getting address */
594 sockaddr_in
*from
= (sockaddr_in
*) *SYSV_RECVFROM
;
596 *SYSV_RECVFROM
= recvfrom ((int) r
->ecx
, (char *) msg
, (unsigned) r
->edx
, 0, from
, 0);
599 void sys_getchar (struct regs
*r
)
601 proc_t
*proc
= proc_find (_curr_task
);
604 unsigned char s
= '\n';
606 int *memptr
= SYSV_GETCHAR
;
608 /* non-blocking mode */
609 if (stdin
->flags
& O_NONBLOCK
) {
613 if (proc
->tty
!= currtty
)
616 unsigned char c
= getkey ();
623 tty_putnch (proc
->tty
, c
);
630 /* blocking - clasical mode */
635 if (proc
->tty
!= currtty
)
641 if (i
> 0 && c
!= '\b')
642 tty_write (proc
->tty
, &c
, 1);
652 tty_write (proc
->tty
, "\b", 1);
662 void sys_threadopen (struct regs
*r
)
664 void *ptr
= (void *) r
->ebx
;
666 unsigned m
= *SYSV_THREADOPEN
;
668 *SYSV_THREADOPEN
= proc_thread_create (ptr
, (void *) m
);
671 void sys_threadclose (struct regs
*r
)
673 proc_t
*proc
= proc_find (_curr_task
);
678 task_t
*task
= _curr_task
;
680 /* free child process thread */
681 *SYSV_THREADCLOSE
= proc_thread_destroy (proc
, task
);
683 task
= proc
->tty
->task
;
686 longjmp (task
->state
, 1);
692 void sys_ioctl (struct regs
*r
)
694 void *s
= (void *) r
->ebx
;
695 unsigned id
= r
->ecx
;
698 *SYSV_IOCTL
= ioctl_call (id
, s
, l
);
701 void sys_getpid (struct regs
*r
)
703 proc_t
*proc
= proc_find (_curr_task
);
708 r
->eax
= (int) &proc
->pid
;
711 void sys_lseek (struct regs
*r
)
714 long offset
= r
->ecx
;
717 *SYSV_LSEEK
= lseek (fd
, offset
, whence
);
720 void sys_pipe (struct regs
*r
)
722 int *p
= (int *) r
->ebx
;
729 void sys_creat (struct regs
*r
)
731 char *file
= (char *) r
->ebx
;
732 unsigned mode
= r
->ecx
; /* TODO: mode */
738 ret
= (touch (file
) == 1) ? 0 : -1;
745 void sys_mkdir (struct regs
*r
)
747 char *dir
= (char *) r
->ebx
;
748 unsigned mode
= r
->ecx
; /* TODO: mode */
754 ret
= (mkdir (dir
) == 1) ? 0 : -1;
761 void sys_rmdir (struct regs
*r
)
763 char *dir
= (char *) r
->ebx
;
768 ret
= (rm (dir
) == 1) ? 0 : -1;
775 void sys_sndopen (struct regs
*r
)
777 snd_cfg_t
*cfg
= (snd_cfg_t
*) r
->ebx
;
784 r
->eax
= (int) audio_open (cfg
);
787 void sys_sndclose (struct regs
*r
)
789 snd_audio_t
*aud
= (snd_audio_t
*) r
->ebx
;
796 r
->eax
= (int) audio_close (aud
);
799 void sys_sndwrite (struct regs
*r
)
801 snd_audio_t
*aud
= (snd_audio_t
*) r
->ebx
;
802 char *buf
= (char *) r
->ecx
;
803 unsigned len
= (unsigned) r
->edx
;
810 r
->eax
= (int) audio_write (aud
, buf
, len
);
813 void sys_remove (struct regs
*r
)
815 char *file
= (char *) r
->ebx
;
820 ret
= (vfs_rm (file
, strlen (file
)) == 1) ? 0 : -1;
827 void sys_rename (struct regs
*r
)
829 char *file
= (char *) r
->ebx
;
830 char *file2
= (char *) r
->ecx
;
835 if (cp (file
, file2
) != 1)
838 if (!ret
&& rm (file
) != 1)
846 void sys_select (struct regs
*r
)
853 struct timeval
*timeout
;
856 struct select_t
*s
= (struct select_t
*) r
->ebx
;
858 *SYSV_SELECT
= select (s
->nfds
, s
->readfds
, s
->writefds
, s
->exceptfds
, s
->timeout
);
861 void syscall_handler (struct regs
*r
)
867 return sys_getch (r
);
869 return sys_sleep (r
);
871 return sys_putch (r
);
873 return sys_color (r
);
877 return sys_getkey (r
);
879 return sys_gotoxy (r
);
883 return sys_schedule (r
);
885 return sys_write (r
);
887 return sys_socket (r
);
889 return sys_connect (r
);
891 return sys_malloc (r
);
897 return sys_close (r
);
901 return sys_pcspk (r
);
903 return sys_usleep (r
);
909 return sys_system (r
);
911 return sys_chdir (r
);
913 return sys_getdir (r
);
915 return sys_procarg (r
);
917 return sys_signal (r
);
919 return sys_mount (r
);
921 return sys_kputs (r
);
925 return sys_listen (r
);
927 return sys_accept (r
);
929 return sys_fcntl (r
);
931 return sys_gvgafb (r
);
935 return sys_gfbswap (r
);
937 return sys_rs232read (r
);
939 return sys_rs232write (r
);
941 return sys_gttyexit (r
);
943 return sys_gexit (r
);
945 return sys_gttyinit (r
);
947 return sys_getenv (r
);
951 return sys_realloc (r
);
953 return sys_gethostbyname (r
);
955 return sys_vfsent (r
);
957 return sys_sendto (r
);
959 return sys_recvfrom (r
);
961 return sys_getchar (r
);
963 return sys_threadopen (r
);
965 return sys_threadclose (r
);
967 return sys_ioctl (r
);
969 return sys_getpid (r
);
971 return sys_lseek (r
);
975 return sys_creat (r
);
977 return sys_mkdir (r
);
979 return sys_rmdir (r
);
981 return sys_sndopen (r
);
983 return sys_sndclose (r
);
985 return sys_sndwrite (r
);
987 return sys_remove (r
);
989 return sys_rename (r
);
991 return sys_select (r
);