jehanne/sys/src/kern/build/ksyscalls.rc.template

293 lines
7.4 KiB
Plaintext

/*
* This file is part of Jehanne.
*
* Copyright (C) 2022 Giacomo Tesio <giacomo@tesio.it>
*
* Jehanne is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* Jehanne is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Jehanne. If not, see <http://www.gnu.org/licenses/>.
*/
/* automatically generated by ksyscalls.rc.template */
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "../port/error.h"
#include "ureg.h"
extern void fmtrwdata(Fmt* f, char* a, int n);
extern void fmtuserstring(Fmt* f, const char* a);
extern void fmtuserstringlist(Fmt* f, const char** argv);
#! . ../$ARCH/registry-$ARCH.rc.conf
#! ifs='
#! '
#! CONFIGURATION=`{sed -n '/^$/!{/^#/!p}' $JEHANNE/sys/src/sysconf/syscalls.rc.confs}
#! for (line in $CONFIGURATION){
#! eval $line
#! OTHERARGS=()
#! if( ! ~ 1 $#ARGS){
#! OTHERARGS=(', '^$ARGS(2-))
#! }
extern $RET sys$NAME($ARGS(1) $"OTHERARGS);
#! }
#! for (line in $CONFIGURATION){
#! eval $line
#! CALLARGS=()
static void
wrap_$NAME^(ScRet* ret, Ureg* ureg)
{
#! for(idx in `{seq $#ARGS}){
#! CALLARGS=($CALLARGS a$idx)
$ARGS($idx) a$idx;
#! }
#! for(idx in `{seq $#ARGS}){
a$idx = ($ARGS($idx))ureg->$UREG($idx);
#! }
#! OTHERARGS=()
#! if( ! ~ 1 $#CALLARGS){
#! OTHERARGS=', '^$CALLARGS(2-)
#! }
ret->$$RET = sys$NAME($CALLARGS(1) $"OTHERARGS);
}
#! }
int nsyscall = $#CONFIGURATION;
ScRet
default_syscall_ret(int syscall)
{
static ScRet zero;
ScRet ret = zero;
switch(syscall){
#! for (line in $CONFIGURATION){
#! eval $line
case $ID:
ret.$$RET = ($RET)-1;
break;
#! }
default:
ret.vl = -1;
break;
}
return ret;
}
char*
syscall_name(int syscall)
{
switch(syscall){
#! for (line in $CONFIGURATION){
#! eval $line
case $ID:
return "$NAME";
#! }
default:
return nil;
}
}
void
dispatch_syscall(int syscall, Ureg* ureg, ScRet* ret)
{
switch(syscall){
#! for (line in $CONFIGURATION){
#! eval $line
case $ID:
wrap_$NAME(ret, ureg);
break;
#! }
default:
panic("dispatch_syscall: bad sys call number %d pc %#p\n", syscall, ureg->ip);
}
}
#! for (line in $CONFIGURATION){
#! eval $line
static void
enter_$NAME(Fmt* fmt, Ureg* ureg)
{
#! for(idx in `{seq $#ARGS}){
#! CALLARGS=($CALLARGS a$idx)
$ARGS($idx) a$idx;
#! }
#! for(idx in `{seq $#ARGS}){
a$idx = ($ARGS($idx))ureg->$UREG($idx);
#! }
jehanne_fmtprint(fmt, "$NAME %#p >", ureg->ip);
if(up->notified)
jehanne_fmtprint(fmt, "!");
#! for(idx in `{seq $#ARGS}){
#! if( ~ $NAME pwrite && ~ $idx 2 ) {
fmtrwdata(fmt, (char*)a2, MIN(a3, 64));
#! }
#! if not switch($ARGS($idx)) {
#! case 'int';
jehanne_fmtprint(fmt, " %d", a$idx);
#! case 'int32_t';
jehanne_fmtprint(fmt, " %d", a$idx);
#! case 'unsigned int';
jehanne_fmtprint(fmt, " %#ux", a$idx);
#! case 'uint32_t';
jehanne_fmtprint(fmt, " %#ux", a$idx);
#! case 'long';
jehanne_fmtprint(fmt, " %lld", a$idx);
#! case 'int64_t';
jehanne_fmtprint(fmt, " %lld", a$idx);
#! case 'unsigned long';
jehanne_fmtprint(fmt, " %#lud", a$idx);
#! case 'uint64_t';
jehanne_fmtprint(fmt, " %#lud", a$idx);
#! case 'void*';
jehanne_fmtprint(fmt, " %#p", a$idx);
#! case 'uint8_t*';
jehanne_fmtprint(fmt, " %#p", a$idx);
#! case 'const void*';
jehanne_fmtprint(fmt, " %#p", a$idx);
#! case 'const uint8_t*';
jehanne_fmtprint(fmt, " %#p", a$idx);
#! case 'int32_t*';
jehanne_fmtprint(fmt, " %#p(%d)", a$idx, a$idx);
#! case 'int*';
jehanne_fmtprint(fmt, " %#p(%d)", a$idx, a$idx);
#! case 'const int32_t*';
jehanne_fmtprint(fmt, " %#p(%d)", a$idx, a$idx);
#! case 'const int*';
jehanne_fmtprint(fmt, " %#p(%d)", a$idx, a$idx);
#! case 'const char*';
fmtuserstring(fmt, a$idx);
#! case 'char*';
fmtuserstring(fmt, a$idx);
#! case 'const char**';
fmtuserstringlist(fmt, a$idx);
#! case 'char**';
fmtuserstringlist(fmt, a$idx);
#! }
#! }
jehanne_fmtprint(fmt, "\n");
}
#! }
char*
syscallfmt(int syscall, Ureg* ureg)
{
Fmt fmt;
jehanne_fmtstrinit(&fmt);
jehanne_fmtprint(&fmt, "%d %s ", up->pid, up->text);
switch(syscall){
#! for (line in $CONFIGURATION){
#! eval $line
case $ID:
enter_$NAME^(&fmt, ureg);
break;
#! }
default:
panic("syscallfmt: bad sys call number %d pc %#p\n", syscall, ureg->ip);
}
return jehanne_fmtstrflush(&fmt);
}
#! for (line in $CONFIGURATION){
#! eval $line
static void
exit_$NAME^(Fmt* fmt, Ureg* ureg, ScRet* ret)
{
jehanne_fmtprint(fmt, "$NAME %#p <", ureg->ip);
if(up->notified)
jehanne_fmtprint(fmt, "!");
#! switch($RET) {
#! case 'int':
jehanne_fmtprint(fmt, " %d", ret->$$RET);
#! case 'int32_t':
jehanne_fmtprint(fmt, " %d", ret->$$RET);
#! case 'unsigned int':
jehanne_fmtprint(fmt, " %#ux", ret->$$RET);
#! case 'uint32_t':
jehanne_fmtprint(fmt, " %#ux", ret->$$RET);
#! case 'long':
jehanne_fmtprint(fmt, " %lld", ret->$$RET);
#! case 'int64_t':
jehanne_fmtprint(fmt, " %lld", ret->$$RET);
#! case 'unsigned long':
jehanne_fmtprint(fmt, " %#llud", ret->$$RET);
#! case 'uint64_t':
jehanne_fmtprint(fmt, " %#llud", ret->$$RET);
#! case 'void':
jehanne_fmtprint(fmt, " %#llud", ret->$$RET);
#! case 'void*':
jehanne_fmtprint(fmt, " %#p", ret->$$RET);
#! case 'uintptr_t':
jehanne_fmtprint(fmt, " %#p", ret->$$RET);
#! case 'const void*':
jehanne_fmtprint(fmt, " %#p", ret->$$RET);
#! case 'const uintptr_t':
jehanne_fmtprint(fmt, " %#p", ret->$$RET);
#! case 'int32_t*':
jehanne_fmtprint(fmt, " %#p(%d)", ret->$$RET, *ret->$$RET);
#! case 'int*':
jehanne_fmtprint(fmt, " %#p(%d)", ret->$$RET, *ret->$$RET);
#! case 'const int32_t*':
jehanne_fmtprint(fmt, " %#p(%d)", ret->$$RET, *ret->$$RET);
#! case 'const int*':
jehanne_fmtprint(fmt, " %#p(%d)", ret->$$RET, *ret->$$RET);
#! }
#! switch($NAME) {
#! case pread:
fmtrwdata(fmt, (char*)ureg->$UREG(2), MIN(ureg->$UREG(3), 64));
#! case fd2path:
fmtrwdata(fmt, (char*)ureg->$UREG(2), MIN(ureg->$UREG(3), 64));
#! case await:
fmtrwdata(fmt, (char*)ureg->$UREG(1), MIN(ureg->$UREG(2), 64));
#! case errstr:
fmtrwdata(fmt, (char*)ureg->$UREG(1), MIN(ureg->$UREG(2), 64));
#! }
}
#! }
char*
sysretfmt(int syscall, Ureg* ureg, ScRet* ret, uint64_t start, uint64_t stop)
{
Fmt fmt;
jehanne_fmtstrinit(&fmt);
jehanne_fmtprint(&fmt, "%d %s ", up->pid, up->text);
switch(syscall){
#! for (line in $CONFIGURATION){
#! eval $line
case $ID:
exit_$NAME^(&fmt, ureg, ret);
break;
#! }
default:
panic("sysretfmt: bad sys call number %d pc %#p\n", syscall, ureg->ip);
}
if(0 > ret->vl){
jehanne_fmtprint(&fmt, " %s %#llud %#llud\n", up->syserrstr, start, stop-start);
} else {
jehanne_fmtprint(&fmt, " \"\" %#llud %#llud\n", start, stop-start);
}
return jehanne_fmtstrflush(&fmt);
}