3 * Copyright (C) 2007 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
4 * Copyright (C) 2008 Tomas 'ZeXx86' Jedrzejek (zexx86@zexos.org)
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 unsigned att
= sattrib
<< 8;
61 unsigned short *where
;
63 unsigned char c
= (unsigned char) getkey ();
69 unsigned short *memptr
= (unsigned short *) 0x9000;
75 void sys_sleep (struct regs
*r
)
77 timer_wait (1000 * (unsigned) r
->r9
);
80 void sys_putch (struct regs
*r
)
82 proc_t
*proc
= proc_find (_curr_task
);
87 if (proc
->task
!= _curr_task
)
90 if (proc
->tty
!= currtty
)
93 tty_putnch (proc
->tty
, r
->r9
);
96 void sys_color (struct regs
*r
)
98 settextcolor (r
->r9
, r
->r10
);
102 void sys_cls (struct regs
*r
)
104 proc_t
*proc
= proc_find (_curr_task
);
109 if (proc
->task
!= _curr_task
)
112 if (proc
->tty
!= currtty
)
120 extern unsigned char scancode
;
121 void sys_getkey (struct regs
*r
)
123 proc_t
*proc
= proc_find (_curr_task
);
128 if (proc
->task
!= _curr_task
)
131 if (proc
->tty
!= currtty
)
134 unsigned att
= sattrib
<< 8;
135 unsigned short *where
;
136 unsigned char c
= (unsigned char) scancode
;
140 unsigned short *memptr
= (unsigned short *) 0x9000;
145 void sys_gotoxy (struct regs
*r
)
147 gotoxy (r
->r9
, r
->r10
);
150 void sys_fork (struct regs
*r
)
152 unsigned att
= sattrib
<< 8;
153 unsigned short *where
;
154 unsigned char c
= (unsigned char) fork ();
156 unsigned short *memptr
= (unsigned short *) 0x9000;
161 void sys_schedule (struct regs
*r
)
166 extern kbd_quaue kbd_q
;
167 void sys_write (struct regs
*r
)
169 unsigned len
= r
->r10
;
170 unsigned fd
= r
->r11
;
172 unsigned char *buf
= (unsigned char *) r
->r9
;
177 //kprintf ("#buf: 0x%x / '%s'\n", buf, buf);
180 if (!memcpy_to_user (&buf, (char *) r->r9, len))
189 proc
= proc_find (_curr_task
);
194 if (proc
->task
!= _curr_task
)
197 //if (proc->tty != currtty)
200 //printf ("data: 0x%x | 0x%x | 0x%x\n", buf, proc->data, proc->data_off);
201 //printf ("hehe: 0x%x+0x%x / '%s' len: %d\n", buf+proc->code, proc->data_off, buf+proc->code, len);
202 //if (!memtest_data (buf, (void *) proc->data, proc->data_off))
203 tty_write (proc
->tty
, (char *) buf
, len
);
205 // tty_write (proc->tty, (char *) buf+proc->code, len);
210 proc
= proc_find (_curr_task
);
215 if (proc
->task
!= _curr_task
)
218 if (len
> KBD_MAX_QUAUE
)
222 for (i
= len
; i
>= 0; i
--) {
224 kbd_q
.state
[kbd_q
.p
] = 1; // down
233 ret
= write (fd
, (char *) buf
, len
);
238 int *memptr
= (int *) 0x9000;
242 //printf ("yeah, sys_write: '%d' '%s' '0x%x'\n", len, buf, buf);
245 void sys_socket (struct regs
*r
)
247 int ret
= socket (r
->r9
, r
->r10
, r
->r11
);
250 int *memptr
= (int *) 0x9000;
255 void sys_connect (struct regs
*r
)
257 sockaddr_in
*addr
= (sockaddr_in
*) r
->r9
;
259 /*if (!memtest_data (addr, (void *) proc->data, proc->data_off))
260 tty_write (proc->tty, (char *) buf, len);
262 // printf ("hehe: 0x%x+0x%x / '%s' len: %d\n", buf+proc->code, proc->data_off, buf+proc->code, len);
263 tty_write (proc->tty, (char *) buf+proc->code, len);
265 //printf ("adresa mem: %s - 0x%x\n", addr->sin_addr, addr);
266 int ret
= connect (r
->r10
, addr
, r
->r11
);
269 int *memptr
= (int *) 0x9000;
274 void sys_malloc (struct regs
*r
)
276 r
->r8
= (unsigned) malloc ((int) r
->r9
);
278 DPRINT ("malloc (): 0x%x\n", r
->r8
);
281 void sys_send (struct regs
*r
)
283 /* char msg[r->r11+1];
284 if (!memcpy_to_user (&msg, (char *) r->r9, r->r11))
287 int ret
= send ((int) r
->r10
, (char *) r
->r9
, (unsigned) r
->r11
, 0);
290 int *memptr
= (int *) 0x9000;
295 void sys_recv (struct regs
*r
)
297 unsigned char *msg
= (unsigned char *) r
->r9
;
299 int ret
= recv ((int) r
->r10
, (char *) msg
, (unsigned) r
->r11
, 0);
301 // printf ("recv> r->r9: %d, r->r11: %u, ret: %d\n", (int) r->r9, (unsigned) r->r11, ret);
304 int *memptr
= (int *) 0x9000;
309 void sys_close (struct regs
*r
)
314 void sys_open (struct regs
*r
)
316 unsigned char *pathname
= (unsigned char *) r
->r9
;
318 int ret
= open ((char *) pathname
, (unsigned) r
->r10
);
320 // printf ("%d = sys_open (%s, %u)\n", ret, (char *) pathname, (unsigned) r->r10);
323 int *memptr
= (int *) 0x9000;
328 void sys_pcspk (struct regs
*r
)
330 dev_t
*dev
= dev_find ("/dev/pcspk");
333 dev
->handler (DEV_ACT_PLAY
, (unsigned) r
->r9
);
336 void sys_usleep (struct regs
*r
)
338 usleep ((unsigned) r
->r9
);
341 void sys_read (struct regs
*r
)
343 unsigned fd
= r
->r10
;
344 unsigned len
= r
->r11
;
346 unsigned char *buf
= (unsigned char *) r
->r9
;
356 proc
= proc_find (_curr_task
);
361 if (proc
->task
!= _curr_task
)
364 //if (proc->tty != currtty)
367 ret
= tty_read (proc
->tty
, (char *) buf
, len
);
370 ret
= read (fd
, (char *) buf
, len
);
375 int *memptr
= (int *) 0x9000;
380 void sys_time (struct regs
*r
)
382 r
->r8
= (unsigned) rtc_getcurrtime ();
385 void sys_system (struct regs
*r
)
387 unsigned char *cmd
= (unsigned char *) r
->r9
;
389 command_parser ((char *) cmd
, strlen (cmd
));
392 void sys_chdir (struct regs
*r
)
394 unsigned char *dir
= (unsigned char *) r
->r9
;
399 void sys_getdir (struct regs
*r
)
401 r
->r8
= (unsigned) &dir
;
404 void sys_procarg (struct regs
*r
)
406 proc_t
*proc
= proc_find (_curr_task
);
411 if (proc
->task
!= _curr_task
)
416 r
->r8
= (unsigned) proc
->argv
;
419 r
->r8
= (unsigned) proc
->argc
;
426 void sys_signal (struct regs
*r
)
428 signal (r
->r9
, (sighandler_t
) r
->r10
);
431 void sys_mount (struct regs
*r
)
433 partition_t
*p
= partition_find ((char *) r
->r9
);
436 mount (p
, "", (char *) r
->r10
);
442 void sys_kputs (struct regs
*r
)
446 module_t
*kmod
= module_find (_curr_task
);
451 if (kmod
->task
!= _curr_task
)
454 unsigned char *buf
= (unsigned char *) r
->r9
;
457 //kprintf ("yeah, sys_kputs: '%s' '0x%x'\n", buf, buf);
462 void sys_bind (struct regs
*r
)
464 int ret
= bind (r
->r10
, r
->r9
, r
->r11
);
467 int *memptr
= (int *) 0x9000;
472 void sys_listen (struct regs
*r
)
474 int ret
= listen (r
->r9
, r
->r10
);
477 int *memptr
= (int *) 0x9000;
482 void sys_accept (struct regs
*r
)
484 int ret
= accept (r
->r10
, r
->r9
, r
->r11
);
487 int *memptr
= (int *) 0x9000;
492 void sys_fcntl (struct regs
*r
)
494 int ret
= fcntl (r
->r9
, r
->r10
, r
->r11
);
497 int *memptr
= (int *) 0x9000;
502 void sys_gvgafb (struct regs
*r
)
504 r
->r8
= (unsigned) init_vgafb ();
507 void sys_gcls (struct regs
*r
)
512 void sys_gpixel (struct regs
*r
)
514 gpixel (r
->r9
, r
->r10
, r
->r11
);
517 void sys_rs232read (struct regs
*r
)
520 char *memptr
= (char *) 0x9000;
522 *where
= rs232_read ();
525 void sys_rs232write (struct regs
*r
)
527 rs232_write ((char) r
->r9
);
530 void sys_gttyexit (struct regs
*r
)
532 proc_t
*proc
= proc_find (_curr_task
);
537 if (proc
->task
!= _curr_task
)
540 tty_change (proc
->tty
);
543 void sys_gexit (struct regs
*r
)
548 extern unsigned char vgagui
;
550 void sys_gttyinit (struct regs
*r
)
557 r
->r8
= (unsigned) >ty
->screen
;
560 void sys_mkdir (struct regs
*r
)
562 unsigned char *dir
= (unsigned char *) r
->r9
;
564 mkdir ((char *) dir
);
567 void sys_free (struct regs
*r
)
569 free ((void *) r
->r9
);
571 DPRINT ("free (): 0x%x\n", r
->r9
);
574 void sys_realloc (struct regs
*r
)
576 r
->r8
= (unsigned) realloc ((void *) r
->r9
, (size_t) r
->r10
);
578 DPRINT ("realloc (): 0x%x\n", r
->r8
);
581 void syscall_handler (struct regs
*r
)
587 return sys_getch (r
);
589 return sys_sleep (r
);
591 return sys_putch (r
);
593 return sys_color (r
);
597 return sys_getkey (r
);
599 return sys_gotoxy (r
);
603 return sys_schedule (r
);
605 return sys_write (r
);
607 return sys_socket (r
);
609 return sys_connect (r
);
611 return sys_malloc (r
);
617 return sys_close (r
);
621 return sys_pcspk (r
);
623 return sys_usleep (r
);
629 return sys_system (r
);
631 return sys_chdir (r
);
633 return sys_getdir (r
);
635 return sys_procarg (r
);
637 return sys_signal (r
);
639 return sys_mount (r
);
641 return sys_kputs (r
);
645 return sys_listen (r
);
647 return sys_accept (r
);
649 return sys_fcntl (r
);
651 return sys_gvgafb (r
);
655 return sys_gpixel (r
);
657 return sys_rs232read (r
);
659 return sys_rs232write (r
);
661 return sys_gttyexit (r
);
663 return sys_gexit (r
);
665 return sys_gttyinit (r
);
667 return sys_mkdir (r
);
671 return sys_realloc (r
);