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)
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
27 #include <net/socket.h>
36 extern task_t
*_curr_task
;
38 void sys_exit (struct regs
*r
)
40 task_t
*taskc
= task_find (0);
45 page_dir_switch (taskc
->page_cover
->page_dir
);
47 proc_t
*proc
= proc_find (_curr_task
);
52 task_t
*task
= proc
->tty
->task
;
57 longjmp (task
->state
, 1);
63 void sys_getch (struct regs
*r
)
65 proc_t
*proc
= proc_find (_curr_task
);
70 if (proc
->tty
!= currtty
)
73 unsigned char c
= (unsigned char) getkey ();
78 //r->eax = (unsigned) &c;
80 unsigned char *memptr
= (unsigned char *) 0x905d;
84 extern unsigned long timer_ticks
;
85 void sys_sleep (struct regs
*r
)
87 unsigned long timer_start
= timer_ticks
+ ((unsigned) r
->ebx
* 1000);
89 while (timer_start
> timer_ticks
)
93 void sys_putch (struct regs
*r
)
95 task_t
*taskc
= task_find (0);
100 //page_dir_switch (taskc->page_cover->page_dir);
102 proc_t
*proc
= proc_find (_curr_task
);
109 tty_putnch (proc
->tty
, c
);
111 //page_dir_switch (proc->task->page_cover->page_dir);
114 void sys_color (struct regs
*r
)
116 video_color (r
->ebx
, r
->ecx
);
120 void sys_cls (struct regs
*r
)
122 proc_t
*proc
= proc_find (_curr_task
);
127 if (proc
->tty
!= currtty
)
130 /* NOTE: Why we should disable interrupts ? Nobody know, but works better */
131 if (int_disable ()) {
137 extern unsigned char scancode
;
138 void sys_getkey (struct regs
*r
)
140 proc_t
*proc
= proc_find (_curr_task
);
145 if (proc
->tty
!= currtty
)
148 unsigned char c
= (unsigned char) scancode
;
152 unsigned char *memptr
= (unsigned char *) 0x9060;
156 void sys_gotoxy (struct regs
*r
)
158 proc_t
*proc
= proc_find (_curr_task
);
163 tty_gotoxy (proc
->tty
, r
->ebx
, r
->ecx
);
166 void sys_fork (struct regs
*r
)
168 unsigned short *where
;
169 unsigned char c
= (unsigned char) fork ();
171 unsigned short *memptr
= (unsigned short *) 0x9000;
176 void sys_schedule (struct regs
*r
)
181 extern kbd_quaue kbd_q
;
182 void sys_write (struct regs
*r
)
184 unsigned len
= r
->ecx
;
185 unsigned fd
= r
->edx
;
187 unsigned char *buf
= (unsigned char *) r
->ebx
;
192 // kprintf ("#buf: 0x%x / '%s'\n", buf, buf);
195 if (!memcpy_to_user (&buf, (char *) r->ebx, len))
205 proc
= proc_find (_curr_task
);
212 //if (buf >= proc->data && buf < (proc->data+proc->data_off)) {
213 // kprintf ("Je to staticky retezec :) - 0x%x - '%s'\n", buf+proc->code, buf+proc->code);
216 mem
= (char *) buf
;//vmem_proc_check (proc, buf);
218 //if (proc->tty != currtty)
221 //printf ("data: 0x%x | 0x%x\n", buf, proc->data);
223 //if (!memtest_data (buf, (void *) proc->data, proc->data_off))
224 tty_write (proc
->tty
, (char *) mem
, len
);
226 // tty_write (proc->tty, (char *) buf+proc->code, len);
233 proc
= proc_find (_curr_task
);
240 if (len
> KBD_MAX_QUAUE
)
246 for (i
= len
; i
>= 0; i
--)
254 mem
= (char *) buf
; //vmem_proc_check (proc, buf);
255 //printf ("hehe: 0x%x / '%s' len: %d\n", mem, mem, len);
256 ret
= write (fd
, (char *) mem
, len
);
261 int *memptr
= (int *) 0x9000;
266 void sys_socket (struct regs
*r
)
268 int ret
= socket (r
->ebx
, r
->ecx
, r
->edx
);
271 int *memptr
= (int *) 0x9000;
276 void sys_connect (struct regs
*r
)
278 sockaddr
*addr
= (sockaddr
*) r
->ebx
;
280 int ret
= connect (r
->ecx
, addr
, r
->edx
);
283 int *memptr
= (int *) 0x9000;
288 void sys_malloc (struct regs
*r
)
291 r
->eax
= (unsigned) kmalloc ((int) r
->ebx
);
294 DPRINT ("malloc (): 0x%x\n", r
->eax
);
297 void sys_send (struct regs
*r
)
299 /* char msg[r->edx+1];
300 if (!memcpy_to_user (&msg, (char *) r->ebx, r->edx))
303 int ret
= send ((int) r
->ecx
, (char *) r
->ebx
, (unsigned) r
->edx
, 0);
306 int *memptr
= (int *) 0x9040;
311 void sys_recv (struct regs
*r
)
313 unsigned char *msg
= (unsigned char *) r
->ebx
;
314 unsigned size
= (unsigned) r
->edx
;
315 int fd
= (int) r
->ecx
;
317 int ret
= recv (fd
, (char *) msg
, size
, 0);
320 printf ("recv> r->ebx: %d, r->edx: %u, ret: %d\n", (int) r->ecx, (unsigned) r->edx, ret);
323 //printf ("recv> r->ebx: %d, r->edx: %u, ret: %d\n", (int) r->ecx, (unsigned) r->edx, ret);
325 int *memptr
= (int *) 0x9030;
329 void sys_close (struct regs
*r
)
334 void sys_open (struct regs
*r
)
336 unsigned char *pathname
= (unsigned char *) r
->ebx
;
338 int ret
= open ((char *) pathname
, (unsigned) r
->ecx
);
340 // printf ("%d = sys_open (%s, %u)\n", ret, (char *) pathname, (unsigned) r->ecx);
343 int *memptr
= (int *) 0x9000;
348 void sys_pcspk (struct regs
*r
)
350 dev_t
*dev
= dev_find ("/dev/pcspk");
353 dev
->handler (DEV_ACT_PLAY
, (unsigned) r
->ebx
);
356 void sys_usleep (struct regs
*r
)
358 //unsigned long timer_start = timer_ticks + ((unsigned) r->ebx);
360 //while (timer_start > timer_ticks)
362 usleep ((unsigned) r
->ebx
);
365 void sys_read (struct regs
*r
)
367 unsigned fd
= r
->ecx
;
368 unsigned len
= r
->edx
;
370 unsigned char *buf
= (unsigned char *) r
->ebx
;
380 proc
= proc_find (_curr_task
);
385 //if (proc->tty != currtty)
388 ret
= tty_read (proc
->tty
, (char *) buf
, len
);
391 ret
= read (fd
, (char *) buf
, len
);
396 int *memptr
= (int *) 0x9000;
401 void sys_time (struct regs
*r
)
403 time_t *memptr
= (time_t *) 0x9005;
405 tm
*t
= rtc_getcurrtime ();
408 *memptr
= (time_t) t
->__tm_gmtoff
;
411 void sys_system (struct regs
*r
)
413 task_t
*task
= task_find (0);
418 proc_t
*proc
= proc_find (_curr_task
);
423 task_t
*oldtask
= _curr_task
;
425 page_dir_switch (task
->page_cover
->page_dir
);
427 unsigned char *cmd
= (unsigned char *) r
->ebx
;
429 command_parser ((char *) cmd
, strlen (cmd
));
431 page_dir_switch (oldtask
->page_cover
->page_dir
);
433 /* needed for correct scheduling (when you execute new process, _curr_task is tasj of current tty) */
434 _curr_task
= oldtask
;
440 void sys_chdir (struct regs
*r
)
442 unsigned char *dir
= (unsigned char *) r
->ebx
;
447 void sys_getdir (struct regs
*r
)
449 r
->eax
= (unsigned) vfs_dirent ();
452 void sys_procarg (struct regs
*r
)
454 proc_t
*proc
= proc_find (_curr_task
);
461 r
->eax
= (unsigned) proc
->argv
;
464 r
->eax
= (unsigned) proc
->argc
;
471 void sys_signal (struct regs
*r
)
473 signal (r
->ebx
, (sighandler_t
) r
->ecx
);
476 void sys_mount (struct regs
*r
)
478 partition_t
*p
= partition_find ((char *) r
->ebx
);
481 mount (p
, "", (char *) r
->ecx
);
487 void sys_kputs (struct regs
*r
)
491 module_t
*kmod
= module_find (_curr_task
);
496 if (kmod
->task
!= _curr_task
)
499 unsigned char *buf
= (unsigned char *) r
->ebx
;
502 //kprintf ("yeah, sys_kputs: '%s' '0x%x'\n", buf, buf);
507 void sys_bind (struct regs
*r
)
509 int ret
= bind (r
->ecx
, (sockaddr
*) r
->ebx
, r
->edx
);
512 int *memptr
= (int *) 0x9000;
517 void sys_listen (struct regs
*r
)
519 int ret
= listen (r
->ebx
, r
->ecx
);
522 int *memptr
= (int *) 0x9000;
527 void sys_accept (struct regs
*r
)
529 int ret
= accept (r
->ecx
, r
->ebx
, r
->edx
);
532 int *memptr
= (int *) 0x9000;
537 void sys_fcntl (struct regs
*r
)
539 int ret
= fcntl (r
->ebx
, r
->ecx
, r
->edx
);
542 int *memptr
= (int *) 0x9000;
547 void sys_gvgafb (struct regs
*r
)
549 proc_t
*proc
= proc_find (_curr_task
);
555 printf ("Please start this program in graphical VESA mode\n");
560 unsigned p
= (unsigned) palign ((void *) (proc
->end
- proc
->start
));
562 unsigned *memptr
= (unsigned *) 0x900a;
563 *memptr
= (unsigned) init_vgafb () + p
;
566 void sys_gcls (struct regs
*r
)
571 void sys_gfbswap (struct regs
*r
)
573 proc_t
*proc
= proc_find (_curr_task
);
578 if (proc
->tty
== currtty
)
584 void sys_rs232read (struct regs
*r
)
587 char *memptr
= (char *) 0x9000;
589 *where
= rs232_read ();
592 void sys_rs232write (struct regs
*r
)
594 rs232_write ((char) r
->ebx
);
597 void sys_gttyexit (struct regs
*r
)
599 proc_t
*proc
= proc_find (_curr_task
);
604 tty_change (proc
->tty
);
607 void sys_gexit (struct regs
*r
)
612 extern unsigned char vgagui
;
614 void sys_gttyinit (struct regs
*r
)
616 tty_t
*tty
= gtty_init ();
621 r
->eax
= (unsigned) &tty
->screen
;
624 void sys_mkdir (struct regs
*r
)
626 unsigned char *dir
= (unsigned char *) r
->ebx
;
628 mkdir ((char *) dir
);
631 void sys_free (struct regs
*r
)
635 kfree ((void *) r
->ebx
);
637 DPRINT ("free (): 0x%x\n", r
->ebx
);
642 void sys_realloc (struct regs
*r
)
644 r
->eax
= (unsigned) krealloc ((void *) r
->ebx
, (size_t) r
->ecx
);
646 DPRINT ("realloc (): 0x%x\n", r
->eax
);
649 void sys_gethostbyname (struct regs
*r
)
651 char *buf
= (char *) r
->ebx
;
658 r
->eax
= (unsigned) gethostbyname (buf
);
661 void sys_procmap (struct regs
*r
)
663 proc_t
*proc
= proc_find (_curr_task
);
668 printf ("LOL: '%s'\n", proc
->data
-0x1000);
669 //proc_vmem_map (proc);
672 void sys_sendto (struct regs
*r
)
674 /* HACK: bleeh, there is problem with fourth argument,
675 so we need to use another way to getting address */
676 unsigned *addr
= (unsigned *) 0x9020;
678 sockaddr_in
*to
= (sockaddr_in
*) *addr
;
680 int ret
= sendto ((int) r
->ecx
, (char *) r
->ebx
, (unsigned) r
->edx
, 0, to
, 0);
683 int *memptr
= (int *) 0x9000;
688 void sys_recvfrom (struct regs
*r
)
690 unsigned char *msg
= (unsigned char *) r
->ebx
;
692 /* HACK: bleeh, there is problem with fourth argument,
693 so we need to use another way to getting address */
694 unsigned *addr
= (unsigned *) 0x9010;
696 sockaddr_in
*from
= (sockaddr_in
*) *addr
;
698 int ret
= recvfrom ((int) r
->ecx
, (char *) msg
, (unsigned) r
->edx
, 0, from
, 0);
701 int *memptr
= (int *) 0x9000;
706 void sys_getchar (struct regs
*r
)
708 proc_t
*proc
= proc_find (_curr_task
);
711 unsigned char s
= '\n';
713 int *memptr
= (int *) 0x9064;
715 /* non-blocking mode */
716 if (stdin
->flags
& O_NONBLOCK
) {
720 if (proc
->tty
!= currtty
)
731 tty_write (proc
->tty
, &c
, 1);
738 /* blocking - clasical mode */
743 if (proc
->tty
!= currtty
)
749 if (i
> 0 && c
!= '\b')
750 tty_write (proc
->tty
, &c
, 1);
760 tty_write (proc
->tty
, "\b", 1);
770 void sys_threadopen (struct regs
*r
)
772 void *ptr
= (void *) r
->ebx
;
774 unsigned *memptr
= (unsigned *) 0x9050;
776 unsigned ret
= proc_thread_create (ptr
, (void *) *memptr
);
781 void sys_threadclose (struct regs
*r
)
783 proc_t
*proc
= proc_find (_curr_task
);
788 unsigned *memptr
= (unsigned *) 0x9050;
790 task_t
*task
= _curr_task
;
792 /* free child process thread */
793 *memptr
= proc_thread_destroy (proc
, task
);
795 task
= proc
->tty
->task
;
798 longjmp (task
->state
, 1);
805 void sys_ioctl (struct regs
*r
)
807 void *s
= (void *) r
->ebx
;
808 unsigned id
= r
->ecx
;
811 int ret
= ioctl_call (id
, s
, l
);
816 void sys_getpid (struct regs
*r
)
818 proc_t
*proc
= proc_find (_curr_task
);
823 r
->eax
= (int) &proc
->pid
;
826 void sys_lseek (struct regs
*r
)
829 long offset
= r
->ecx
;
832 long ret
= lseek (fd
, offset
, whence
);
834 long *memptr
= (long *) 0x9006;
840 void syscall_handler (struct regs
*r
)
846 return sys_getch (r
);
848 return sys_sleep (r
);
850 return sys_putch (r
);
852 return sys_color (r
);
856 return sys_getkey (r
);
858 return sys_gotoxy (r
);
862 return sys_schedule (r
);
864 return sys_write (r
);
866 return sys_socket (r
);
868 return sys_connect (r
);
870 return sys_malloc (r
);
876 return sys_close (r
);
880 return sys_pcspk (r
);
882 return sys_usleep (r
);
888 return sys_system (r
);
890 return sys_chdir (r
);
892 return sys_getdir (r
);
894 return sys_procarg (r
);
896 return sys_signal (r
);
898 return sys_mount (r
);
900 return sys_kputs (r
);
904 return sys_listen (r
);
906 return sys_accept (r
);
908 return sys_fcntl (r
);
910 return sys_gvgafb (r
);
914 return sys_gfbswap (r
);
916 return sys_rs232read (r
);
918 return sys_rs232write (r
);
920 return sys_gttyexit (r
);
922 return sys_gexit (r
);
924 return sys_gttyinit (r
);
926 return sys_mkdir (r
);
930 return sys_realloc (r
);
932 return sys_gethostbyname (r
);
934 return sys_procmap (r
);
936 return sys_sendto (r
);
938 return sys_recvfrom (r
);
940 return sys_getchar (r
);
942 return sys_threadopen (r
);
944 return sys_threadclose (r
);
946 return sys_ioctl (r
);
948 return sys_getpid (r
);
950 return sys_lseek (r
);