initial commit
[pfinal.git] / Routix / src / syscalls / syscalls.asm
blob3984171fe7e7adc6aef3674bbfccc4039d983777
1 ; Para las llamadas al sistema en el registro EAX se colocara, el codigo del grupo de llamadas en los dos bytes
2 ; mas altos, y la funcion (dentro del grupo correspondiente) en los dos bytes mas bajos.
4 ; Por ejemplo:
5 ; __asm__ __volatile__ ("movl %0, %%eax ; movl %1, %%ebx" : : "g" (SYS_PROCESS | SYS_EXEC) , "g" (tarea) : "eax" , "ebx");
6 ; __asm__ __volatile__ ("int $0x50");
8 ; donde SYS_PROCESS es el grupo de llamadas al sistema relaciondas con el manejo de procesos
9 ; y SYS_EXEC es la funcion dentro de SYS_PROCESS que ejecuta una tarea.
13 segment .text
14 [global _intSysCall]
16 [global _sys_process]
17 [global _sys_console]
18 [global _sys_signals]
19 [global _sys_timer]
20 [global _sys_mem]
21 [global _sys_misc]
24 [extern _syscall]
25 [extern _syscall_group_vector] ;array de punteros a grupos de funciones
26 [extern _syscall_group_max] ;array con cantidad maxima de llamadas al sistema por gupo
27 [extern _sys_no_existe]
29 [extern _KERNEL_PDT] ; Valor del CR3 del Kernel
30 [extern _actual]
33 MAX_SYSCALLS_GROUPS EQU 5
34 MAX_SYSCALLS EQU 10
36 ;Aca me trae la interrupcion 0x50
37 _intSysCall:
39 push ebx
40 push eax
42 shr eax, 16 ;Verificar si el numero de grupo existe
44 cmp eax, MAX_SYSCALLS_GROUPS
45 ja error_syscall_no
47 mov ebx, [_syscall_group_max + eax * 4] ;Recuperar la cantidad maxima de llamadas que posee ese grupo
49 pop eax
51 ;En ax tengo el numero de indice dentro del grupo. En bx el numero total de llamadas para ese grupo
52 cmp ax, bx
53 pop ebx
54 ;Si intento llamar a una mayor que la "mayor", ERROR
55 ja error_syscall_no
57 ;Pusheo los registros donde recibo los parametros
58 push ebp
59 push esi
60 push edi
61 push edx
62 push ecx
63 push ebx
65 ;Usar como directorio de paginas el CR3 del Kernel
66 mov ebx, [ _KERNEL_PDT ]
67 mov cr3, ebx
69 mov ebx, eax
70 shr ebx, 16 ;Pongo en ebx el numero de grupo de llamadas
72 jmp [_syscall_group_vector + ebx * 4] ;El vector de grupos de llamadas a funciones se encuentra definido
73 ;en syscalls.c
76 ;Llamada al sistema no existe
77 error_syscall_no:
79 push eax
80 call _sys_no_existe
81 pop eax
82 mov eax, -1
83 iret
86 ;Entrada al grupo de manejo de procesos
87 [extern _syscall_process]
88 _sys_process:
90 and eax, 0xffff
91 call [_syscall_process + eax * 4]
93 jmp syscall_fin
96 ;Entrada a manejo de teclado y video
97 [extern _syscall_console]
98 _sys_console:
100 and eax, 0xffff
101 call [_syscall_console + eax * 4]
102 jmp syscall_fin
104 ;Punto de entrada al grupo de seƱales
105 [extern _syscall_signals]
106 _sys_signals:
108 and eax, 0xffff
109 call [_syscall_signals + eax * 4]
110 jmp syscall_fin
113 ;Entrada a manejo de llamadas a sistema de timers
114 [extern _syscall_timer]
115 _sys_timer:
117 and eax, 0xffff
118 call [_syscall_timer + eax * 4 ]
119 jmp syscall_fin
121 ;Entrada a manejo de llamadas a sistema de memoria
122 [extern _syscall_mem]
123 _sys_mem:
125 and eax, 0xffff
126 call [_syscall_mem + eax * 4 ]
127 jmp syscall_fin
129 ;Entrada a manejo de llamadas miscelaneas (provisorias o temporales)
130 [extern _syscall_misc]
131 _sys_misc:
133 and eax, 0xffff
134 call [_syscall_misc + eax * 4 ]
135 jmp syscall_fin
138 ; Balanceo el stack, reacomodo el CR3 y actual->cr3 con el valor de actual->cr3_backup
139 syscall_fin:
141 add esp, 24
143 mov ebx, dword [ _actual ]
144 add ebx, 8
145 mov ecx, dword [ ebx ]
146 mov cr3, ecx
148 mov ebx, dword [ _actual ]
149 add ebx, 4
150 mov dword [ ebx ], ecx
152 iret