3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
4 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@gmail.com)
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26 #include <net/socket.h>
34 extern task_t
*_curr_task
;
35 void sys_exit (struct regs
*r
)
37 proc_t
*proc
= proc_find (_curr_task
);
42 if (proc
->task
!= _curr_task
)
46 task_t
*task
= proc
->tty
->task
;
51 longjmp (task
->state
, 1);
58 void sys_getch (struct regs
*r
)
60 proc_t
*proc
= proc_find (_curr_task
);
65 if (proc
->task
!= _curr_task
)
68 if (proc
->tty
!= currtty
)
71 unsigned char c
= (unsigned char) getkey ();
76 r
->eax
= (unsigned) &c
;
78 /*unsigned char *where;
79 unsigned char *memptr = (unsigned char *) 0x9045;
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 proc_t
*proc
= proc_find (_curr_task
);
100 if (proc
->task
!= _curr_task
)
103 if (proc
->tty
!= currtty
)
106 tty_putnch (proc
->tty
, r
->ebx
);
109 void sys_color (struct regs
*r
)
111 settextcolor (r
->ebx
, r
->ecx
);
115 void sys_cls (struct regs
*r
)
117 proc_t
*proc
= proc_find (_curr_task
);
122 if (proc
->task
!= _curr_task
)
125 if (proc
->tty
!= currtty
)
128 /* NOTE: Why we should disable interrupts ? Nobody know, but works better */
129 if (int_disable ()) {
135 extern unsigned char scancode
;
136 void sys_getkey (struct regs
*r
)
138 proc_t
*proc
= proc_find (_curr_task
);
143 if (proc
->task
!= _curr_task
)
146 if (proc
->tty
!= currtty
)
149 unsigned char c
= (unsigned char) scancode
;
153 r
->eax
= (unsigned) &c
;
156 void sys_gotoxy (struct regs
*r
)
158 gotoxy (r
->ebx
, r
->ecx
);
161 void sys_fork (struct regs
*r
)
163 unsigned short *where
;
164 unsigned char c
= (unsigned char) fork ();
166 unsigned short *memptr
= (unsigned short *) 0x9000;
171 void sys_schedule (struct regs
*r
)
176 extern kbd_quaue kbd_q
;
177 void sys_write (struct regs
*r
)
179 unsigned len
= r
->ecx
;
180 unsigned fd
= r
->edx
;
182 unsigned char *buf
= (unsigned char *) r
->ebx
;
187 //kprintf ("#buf: 0x%x / '%s'\n", buf, buf);
190 if (!memcpy_to_user (&buf, (char *) r->ebx, len))
200 proc
= proc_find (_curr_task
);
205 if (proc
->task
!= _curr_task
)
208 //if (buf >= proc->data && buf < (proc->data+proc->data_off)) {
209 // kprintf ("Je to staticky retezec :) - 0x%x - '%s'\n", buf+proc->code, buf+proc->code);
212 mem
= (char *) buf
;//vmem_proc_check (proc, buf);
214 //if (proc->tty != currtty)
217 //printf ("data: 0x%x | 0x%x\n", buf, proc->data);
219 //if (!memtest_data (buf, (void *) proc->data, proc->data_off))
220 tty_write (proc
->tty
, (char *) mem
, len
);
222 // tty_write (proc->tty, (char *) buf+proc->code, len);
229 proc
= proc_find (_curr_task
);
234 if (proc
->task
!= _curr_task
)
237 if (len
> KBD_MAX_QUAUE
)
243 for (i
= len
; i
>= 0; i
--) {
245 kbd_q
.state
[kbd_q
.p
] = 1; // down
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;
265 //printf ("yeah, sys_write: '%d' '%s' '0x%x'\n", len, buf, buf);
268 void sys_socket (struct regs
*r
)
270 int ret
= socket (r
->ebx
, r
->ecx
, r
->edx
);
273 int *memptr
= (int *) 0x9000;
278 void sys_connect (struct regs
*r
)
280 sockaddr
*addr
= (sockaddr
*) r
->ebx
;
282 int ret
= connect (r
->ecx
, addr
, r
->edx
);
285 int *memptr
= (int *) 0x9000;
290 void sys_malloc (struct regs
*r
)
292 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
;
315 int ret
= recv ((int) r
->ecx
, (char *) msg
, (unsigned) r
->edx
, 0);
317 //printf ("recv> r->ebx: %d, r->edx: %u, ret: %d\n", (int) r->ecx, (unsigned) r->edx, ret);
320 int *memptr
= (int *) 0x9030;
325 void sys_close (struct regs
*r
)
330 void sys_open (struct regs
*r
)
332 unsigned char *pathname
= (unsigned char *) r
->ebx
;
334 int ret
= open ((char *) pathname
, (unsigned) r
->ecx
);
336 // printf ("%d = sys_open (%s, %u)\n", ret, (char *) pathname, (unsigned) r->ecx);
339 int *memptr
= (int *) 0x9000;
344 void sys_pcspk (struct regs
*r
)
346 dev_t
*dev
= dev_find ("/dev/pcspk");
349 dev
->handler (DEV_ACT_PLAY
, (unsigned) r
->ebx
);
352 void sys_usleep (struct regs
*r
)
354 usleep ((unsigned) r
->ebx
);
357 void sys_read (struct regs
*r
)
359 unsigned fd
= r
->ecx
;
360 unsigned len
= r
->edx
;
362 unsigned char *buf
= (unsigned char *) r
->ebx
;
372 proc
= proc_find (_curr_task
);
377 if (proc
->task
!= _curr_task
)
380 //if (proc->tty != currtty)
383 ret
= tty_read (proc
->tty
, (char *) buf
, len
);
386 ret
= read (fd
, (char *) buf
, len
);
391 int *memptr
= (int *) 0x9000;
396 void sys_time (struct regs
*r
)
398 r
->eax
= (unsigned) rtc_getcurrtime ();
401 void sys_system (struct regs
*r
)
403 unsigned char *cmd
= (unsigned char *) r
->ebx
;
405 command_parser ((char *) cmd
, strlen (cmd
));
408 void sys_chdir (struct regs
*r
)
410 unsigned char *dir
= (unsigned char *) r
->ebx
;
415 void sys_getdir (struct regs
*r
)
417 r
->eax
= (unsigned) vfs_dirent ();
420 void sys_procarg (struct regs
*r
)
422 proc_t
*proc
= proc_find (_curr_task
);
427 if (proc
->task
!= _curr_task
)
432 r
->eax
= (unsigned) proc
->argv
;
435 r
->eax
= (unsigned) proc
->argc
;
442 void sys_signal (struct regs
*r
)
444 signal (r
->ebx
, (sighandler_t
) r
->ecx
);
447 void sys_mount (struct regs
*r
)
449 partition_t
*p
= partition_find ((char *) r
->ebx
);
452 mount (p
, "", (char *) r
->ecx
);
458 void sys_kputs (struct regs
*r
)
462 module_t
*kmod
= module_find (_curr_task
);
467 if (kmod
->task
!= _curr_task
)
470 unsigned char *buf
= (unsigned char *) r
->ebx
;
473 //kprintf ("yeah, sys_kputs: '%s' '0x%x'\n", buf, buf);
478 void sys_bind (struct regs
*r
)
480 int ret
= bind (r
->ecx
, (sockaddr
*) r
->ebx
, r
->edx
);
483 int *memptr
= (int *) 0x9000;
488 void sys_listen (struct regs
*r
)
490 int ret
= listen (r
->ebx
, r
->ecx
);
493 int *memptr
= (int *) 0x9000;
498 void sys_accept (struct regs
*r
)
500 int ret
= accept (r
->ecx
, r
->ebx
, r
->edx
);
503 int *memptr
= (int *) 0x9000;
508 void sys_fcntl (struct regs
*r
)
510 int ret
= fcntl (r
->ebx
, r
->ecx
, r
->edx
);
513 int *memptr
= (int *) 0x9000;
518 extern unsigned char vgagui
;
519 void sys_gvgafb (struct regs
*r
)
521 kprintf ("vgagui: %d\n", vgagui
);
527 r
->eax
= (unsigned) init_vgafb ();
530 void sys_gcls (struct regs
*r
)
535 void sys_gpixel (struct regs
*r
)
537 //gpixel (r->ebx, r->ecx, r->edx);
540 void sys_rs232read (struct regs
*r
)
543 char *memptr
= (char *) 0x9000;
545 *where
= rs232_read ();
548 void sys_rs232write (struct regs
*r
)
550 rs232_write ((char) r
->ebx
);
553 void sys_gttyexit (struct regs
*r
)
555 proc_t
*proc
= proc_find (_curr_task
);
560 if (proc
->task
!= _curr_task
)
563 tty_change (proc
->tty
);
566 void sys_gexit (struct regs
*r
)
571 extern unsigned char vgagui
;
573 void sys_gttyinit (struct regs
*r
)
580 r
->eax
= (unsigned) >ty
->screen
;
583 void sys_mkdir (struct regs
*r
)
585 unsigned char *dir
= (unsigned char *) r
->ebx
;
587 mkdir ((char *) dir
);
590 void sys_free (struct regs
*r
)
592 kfree ((void *) r
->ebx
);
594 DPRINT ("free (): 0x%x\n", r
->ebx
);
597 void sys_realloc (struct regs
*r
)
599 r
->eax
= (unsigned) krealloc ((void *) r
->ebx
, (size_t) r
->ecx
);
601 DPRINT ("realloc (): 0x%x\n", r
->eax
);
604 void sys_gethostbyname (struct regs
*r
)
606 char *buf
= (char *) r
->ebx
;
613 r
->eax
= (unsigned) gethostbyname (buf
);
616 void sys_procmap (struct regs
*r
)
618 proc_t
*proc
= proc_find (_curr_task
);
623 if (proc
->task
!= _curr_task
)
626 proc_vmem_map (proc
);
629 void sys_sendto (struct regs
*r
)
631 /* HACK: bleeh, there is problem with fourth argument,
632 so we need to use another way to getting address */
633 unsigned *addr
= (unsigned *) 0x9020;
635 sockaddr_in
*to
= (sockaddr_in
*) *addr
;
637 int ret
= sendto ((int) r
->ecx
, (char *) r
->ebx
, (unsigned) r
->edx
, 0, to
, 0);
640 int *memptr
= (int *) 0x9000;
645 void sys_recvfrom (struct regs
*r
)
647 unsigned char *msg
= (unsigned char *) r
->ebx
;
649 /* HACK: bleeh, there is problem with fourth argument,
650 so we need to use another way to getting address */
651 unsigned *addr
= (unsigned *) 0x9010;
653 sockaddr_in
*from
= (sockaddr_in
*) *addr
;
655 int ret
= recvfrom ((int) r
->ecx
, (char *) msg
, (unsigned) r
->edx
, 0, from
, 0);
658 int *memptr
= (int *) 0x9000;
663 void sys_getchar (struct regs
*r
)
665 proc_t
*proc
= proc_find (_curr_task
);
668 unsigned char s
= '\n';
670 /* non-blocking mode */
671 if (stdin
->flags
& O_NONBLOCK
) {
675 if (proc
->task
!= _curr_task
)
678 if (proc
->tty
!= currtty
)
681 char c
= (char) getkey ();
689 tty_write (proc
->tty
, &c
, 1);
696 /* blocking - clasical mode */
701 if (proc
->task
!= _curr_task
)
704 if (proc
->tty
!= currtty
)
707 unsigned char c
= (unsigned char) getkey ();
712 if (i
> 0 && c
!= '\b')
713 tty_write (proc
->tty
, &c
, 1);
723 tty_write (proc
->tty
, "\b", 1);
730 r
->eax
= (unsigned) &s
;
733 void syscall_handler (struct regs
*r
)
739 return sys_getch (r
);
741 return sys_sleep (r
);
743 return sys_putch (r
);
745 return sys_color (r
);
749 return sys_getkey (r
);
751 return sys_gotoxy (r
);
755 return sys_schedule (r
);
757 return sys_write (r
);
759 return sys_socket (r
);
761 return sys_connect (r
);
763 return sys_malloc (r
);
769 return sys_close (r
);
773 return sys_pcspk (r
);
775 return sys_usleep (r
);
781 return sys_system (r
);
783 return sys_chdir (r
);
785 return sys_getdir (r
);
787 return sys_procarg (r
);
789 return sys_signal (r
);
791 return sys_mount (r
);
793 return sys_kputs (r
);
797 return sys_listen (r
);
799 return sys_accept (r
);
801 return sys_fcntl (r
);
803 return sys_gvgafb (r
);
807 return sys_gpixel (r
);
809 return sys_rs232read (r
);
811 return sys_rs232write (r
);
813 return sys_gttyexit (r
);
815 return sys_gexit (r
);
817 return sys_gttyinit (r
);
819 return sys_mkdir (r
);
823 return sys_realloc (r
);
825 return sys_gethostbyname (r
);
827 return sys_procmap (r
);
829 return sys_sendto (r
);
831 return sys_recvfrom (r
);
833 return sys_getchar (r
);