3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
4 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
5 * Copyright (C) 2009 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
6 * Copyright (C) 2009 Martin 'povik' Poviser (martin.povik@gmail.com)
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
28 #include <net/socket.h>
39 extern task_t
*_curr_task
;
41 void sys_exit (struct regs
*r
)
43 task_t
*taskc
= task_find (0);
48 page_dir_switch (taskc
->page_cover
->page_dir
);
50 proc_t
*proc
= proc_find (_curr_task
);
55 task_t
*task
= proc
->tty
->task
;
60 longjmp (task
->state
, 1);
66 void sys_getch (struct regs
*r
)
68 proc_t
*proc
= proc_find (_curr_task
);
73 if (proc
->tty
!= currtty
)
76 unsigned char c
= (unsigned char) getkey ();
81 //r->eax = (unsigned) &c;
83 unsigned char *memptr
= (unsigned char *) 0x905d;
87 extern unsigned long timer_ticks
;
88 void sys_sleep (struct regs
*r
)
90 unsigned long timer_start
= timer_ticks
+ ((unsigned) r
->ebx
* 1000);
92 while (timer_start
> timer_ticks
)
96 void sys_putch (struct regs
*r
)
98 task_t
*taskc
= task_find (0);
103 //page_dir_switch (taskc->page_cover->page_dir);
105 proc_t
*proc
= proc_find (_curr_task
);
112 tty_putnch (proc
->tty
, c
);
114 //page_dir_switch (proc->task->page_cover->page_dir);
117 void sys_color (struct regs
*r
)
119 video_color (r
->ebx
, r
->ecx
);
123 void sys_cls (struct regs
*r
)
125 proc_t
*proc
= proc_find (_curr_task
);
130 if (proc
->tty
!= currtty
)
133 /* NOTE: Why we should disable interrupts ? Nobody know, but works better */
134 if (int_disable ()) {
140 extern unsigned char scancode
;
141 void sys_getkey (struct regs
*r
)
143 proc_t
*proc
= proc_find (_curr_task
);
148 if (proc
->tty
!= currtty
)
151 unsigned char c
= (unsigned char) scancode
;
155 unsigned char *memptr
= (unsigned char *) 0x9060;
159 void sys_gotoxy (struct regs
*r
)
161 proc_t
*proc
= proc_find (_curr_task
);
166 tty_gotoxy (proc
->tty
, r
->ebx
, r
->ecx
);
169 void sys_fork (struct regs
*r
)
171 unsigned short *where
;
172 unsigned char c
= (unsigned char) fork ();
174 unsigned short *memptr
= (unsigned short *) 0x9000;
179 void sys_schedule (struct regs
*r
)
184 extern kbd_quaue kbd_q
;
185 void sys_write (struct regs
*r
)
187 unsigned len
= r
->ecx
;
188 unsigned fd
= r
->edx
;
190 unsigned char *buf
= (unsigned char *) r
->ebx
;
195 // kprintf ("#buf: 0x%x / '%s'\n", buf, buf);
198 if (!memcpy_to_user (&buf, (char *) r->ebx, len))
208 proc
= proc_find (_curr_task
);
215 //if (buf >= proc->data && buf < (proc->data+proc->data_off)) {
216 // kprintf ("Je to staticky retezec :) - 0x%x - '%s'\n", buf+proc->code, buf+proc->code);
219 mem
= (char *) buf
;//vmem_proc_check (proc, buf);
221 //if (proc->tty != currtty)
224 //printf ("data: 0x%x | 0x%x\n", buf, proc->data);
226 //if (!memtest_data (buf, (void *) proc->data, proc->data_off))
227 tty_write (proc
->tty
, (char *) mem
, len
);
229 // tty_write (proc->tty, (char *) buf+proc->code, len);
236 proc
= proc_find (_curr_task
);
243 if (len
> KBD_MAX_QUAUE
)
249 for (i
= len
; i
>= 0; i
--)
258 //printf ("hehe: 0x%x / '%s' len: %d\n", mem, mem, len);
259 ret
= write (fd
, (char *) mem
, len
);
263 int *memptr
= (int *) 0x9000;
267 void sys_socket (struct regs
*r
)
269 int ret
= socket (r
->ebx
, r
->ecx
, r
->edx
);
271 int *memptr
= (int *) 0x9000;
275 void sys_connect (struct regs
*r
)
277 sockaddr
*addr
= (sockaddr
*) r
->ebx
;
279 int ret
= connect (r
->ecx
, addr
, r
->edx
);
281 int *memptr
= (int *) 0x9000;
285 void sys_malloc (struct regs
*r
)
287 proc_t
*proc
= proc_find (_curr_task
);
290 r
->eax
= (unsigned) umalloc (proc
, (int) r
->ebx
);
293 DPRINT ("malloc (): 0x%x", r
->eax
);
296 void sys_send (struct regs
*r
)
298 /* char msg[r->edx+1];
299 if (!memcpy_to_user (&msg, (char *) r->ebx, r->edx))
302 int ret
= send ((int) r
->ecx
, (char *) r
->ebx
, (unsigned) r
->edx
, 0);
304 int *memptr
= (int *) 0x9000;
308 void sys_recv (struct regs
*r
)
310 unsigned char *msg
= (unsigned char *) r
->ebx
;
311 unsigned size
= (unsigned) r
->edx
;
312 int fd
= (int) r
->ecx
;
314 int ret
= recv (fd
, (char *) msg
, size
, 0);
317 printf ("recv> r->ebx: %d, r->edx: %u, ret: %d\n", (int) r->ecx, (unsigned) r->edx, ret);
320 //printf ("recv> r->ebx: %d, r->edx: %u, ret: %d\n", (int) r->ecx, (unsigned) r->edx, ret);
322 int *memptr
= (int *) 0x9030;
326 void sys_close (struct regs
*r
)
331 void sys_open (struct regs
*r
)
333 unsigned char *pathname
= (unsigned char *) r
->ebx
;
335 int ret
= open ((char *) pathname
, (unsigned) r
->ecx
);
337 // printf ("%d = sys_open (%s, %u)\n", ret, (char *) pathname, (unsigned) r->ecx);
339 int *memptr
= (int *) 0x9000;
343 void sys_pcspk (struct regs
*r
)
345 dev_t
*dev
= dev_find ("/dev/pcspk");
348 dev
->handler (DEV_ACT_PLAY
, (unsigned) r
->ebx
);
351 void sys_usleep (struct regs
*r
)
353 //unsigned long timer_start = timer_ticks + ((unsigned) r->ebx);
355 //while (timer_start > timer_ticks)
357 usleep ((unsigned) r
->ebx
);
360 void sys_read (struct regs
*r
)
362 unsigned fd
= r
->ecx
;
363 unsigned len
= r
->edx
;
365 unsigned char *buf
= (unsigned char *) r
->ebx
;
375 proc
= proc_find (_curr_task
);
380 //if (proc->tty != currtty)
383 ret
= tty_read (proc
->tty
, (char *) buf
, len
);
386 ret
= read (fd
, (char *) buf
, len
);
390 int *memptr
= (int *) 0x9000;
394 void sys_time (struct regs
*r
)
396 time_t *memptr
= (time_t *) 0x9005;
398 tm
*t
= rtc_getcurrtime ();
401 *memptr
= (time_t) t
->__tm_gmtoff
;
404 void sys_system (struct regs
*r
)
406 task_t
*task
= task_find (0);
411 proc_t
*proc
= proc_find (_curr_task
);
416 task_t
*oldtask
= _curr_task
;
418 page_dir_switch (task
->page_cover
->page_dir
);
420 unsigned char *cmd
= (unsigned char *) r
->ebx
;
422 command_parser ((char *) cmd
, strlen (cmd
));
424 page_dir_switch (oldtask
->page_cover
->page_dir
);
426 /* needed for correct scheduling (when you execute new process, _curr_task is tasj of current tty) */
427 _curr_task
= oldtask
;
433 void sys_chdir (struct regs
*r
)
435 unsigned char *dir
= (unsigned char *) r
->ebx
;
440 void sys_getdir (struct regs
*r
)
442 r
->eax
= (unsigned) vfs_dirent ();
445 void sys_procarg (struct regs
*r
)
447 proc_t
*proc
= proc_find (_curr_task
);
454 r
->eax
= (unsigned) proc
->argv
;
457 r
->eax
= (unsigned) proc
->argc
;
464 void sys_signal (struct regs
*r
)
466 signal (r
->ebx
, (sighandler_t
) r
->ecx
);
469 void sys_mount (struct regs
*r
)
471 partition_t
*p
= partition_find ((char *) r
->ebx
);
474 mount (p
, "", (char *) r
->ecx
);
480 void sys_kputs (struct regs
*r
)
484 module_t
*kmod
= module_find (_curr_task
);
489 if (kmod
->task
!= _curr_task
)
492 unsigned char *buf
= (unsigned char *) r
->ebx
;
495 //kprintf ("yeah, sys_kputs: '%s' '0x%x'\n", buf, buf);
500 void sys_bind (struct regs
*r
)
502 int ret
= bind (r
->ecx
, (sockaddr
*) r
->ebx
, r
->edx
);
504 int *memptr
= (int *) 0x9000;
508 void sys_listen (struct regs
*r
)
510 int ret
= listen (r
->ebx
, r
->ecx
);
512 int *memptr
= (int *) 0x9000;
516 void sys_accept (struct regs
*r
)
518 int ret
= accept (r
->ecx
, r
->ebx
, r
->edx
);
520 int *memptr
= (int *) 0x9000;
524 void sys_fcntl (struct regs
*r
)
526 int ret
= fcntl (r
->ebx
, r
->ecx
, r
->edx
);
528 int *memptr
= (int *) 0x9000;
532 void sys_gvgafb (struct regs
*r
)
534 proc_t
*proc
= proc_find (_curr_task
);
540 printf ("Please start this program in graphical VESA mode\n");
545 unsigned *memptr
= (unsigned *) 0x900a;
546 *memptr
= (unsigned) init_vgafb ();
549 void sys_gcls (struct regs
*r
)
554 void sys_gfbswap (struct regs
*r
)
556 proc_t
*proc
= proc_find (_curr_task
);
561 if (proc
->tty
== currtty
)
567 void sys_rs232read (struct regs
*r
)
569 char *memptr
= (char *) 0x9000;
570 *memptr
= rs232_read ();
573 void sys_rs232write (struct regs
*r
)
575 rs232_write ((char) r
->ebx
);
578 void sys_gttyexit (struct regs
*r
)
580 proc_t
*proc
= proc_find (_curr_task
);
585 tty_change (proc
->tty
);
588 void sys_gexit (struct regs
*r
)
593 extern unsigned char vgagui
;
595 void sys_gttyinit (struct regs
*r
)
597 tty_t
*tty
= gtty_init ();
602 r
->eax
= (unsigned) &tty
->screen
;
605 void sys_free (struct regs
*r
)
607 proc_t
*proc
= proc_find (_curr_task
);
611 ufree (proc
, (void *) r
->ebx
);
613 DPRINT ("free (): 0x%x", r
->ebx
);
618 void sys_realloc (struct regs
*r
)
620 proc_t
*proc
= proc_find (_curr_task
);
624 r
->eax
= (unsigned) urealloc (proc
, (void *) r
->ebx
, (size_t) r
->ecx
);
626 DPRINT ("realloc (): 0x%x", r
->eax
);
631 void sys_gethostbyname (struct regs
*r
)
633 char *buf
= (char *) r
->ebx
;
640 r
->eax
= (unsigned) gethostbyname (buf
);
643 void sys_procmap (struct regs
*r
)
645 proc_t
*proc
= proc_find (_curr_task
);
650 printf ("LOL: '%s'\n", proc
->data
-0x1000);
651 //proc_vmem_map (proc);
654 void sys_sendto (struct regs
*r
)
656 /* HACK: bleeh, there is problem with fourth argument,
657 so we need to use another way to getting address */
658 unsigned *addr
= (unsigned *) 0x9020;
660 sockaddr_in
*to
= (sockaddr_in
*) *addr
;
662 int ret
= sendto ((int) r
->ecx
, (char *) r
->ebx
, (unsigned) r
->edx
, 0, to
, 0);
664 int *memptr
= (int *) 0x9000;
668 void sys_recvfrom (struct regs
*r
)
670 unsigned char *msg
= (unsigned char *) r
->ebx
;
672 /* HACK: bleeh, there is problem with fourth argument,
673 so we need to use another way to getting address */
674 unsigned *addr
= (unsigned *) 0x9010;
676 sockaddr_in
*from
= (sockaddr_in
*) *addr
;
678 int ret
= recvfrom ((int) r
->ecx
, (char *) msg
, (unsigned) r
->edx
, 0, from
, 0);
680 int *memptr
= (int *) 0x9000;
684 void sys_getchar (struct regs
*r
)
686 proc_t
*proc
= proc_find (_curr_task
);
689 unsigned char s
= '\n';
691 int *memptr
= (int *) 0x9064;
693 /* non-blocking mode */
694 if (stdin
->flags
& O_NONBLOCK
) {
698 if (proc
->tty
!= currtty
)
701 unsigned char c
= getkey ();
708 tty_putnch (proc
->tty
, c
);
715 /* blocking - clasical mode */
720 if (proc
->tty
!= currtty
)
726 if (i
> 0 && c
!= '\b')
727 tty_write (proc
->tty
, &c
, 1);
737 tty_write (proc
->tty
, "\b", 1);
747 void sys_threadopen (struct regs
*r
)
749 void *ptr
= (void *) r
->ebx
;
751 unsigned *memptr
= (unsigned *) 0x9050;
753 unsigned ret
= proc_thread_create (ptr
, (void *) *memptr
);
758 void sys_threadclose (struct regs
*r
)
760 proc_t
*proc
= proc_find (_curr_task
);
765 unsigned *memptr
= (unsigned *) 0x9050;
767 task_t
*task
= _curr_task
;
769 /* free child process thread */
770 *memptr
= proc_thread_destroy (proc
, task
);
772 task
= proc
->tty
->task
;
775 longjmp (task
->state
, 1);
782 void sys_ioctl (struct regs
*r
)
784 void *s
= (void *) r
->ebx
;
785 unsigned id
= r
->ecx
;
788 int ret
= ioctl_call (id
, s
, l
);
793 void sys_getpid (struct regs
*r
)
795 proc_t
*proc
= proc_find (_curr_task
);
800 r
->eax
= (int) &proc
->pid
;
803 void sys_lseek (struct regs
*r
)
806 long offset
= r
->ecx
;
809 long ret
= lseek (fd
, offset
, whence
);
811 long *memptr
= (long *) 0x9006;
816 void sys_pipe (struct regs
*r
)
818 int *p
= (int *) r
->ebx
;
825 void sys_creat (struct regs
*r
)
827 char *file
= (char *) r
->ebx
;
828 unsigned mode
= r
->ecx
; /* TODO: mode */
834 ret
= (touch (file
) == 1) ? 0 : -1;
841 void sys_mkdir (struct regs
*r
)
843 char *dir
= (char *) r
->ebx
;
844 unsigned mode
= r
->ecx
; /* TODO: mode */
850 ret
= (mkdir (dir
) == 1) ? 0 : -1;
857 void sys_rmdir (struct regs
*r
)
859 char *dir
= (char *) r
->ebx
;
864 ret
= (rm (dir
) == 1) ? 0 : -1;
871 void syscall_handler (struct regs
*r
)
877 return sys_getch (r
);
879 return sys_sleep (r
);
881 return sys_putch (r
);
883 return sys_color (r
);
887 return sys_getkey (r
);
889 return sys_gotoxy (r
);
893 return sys_schedule (r
);
895 return sys_write (r
);
897 return sys_socket (r
);
899 return sys_connect (r
);
901 return sys_malloc (r
);
907 return sys_close (r
);
911 return sys_pcspk (r
);
913 return sys_usleep (r
);
919 return sys_system (r
);
921 return sys_chdir (r
);
923 return sys_getdir (r
);
925 return sys_procarg (r
);
927 return sys_signal (r
);
929 return sys_mount (r
);
931 return sys_kputs (r
);
935 return sys_listen (r
);
937 return sys_accept (r
);
939 return sys_fcntl (r
);
941 return sys_gvgafb (r
);
945 return sys_gfbswap (r
);
947 return sys_rs232read (r
);
949 return sys_rs232write (r
);
951 return sys_gttyexit (r
);
953 return sys_gexit (r
);
955 return sys_gttyinit (r
);
961 return sys_realloc (r
);
963 return sys_gethostbyname (r
);
965 return sys_procmap (r
);
967 return sys_sendto (r
);
969 return sys_recvfrom (r
);
971 return sys_getchar (r
);
973 return sys_threadopen (r
);
975 return sys_threadclose (r
);
977 return sys_ioctl (r
);
979 return sys_getpid (r
);
981 return sys_lseek (r
);
985 return sys_creat (r
);
987 return sys_mkdir (r
);
989 return sys_rmdir (r
);