Initial Upload
This commit is contained in:
104
gensyscalls.pl
Normal file
104
gensyscalls.pl
Normal file
@ -0,0 +1,104 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
# Generate syscall.h, syscalltable.h or usys.S. These are the header and assembly
|
||||
# files for system calls.
|
||||
#
|
||||
# Generating these files from one script avoids them getting out of sync.
|
||||
#
|
||||
# Specify an argument of -h to generate syscall.h
|
||||
# Specify an argument of -c to generate syscalltable.h
|
||||
# Specify an argument of -a to generate usys.S
|
||||
#
|
||||
# Note that you also need to update user.h with the declarations for these functions that
|
||||
# user programs will use. This ensures that the C compiler generates the correct code to
|
||||
# push the parameters on to the stack.
|
||||
|
||||
my @syscalls = (
|
||||
"fork",
|
||||
"exit",
|
||||
"wait",
|
||||
"pipe",
|
||||
"read",
|
||||
"kill",
|
||||
"exec",
|
||||
"fstat",
|
||||
"chdir",
|
||||
"dup",
|
||||
"getpid",
|
||||
"sbrk",
|
||||
"sleep",
|
||||
"uptime",
|
||||
"open",
|
||||
"write",
|
||||
"mknod",
|
||||
"unlink",
|
||||
"link",
|
||||
"mkdir",
|
||||
"close",
|
||||
"getch",
|
||||
"greeting",
|
||||
"shutdown"
|
||||
);
|
||||
|
||||
my $i;
|
||||
if ($#ARGV == -1)
|
||||
{
|
||||
print 'Error: No argument supplied to gensyscalls.pl';
|
||||
exit(1);
|
||||
}
|
||||
if (($ARGV[0] ne '-h') && ($ARGV[0] ne '-a') && ($ARGV[0] ne '-c'))
|
||||
{
|
||||
print 'Error: Invalid argument to gensyscalls.pl';
|
||||
exit(1);
|
||||
}
|
||||
if ($ARGV[0] eq '-h'|| $ARGV[0] eq '-c')
|
||||
{
|
||||
print "// Generated by gensyscalls.pl. Do not edit.\n";
|
||||
print "// To change syscall numbers or add new syscalls, edit gensyscalls.pl\n";
|
||||
print "\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
print "# Generated by gensyscalls.pl. Do not edit.\n";
|
||||
print "# To change syscall numbers or add new syscalls, edit gensyscalls.pl\n";
|
||||
print "\n";
|
||||
}
|
||||
for ($i = 0; $i < scalar(@syscalls); $i++)
|
||||
{
|
||||
my $index = $i + 1;
|
||||
if ($ARGV[0] eq '-h')
|
||||
{
|
||||
print "#define SYS_$syscalls[$i]\t\t$index\n";
|
||||
}
|
||||
elsif ($ARGV[0] eq '-c')
|
||||
{
|
||||
print "extern int sys_$syscalls[$i](void);\n";
|
||||
}
|
||||
}
|
||||
if ($ARGV[0] eq '-a')
|
||||
{
|
||||
print "#include \"syscall.h\"\n";
|
||||
print "#include \"traps.h\"\n";
|
||||
print "\n";
|
||||
print "#define SYSCALL(name) \\\n";
|
||||
print ".globl name; \\\n";
|
||||
print "name: \\\n";
|
||||
print "\tmovl\t\$SYS_ ## name, \%eax; \\\n";
|
||||
print "\tint\t\$T_SYSCALL; \\\n";
|
||||
print "\tret\n";
|
||||
print "\n";
|
||||
for ($i = 0; $i < scalar(@syscalls); $i++)
|
||||
{
|
||||
print "SYSCALL($syscalls[$i])\n";
|
||||
}
|
||||
}
|
||||
elsif ($ARGV[0] eq '-c')
|
||||
{
|
||||
print "\n";
|
||||
print "static int(*syscalls[])(void) = {\n";
|
||||
for ($i = 0; $i < scalar(@syscalls); $i++)
|
||||
{
|
||||
print "[SYS_$syscalls[$i]]\tsys_$syscalls[$i],\n";
|
||||
}
|
||||
print "};\n"
|
||||
}
|
Reference in New Issue
Block a user