Skip to content

Commit 3f78a80

Browse files
committedNov 4, 2021
Add getpid syscall and test it
1 parent 1b818c5 commit 3f78a80

File tree

3 files changed

+78
-18
lines changed

3 files changed

+78
-18
lines changed
 

‎sys_call_table.S

+21-11
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,27 @@
22
#include <segment.h>
33

44
ENTRY (sys_call_table)
5-
.long sys_ni_syscall//0
6-
.long sys_ni_syscall//1
7-
.long sys_ni_syscall//2
8-
.long sys_ni_syscall//3
9-
.long sys_write//4
10-
.long sys_ni_syscall//5
11-
.long sys_ni_syscall//6
12-
.long sys_ni_syscall//7
13-
.long sys_ni_syscall//8
14-
.long sys_ni_syscall//9
15-
.long sys_gettime//10
5+
.long sys_ni_syscall //0
6+
.long sys_ni_syscall //1
7+
.long sys_ni_syscall //2
8+
.long sys_ni_syscall //3
9+
.long sys_write //4
10+
.long sys_ni_syscall //5
11+
.long sys_ni_syscall //6
12+
.long sys_ni_syscall //7
13+
.long sys_ni_syscall //8
14+
.long sys_ni_syscall //9
15+
.long sys_gettime //10
16+
.long sys_ni_syscall //11
17+
.long sys_ni_syscall //12
18+
.long sys_ni_syscall //13
19+
.long sys_ni_syscall //14
20+
.long sys_ni_syscall //15
21+
.long sys_ni_syscall //16
22+
.long sys_ni_syscall //17
23+
.long sys_ni_syscall //18
24+
.long sys_ni_syscall //19
25+
.long sys_getpid //20
1626

1727
.globl MAX_SYSCALL
1828
MAX_SYSCALL = (. - sys_call_table)/4

‎user.c

+16-7
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,28 @@ int __attribute__ ((__section__(".text.main")))
2020

2121
/********WRITE********/
2222
if(write(1, "------- \n", 9) == -1) perror();
23-
if(write(1, "\nWrite from user.c\n", 19) == -1) perror();
23+
char * mesg;
24+
mesg = "\n [write] Write from user.c\n";
25+
if(write(1, mesg, strlen(mesg)) == -1) perror();
2426
if(write(1, "------- \n", 9) == -1) perror();
2527

2628

2729
/*****GETTIME********/
28-
char * time_text;
29-
time_text = "\nTesting gettime() from user.c: ";
30-
if(write(1, time_text, strlen(time_text)) == -1) perror();
31-
itoa(gettime(), time_text);
32-
if(write(1, time_text, strlen(time_text)) == -1) perror();
33-
if(write(1, " (gettime result)\n", 18) == -1) perror();
30+
mesg = "\n [gettime] Testing gettime() from user.c: ";
31+
if(write(1, mesg, strlen(mesg)) == -1) perror();
32+
itoa(gettime(), mesg);
33+
if(write(1, mesg, strlen(mesg)) == -1) perror();
34+
mesg = " (gettime result)\n";
35+
if(write(1, mesg, strlen(mesg)) == -1) perror();
3436
if(write(1, "------- \n", 9) == -1) perror();
3537

38+
/**********GETPID********/
39+
mesg = "\n [getpid] My PID: ";
40+
if(write(1, mesg, strlen(mesg)) == -1) perror();
41+
int pid = getpid();
42+
itoa(pid, mesg);
43+
if(write(1, mesg, strlen(mesg)) == -1) perror();
44+
if(write(1, "\n ------- \n", 9) == -1) perror();
3645

3746
while(1) {
3847
//int val1 = add(0x42, 0x666);

‎wrappers.S

+41
Original file line numberDiff line numberDiff line change
@@ -81,5 +81,46 @@ gt_return:
8181
mov %eax, errno
8282
mov -1, %eax
8383
gt_no_error:
84+
pop %ebp
85+
ret
86+
87+
88+
ENTRY(getpid)
89+
push %ebp
90+
mov %esp,%ebp
91+
92+
# Save to user stack
93+
push %edx
94+
push %ecx
95+
96+
97+
# Now we need to put the identified of the system call in the EAX register
98+
movl $20, %eax
99+
100+
# EDX and ECX will be modified by sysexit. We must save them so we can restore them.
101+
#push %ecx
102+
#push %edx
103+
104+
# Fake dynamic link?
105+
push $gp_return
106+
push %ebp
107+
mov %esp,%ebp
108+
109+
# Entramos
110+
sysenter
111+
112+
gp_return:
113+
# Comprobamos si hay error en la ejecución de la syscall
114+
pop %ebp
115+
add $4, %esp
116+
pop %edx
117+
pop %ecx
118+
cmp $0, %eax
119+
jge gp_no_error
120+
# Si hay error, preparamos el contexto para retornar correctamente el código.
121+
neg %eax # Negamos EAX para obtener el valor absoluto
122+
mov %eax, errno
123+
mov -1, %eax
124+
gp_no_error:
84125
pop %ebp
85126
ret

0 commit comments

Comments
 (0)