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>
37 extern task_t
*_curr_task
;
39 void sys_exit (struct regs
*r
)
41 task_t
*taskc
= task_find (0);
46 page_dir_switch (taskc
->page_cover
->page_dir
);
48 proc_t
*proc
= proc_find (_curr_task
);
53 task_t
*task
= proc
->tty
->task
;
58 longjmp (task
->state
, 1);
64 void sys_getch (struct regs
*r
)
66 proc_t
*proc
= proc_find (_curr_task
);
71 if (proc
->tty
!= currtty
)
74 unsigned char c
= (unsigned char) getkey ();
79 //r->eax = (unsigned) &c;
81 unsigned char *memptr
= (unsigned char *) 0x905d;
85 extern unsigned long timer_ticks
;
86 void sys_sleep (struct regs
*r
)
88 unsigned long timer_start
= timer_ticks
+ ((unsigned) r
->ebx
* 1000);
90 while (timer_start
> timer_ticks
)
94 void sys_putch (struct regs
*r
)
96 task_t
*taskc
= task_find (0);
101 //page_dir_switch (taskc->page_cover->page_dir);
103 proc_t
*proc
= proc_find (_curr_task
);
110 tty_putnch (proc
->tty
, c
);
112 //page_dir_switch (proc->task->page_cover->page_dir);
115 void sys_color (struct regs
*r
)
117 video_color (r
->ebx
, r
->ecx
);
121 void sys_cls (struct regs
*r
)
123 proc_t
*proc
= proc_find (_curr_task
);
128 if (proc
->tty
!= currtty
)
131 /* NOTE: Why we should disable interrupts ? Nobody know, but works better */
132 if (int_disable ()) {
138 extern unsigned char scancode
;
139 void sys_getkey (struct regs
*r
)
141 proc_t
*proc
= proc_find (_curr_task
);
146 if (proc
->tty
!= currtty
)
149 unsigned char c
= (unsigned char) scancode
;
153 unsigned char *memptr
= (unsigned char *) 0x9060;
157 void sys_gotoxy (struct regs
*r
)
159 proc_t
*proc
= proc_find (_curr_task
);
164 tty_gotoxy (proc
->tty
, r
->ebx
, r
->ecx
);
167 void sys_fork (struct regs
*r
)
169 unsigned short *where
;
170 unsigned char c
= (unsigned char) fork ();
172 unsigned short *memptr
= (unsigned short *) 0x9000;
177 void sys_schedule (struct regs
*r
)
182 extern kbd_quaue kbd_q
;
183 void sys_write (struct regs
*r
)
185 unsigned len
= r
->ecx
;
186 unsigned fd
= r
->edx
;
188 unsigned char *buf
= (unsigned char *) r
->ebx
;
193 // kprintf ("#buf: 0x%x / '%s'\n", buf, buf);
196 if (!memcpy_to_user (&buf, (char *) r->ebx, len))
206 proc
= proc_find (_curr_task
);
213 //if (buf >= proc->data && buf < (proc->data+proc->data_off)) {
214 // kprintf ("Je to staticky retezec :) - 0x%x - '%s'\n", buf+proc->code, buf+proc->code);
217 mem
= (char *) buf
;//vmem_proc_check (proc, buf);
219 //if (proc->tty != currtty)
222 //printf ("data: 0x%x | 0x%x\n", buf, proc->data);
224 //if (!memtest_data (buf, (void *) proc->data, proc->data_off))
225 tty_write (proc
->tty
, (char *) mem
, len
);
227 // tty_write (proc->tty, (char *) buf+proc->code, len);
234 proc
= proc_find (_curr_task
);
241 if (len
> KBD_MAX_QUAUE
)
247 for (i
= len
; i
>= 0; i
--)
255 mem
= (char *) buf
; //vmem_proc_check (proc, buf);
256 //printf ("hehe: 0x%x / '%s' len: %d\n", mem, mem, len);
257 ret
= write (fd
, (char *) mem
, len
);
262 int *memptr
= (int *) 0x9000;
267 void sys_socket (struct regs
*r
)
269 int ret
= socket (r
->ebx
, r
->ecx
, r
->edx
);
272 int *memptr
= (int *) 0x9000;
277 void sys_connect (struct regs
*r
)
279 sockaddr
*addr
= (sockaddr
*) r
->ebx
;
281 int ret
= connect (r
->ecx
, addr
, r
->edx
);
284 int *memptr
= (int *) 0x9000;
289 void sys_malloc (struct regs
*r
)
292 r
->eax
= (unsigned) kmalloc ((int) r
->ebx
);
295 DPRINT ("malloc (): 0x%x\n", r
->eax
);
298 void sys_send (struct regs
*r
)
300 /* char msg[r->edx+1];
301 if (!memcpy_to_user (&msg, (char *) r->ebx, r->edx))
304 int ret
= send ((int) r
->ecx
, (char *) r
->ebx
, (unsigned) r
->edx
, 0);
307 int *memptr
= (int *) 0x9040;
312 void sys_recv (struct regs
*r
)
314 unsigned char *msg
= (unsigned char *) r
->ebx
;
315 unsigned size
= (unsigned) r
->edx
;
316 int fd
= (int) r
->ecx
;
318 int ret
= recv (fd
, (char *) msg
, size
, 0);
321 printf ("recv> r->ebx: %d, r->edx: %u, ret: %d\n", (int) r->ecx, (unsigned) r->edx, ret);
324 //printf ("recv> r->ebx: %d, r->edx: %u, ret: %d\n", (int) r->ecx, (unsigned) r->edx, ret);
326 int *memptr
= (int *) 0x9030;
330 void sys_close (struct regs
*r
)
335 void sys_open (struct regs
*r
)
337 unsigned char *pathname
= (unsigned char *) r
->ebx
;
339 int ret
= open ((char *) pathname
, (unsigned) r
->ecx
);
341 // printf ("%d = sys_open (%s, %u)\n", ret, (char *) pathname, (unsigned) r->ecx);
344 int *memptr
= (int *) 0x9000;
349 void sys_pcspk (struct regs
*r
)
351 dev_t
*dev
= dev_find ("/dev/pcspk");
354 dev
->handler (DEV_ACT_PLAY
, (unsigned) r
->ebx
);
357 void sys_usleep (struct regs
*r
)
359 //unsigned long timer_start = timer_ticks + ((unsigned) r->ebx);
361 //while (timer_start > timer_ticks)
363 usleep ((unsigned) r
->ebx
);
366 void sys_read (struct regs
*r
)
368 unsigned fd
= r
->ecx
;
369 unsigned len
= r
->edx
;
371 unsigned char *buf
= (unsigned char *) r
->ebx
;
381 proc
= proc_find (_curr_task
);
386 //if (proc->tty != currtty)
389 ret
= tty_read (proc
->tty
, (char *) buf
, len
);
392 ret
= read (fd
, (char *) buf
, len
);
397 int *memptr
= (int *) 0x9000;
402 void sys_time (struct regs
*r
)
404 time_t *memptr
= (time_t *) 0x9005;
406 tm
*t
= rtc_getcurrtime ();
409 *memptr
= (time_t) t
->__tm_gmtoff
;
412 void sys_system (struct regs
*r
)
414 task_t
*task
= task_find (0);
419 proc_t
*proc
= proc_find (_curr_task
);
424 task_t
*oldtask
= _curr_task
;
426 page_dir_switch (task
->page_cover
->page_dir
);
428 unsigned char *cmd
= (unsigned char *) r
->ebx
;
430 command_parser ((char *) cmd
, strlen (cmd
));
432 page_dir_switch (oldtask
->page_cover
->page_dir
);
434 /* needed for correct scheduling (when you execute new process, _curr_task is tasj of current tty) */
435 _curr_task
= oldtask
;
441 void sys_chdir (struct regs
*r
)
443 unsigned char *dir
= (unsigned char *) r
->ebx
;
448 void sys_getdir (struct regs
*r
)
450 r
->eax
= (unsigned) vfs_dirent ();
453 void sys_procarg (struct regs
*r
)
455 proc_t
*proc
= proc_find (_curr_task
);
462 r
->eax
= (unsigned) proc
->argv
;
465 r
->eax
= (unsigned) proc
->argc
;
472 void sys_signal (struct regs
*r
)
474 signal (r
->ebx
, (sighandler_t
) r
->ecx
);
477 void sys_mount (struct regs
*r
)
479 partition_t
*p
= partition_find ((char *) r
->ebx
);
482 mount (p
, "", (char *) r
->ecx
);
488 void sys_kputs (struct regs
*r
)
492 module_t
*kmod
= module_find (_curr_task
);
497 if (kmod
->task
!= _curr_task
)
500 unsigned char *buf
= (unsigned char *) r
->ebx
;
503 //kprintf ("yeah, sys_kputs: '%s' '0x%x'\n", buf, buf);
508 void sys_bind (struct regs
*r
)
510 int ret
= bind (r
->ecx
, (sockaddr
*) r
->ebx
, r
->edx
);
513 int *memptr
= (int *) 0x9000;
518 void sys_listen (struct regs
*r
)
520 int ret
= listen (r
->ebx
, r
->ecx
);
523 int *memptr
= (int *) 0x9000;
528 void sys_accept (struct regs
*r
)
530 int ret
= accept (r
->ecx
, r
->ebx
, r
->edx
);
533 int *memptr
= (int *) 0x9000;
538 void sys_fcntl (struct regs
*r
)
540 int ret
= fcntl (r
->ebx
, r
->ecx
, r
->edx
);
543 int *memptr
= (int *) 0x9000;
548 void sys_gvgafb (struct regs
*r
)
550 proc_t
*proc
= proc_find (_curr_task
);
556 printf ("Please start this program in graphical VESA mode\n");
561 unsigned p
= (unsigned) palign ((void *) (proc
->end
- proc
->start
));
563 unsigned *memptr
= (unsigned *) 0x900a;
564 *memptr
= (unsigned) init_vgafb () + p
;
567 void sys_gcls (struct regs
*r
)
572 void sys_gfbswap (struct regs
*r
)
574 proc_t
*proc
= proc_find (_curr_task
);
579 if (proc
->tty
== currtty
)
585 void sys_rs232read (struct regs
*r
)
588 char *memptr
= (char *) 0x9000;
590 *where
= rs232_read ();
593 void sys_rs232write (struct regs
*r
)
595 rs232_write ((char) r
->ebx
);
598 void sys_gttyexit (struct regs
*r
)
600 proc_t
*proc
= proc_find (_curr_task
);
605 tty_change (proc
->tty
);
608 void sys_gexit (struct regs
*r
)
613 extern unsigned char vgagui
;
615 void sys_gttyinit (struct regs
*r
)
617 tty_t
*tty
= gtty_init ();
622 r
->eax
= (unsigned) &tty
->screen
;
625 void sys_mkdir (struct regs
*r
)
627 unsigned char *dir
= (unsigned char *) r
->ebx
;
629 mkdir ((char *) dir
);
632 void sys_free (struct regs
*r
)
636 kfree ((void *) r
->ebx
);
638 DPRINT ("free (): 0x%x\n", r
->ebx
);
643 void sys_realloc (struct regs
*r
)
645 r
->eax
= (unsigned) krealloc ((void *) r
->ebx
, (size_t) r
->ecx
);
647 DPRINT ("realloc (): 0x%x\n", r
->eax
);
650 void sys_gethostbyname (struct regs
*r
)
652 char *buf
= (char *) r
->ebx
;
659 r
->eax
= (unsigned) gethostbyname (buf
);
662 void sys_procmap (struct regs
*r
)
664 proc_t
*proc
= proc_find (_curr_task
);
669 printf ("LOL: '%s'\n", proc
->data
-0x1000);
670 //proc_vmem_map (proc);
673 void sys_sendto (struct regs
*r
)
675 /* HACK: bleeh, there is problem with fourth argument,
676 so we need to use another way to getting address */
677 unsigned *addr
= (unsigned *) 0x9020;
679 sockaddr_in
*to
= (sockaddr_in
*) *addr
;
681 int ret
= sendto ((int) r
->ecx
, (char *) r
->ebx
, (unsigned) r
->edx
, 0, to
, 0);
684 int *memptr
= (int *) 0x9000;
689 void sys_recvfrom (struct regs
*r
)
691 unsigned char *msg
= (unsigned char *) r
->ebx
;
693 /* HACK: bleeh, there is problem with fourth argument,
694 so we need to use another way to getting address */
695 unsigned *addr
= (unsigned *) 0x9010;
697 sockaddr_in
*from
= (sockaddr_in
*) *addr
;
699 int ret
= recvfrom ((int) r
->ecx
, (char *) msg
, (unsigned) r
->edx
, 0, from
, 0);
702 int *memptr
= (int *) 0x9000;
707 void sys_getchar (struct regs
*r
)
709 proc_t
*proc
= proc_find (_curr_task
);
712 unsigned char s
= '\n';
714 int *memptr
= (int *) 0x9064;
716 /* non-blocking mode */
717 if (stdin
->flags
& O_NONBLOCK
) {
721 if (proc
->tty
!= currtty
)
732 tty_write (proc
->tty
, &c
, 1);
739 /* blocking - clasical mode */
744 if (proc
->tty
!= currtty
)
750 if (i
> 0 && c
!= '\b')
751 tty_write (proc
->tty
, &c
, 1);
761 tty_write (proc
->tty
, "\b", 1);
771 void sys_threadopen (struct regs
*r
)
773 void *ptr
= (void *) r
->ebx
;
775 unsigned *memptr
= (unsigned *) 0x9050;
777 unsigned ret
= proc_thread_create (ptr
, (void *) *memptr
);
782 void sys_threadclose (struct regs
*r
)
784 proc_t
*proc
= proc_find (_curr_task
);
789 unsigned *memptr
= (unsigned *) 0x9050;
791 task_t
*task
= _curr_task
;
793 /* free child process thread */
794 *memptr
= proc_thread_destroy (proc
, task
);
796 task
= proc
->tty
->task
;
799 longjmp (task
->state
, 1);
806 void sys_ioctl (struct regs
*r
)
808 void *s
= (void *) r
->ebx
;
809 unsigned id
= r
->ecx
;
812 int ret
= ioctl_call (id
, s
, l
);
817 void sys_getpid (struct regs
*r
)
819 proc_t
*proc
= proc_find (_curr_task
);
824 r
->eax
= (int) &proc
->pid
;
827 void sys_lseek (struct regs
*r
)
830 long offset
= r
->ecx
;
833 long ret
= lseek (fd
, offset
, whence
);
835 long *memptr
= (long *) 0x9006;
840 void sys_pipe (struct regs
*r
)
842 int *p
= (int *) r
->ebx
;
848 void syscall_handler (struct regs
*r
)
854 return sys_getch (r
);
856 return sys_sleep (r
);
858 return sys_putch (r
);
860 return sys_color (r
);
864 return sys_getkey (r
);
866 return sys_gotoxy (r
);
870 return sys_schedule (r
);
872 return sys_write (r
);
874 return sys_socket (r
);
876 return sys_connect (r
);
878 return sys_malloc (r
);
884 return sys_close (r
);
888 return sys_pcspk (r
);
890 return sys_usleep (r
);
896 return sys_system (r
);
898 return sys_chdir (r
);
900 return sys_getdir (r
);
902 return sys_procarg (r
);
904 return sys_signal (r
);
906 return sys_mount (r
);
908 return sys_kputs (r
);
912 return sys_listen (r
);
914 return sys_accept (r
);
916 return sys_fcntl (r
);
918 return sys_gvgafb (r
);
922 return sys_gfbswap (r
);
924 return sys_rs232read (r
);
926 return sys_rs232write (r
);
928 return sys_gttyexit (r
);
930 return sys_gexit (r
);
932 return sys_gttyinit (r
);
934 return sys_mkdir (r
);
938 return sys_realloc (r
);
940 return sys_gethostbyname (r
);
942 return sys_procmap (r
);
944 return sys_sendto (r
);
946 return sys_recvfrom (r
);
948 return sys_getchar (r
);
950 return sys_threadopen (r
);
952 return sys_threadclose (r
);
954 return sys_ioctl (r
);
956 return sys_getpid (r
);
958 return sys_lseek (r
);