xref: /plan9-contrib/sys/lib/acid/syscall (revision f8bc6aaf8056e137bcdfb6117a990ac3eff62cc9)
19a747e4fSDavid du Colombier// print system calls
29a747e4fSDavid du Colombierdefn printstring(s)
39a747e4fSDavid du Colombier{
49a747e4fSDavid du Colombier	print("\"", s, "\"");
59a747e4fSDavid du Colombier}
69a747e4fSDavid du Colombier
79a747e4fSDavid du Colombierdefn printtextordata(addr, n)
89a747e4fSDavid du Colombier{
99a747e4fSDavid du Colombier	local a, i;
109a747e4fSDavid du Colombier
119a747e4fSDavid du Colombier	a = addr\c;
129a747e4fSDavid du Colombier	i = 0;
139a747e4fSDavid du Colombier	loop 1, n do {
149a747e4fSDavid du Colombier		if (a[i]>=127) then {
159a747e4fSDavid du Colombier			print(fmt(addr, 'X'), ", ", n\D);
169a747e4fSDavid du Colombier			return {};
179a747e4fSDavid du Colombier		}
189a747e4fSDavid du Colombier		i = i+1;
199a747e4fSDavid du Colombier	}
209a747e4fSDavid du Colombier
219a747e4fSDavid du Colombier	print("\"");
229a747e4fSDavid du Colombier	printstringn(addr, n);
239a747e4fSDavid du Colombier	print("\"");
249a747e4fSDavid du Colombier}
259a747e4fSDavid du Colombier
269a747e4fSDavid du Colombierdefn printstringn(s, n)
279a747e4fSDavid du Colombier{
289a747e4fSDavid du Colombier	local m;
299a747e4fSDavid du Colombier
309a747e4fSDavid du Colombier	m = n;
319a747e4fSDavid du Colombier	if (m > 100) then m = 100;
329a747e4fSDavid du Colombier	loop 1,m do {
339a747e4fSDavid du Colombier		print(*(s\c)); s=s+1;
349a747e4fSDavid du Colombier	}
359a747e4fSDavid du Colombier	if(m != n) then print("...");
369a747e4fSDavid du Colombier}
379a747e4fSDavid du Colombier
389a747e4fSDavid du Colombierdefn printsyscall(name, fmt, arg) {
399a747e4fSDavid du Colombier	local f, i, a, argp, sl;
409a747e4fSDavid du Colombier
419a747e4fSDavid du Colombier	print(name, "(");
429a747e4fSDavid du Colombier	i = 0;
439a747e4fSDavid du Colombier	a = eval arg;
449a747e4fSDavid du Colombier	while fmt[i] != 0 do {
459a747e4fSDavid du Colombier		if fmt[i] == 's' then {
469a747e4fSDavid du Colombier			if *a == 0 then
479a747e4fSDavid du Colombier				print("nil");
489a747e4fSDavid du Colombier			else
499a747e4fSDavid du Colombier				printstring(*(*a\s));
509a747e4fSDavid du Colombier		} else if fmt[i] == 'S' then {
519a747e4fSDavid du Colombier			argp = *a;
529a747e4fSDavid du Colombier			argl = {};
539a747e4fSDavid du Colombier			while *argp != 0 do {
549a747e4fSDavid du Colombier				argl = append argl, *(*argp\s);
559a747e4fSDavid du Colombier				argp++;
569a747e4fSDavid du Colombier			}
579a747e4fSDavid du Colombier			print(argl);
589a747e4fSDavid du Colombier		} else if (fmt[i] == 'Z') && (~*a == 0) then {
599a747e4fSDavid du Colombier			print("-1");
60*f8bc6aafSDavid du Colombier			if fmtsize(a) != 8 then a++;	// advance extra word for quadword
619a747e4fSDavid du Colombier		} else if (fmt[i] == 'Y') || (fmt[i] == 'V') then {
629a747e4fSDavid du Colombier			print(fmt(*a, fmt[i]));
63*f8bc6aafSDavid du Colombier			if fmtsize(a) != 8 then a++;	// advance extra word for quadword
649a747e4fSDavid du Colombier		} else if (fmt[i] == 'T') then {
659a747e4fSDavid du Colombier			if *a == 0 then
669a747e4fSDavid du Colombier				print("nil");
679a747e4fSDavid du Colombier			else
689a747e4fSDavid du Colombier				printtextordata(*a, a[1]);
699a747e4fSDavid du Colombier		} else
709a747e4fSDavid du Colombier			print(fmt(*a, fmt[i]));
719a747e4fSDavid du Colombier		if fmt[i+1] != 0 then
729a747e4fSDavid du Colombier			print(", ");
739a747e4fSDavid du Colombier		i = i+1;
749a747e4fSDavid du Colombier		a++;
759a747e4fSDavid du Colombier	}
769a747e4fSDavid du Colombier	print(")\n");
779a747e4fSDavid du Colombier}
789a747e4fSDavid du Colombier
799a747e4fSDavid du Colombierdefn code(*e) { return e; }
809a747e4fSDavid du Colombier
819a747e4fSDavid du Colombiersyscalls = {
829a747e4fSDavid du Colombier	{ 0, {"sysr1",		"s",		code(0)}},
839a747e4fSDavid du Colombier	{ 1, {"_errstr",		"s",		code(*sys_errstr:arg)}},
849a747e4fSDavid du Colombier	{ 2, {"bind",		"ssX",		code(*sysbind:arg)}},
859a747e4fSDavid du Colombier	{ 3, {"chdir",		"s",		code(*sysbind:arg)}},
869a747e4fSDavid du Colombier	{ 4, {"close",		"D",		code(*sysclose:arg)}},
879a747e4fSDavid du Colombier	{ 5, {"dup",		"DD",		code(*sysdup:arg)}},
889a747e4fSDavid du Colombier	{ 6, {"alarm",		"D",		code(*sysalarm:arg)}},
899a747e4fSDavid du Colombier	{ 7, {"exec",		"sS",		code(*sysexec:arg)}},
909a747e4fSDavid du Colombier	{ 8, {"exits",		"s",		code(*sysexits:arg)}},
919a747e4fSDavid du Colombier	{ 9, {"_fsession",	"DX",		code(*sys_fsession:arg)}},
929a747e4fSDavid du Colombier	{10, {"fauth",		"DX",		code(*sysfauth:arg)}},
939a747e4fSDavid du Colombier	{11, {"_fstat",		"DX",		code(*sys_fstat:arg)}},
949a747e4fSDavid du Colombier	{12, {"segbrk",		"XX",		code(*syssegbrk:arg)}},
959a747e4fSDavid du Colombier	{13, {"_mount",		"DsXs",		code(*sys_mount:arg)}},
969a747e4fSDavid du Colombier	{14, {"open",		"sD",		code(*sysopen:arg)}},
979a747e4fSDavid du Colombier	{15, {"_read",		"DXD",		code(*sys_read:arg)}},
989a747e4fSDavid du Colombier	{16, {"oseek",		"DDD",		code(*sysoseek:arg)}},
999a747e4fSDavid du Colombier	{17, {"sleep",		"D",		code(*syssleep:arg)}},
1009a747e4fSDavid du Colombier	{18, {"_stat",		"sX",		code(*sys_stat:arg)}},
1019a747e4fSDavid du Colombier	{19, {"rfork",		"X",		code(*sysstat:arg)}},
1029a747e4fSDavid du Colombier	{20, {"_write",		"DXD",		code(*sys_write:arg)}},
1039a747e4fSDavid du Colombier	{21, {"pipe",		"X",		code(*syspipe:arg)}},
1049a747e4fSDavid du Colombier	{22, {"create",		"sDO",		code(*syscreate:arg)}},
1059a747e4fSDavid du Colombier	{23, {"fd2path",	"DXD",		code(*sysfd2path:arg)}},
1069a747e4fSDavid du Colombier	{24, {"brk_",		"X",		code(*sysbrk_:arg)}},
1079a747e4fSDavid du Colombier	{25, {"remove",		"s",		code(*sysremove:arg)}},
1089a747e4fSDavid du Colombier	{26, {"_wstat",		"sX",		code(*sys_wstat:arg)}},
1099a747e4fSDavid du Colombier	{27, {"_fwstat",		"DX",		code(*sys_fwstat:arg)}},
1109a747e4fSDavid du Colombier	{28, {"notify",		"X",		code(*sysnotify:arg)}},
1119a747e4fSDavid du Colombier	{29, {"noted",		"D",		code(*sysnoted:arg)}},
1129a747e4fSDavid du Colombier	{30, {"segattach",	"DsXD",		code(*syssegattach:arg)}},
1139a747e4fSDavid du Colombier	{31, {"segdetach",	"X",		code(*syssegdetach:arg)}},
1149a747e4fSDavid du Colombier	{32, {"segfree",	"XD",		code(*syssegfree:arg)}},
1159a747e4fSDavid du Colombier	{33, {"segflush",	"XD",		code(*syssegflush:arg)}},
1169a747e4fSDavid du Colombier	{34, {"rendezvous",	"XX",		code(*sysrendezvous:arg)}},
1179a747e4fSDavid du Colombier	{35, {"unmount",	"ss",		code(*sysunmount:arg)}},
1189a747e4fSDavid du Colombier	{36, {"_wait",		"X",		code(*sys_wait:arg)}},
1199a747e4fSDavid du Colombier	{39, {"seek",		"XDVD",		code(*sysseek:arg)}},
1209a747e4fSDavid du Colombier	{40, {"fversion",	"DDsD",		code(*sysfversion:arg)}},
1219a747e4fSDavid du Colombier	{41, {"errstr",		"TD",		code(*syserrstr:arg)}},
1229a747e4fSDavid du Colombier	{42, {"stat",		"sXD",		code(*sysstat:arg)}},
1239a747e4fSDavid du Colombier	{43, {"fstat",		"DXD",		code(*sysfstat:arg)}},
1249a747e4fSDavid du Colombier	{44, {"wstat",		"sXD",		code(*syswstat:arg)}},
1259a747e4fSDavid du Colombier	{45, {"fwstat",		"DXD",		code(*sysfwstat:arg)}},
1269a747e4fSDavid du Colombier	{46, {"mount",		"DDsXs",		code(*sysmount:arg)}},
1279a747e4fSDavid du Colombier	{47, {"await",		"TD",		code(*sysawait:arg)}},
1289a747e4fSDavid du Colombier	{50, {"pread",		"DXDZ",		code(*syspread:arg)}},
1299a747e4fSDavid du Colombier	{51, {"pwrite",		"DTDZ",		code(*syspwrite:arg)}},
1309a747e4fSDavid du Colombier};
1319a747e4fSDavid du Colombier
1329a747e4fSDavid du Colombierdefn syscall() {
1339a747e4fSDavid du Colombier	local n, sl, h, p;
1349a747e4fSDavid du Colombier
1359a747e4fSDavid du Colombier	map({"*data", 0, 0xffffffff, 0});
1369a747e4fSDavid du Colombier	n = *syscall:scallnr;
1379a747e4fSDavid du Colombier	sl = syscalls;
1389a747e4fSDavid du Colombier	while sl != {} do {
1399a747e4fSDavid du Colombier		h = head sl;
1409a747e4fSDavid du Colombier		sl = tail sl;
1419a747e4fSDavid du Colombier
1429a747e4fSDavid du Colombier		if n == h[0] then {
1439a747e4fSDavid du Colombier			p = h[1];
1449a747e4fSDavid du Colombier			printsyscall(p[0], p[1], p[2]);
1459a747e4fSDavid du Colombier		}
1469a747e4fSDavid du Colombier	}
1479a747e4fSDavid du Colombier}
1489a747e4fSDavid du Colombier
1499a747e4fSDavid du Colombierdefn UPCSPRET() {
1509a747e4fSDavid du Colombier	// return sys call number, address of first argument, location of syscall return value
1519a747e4fSDavid du Colombier	if objtype == "386" then
1529a747e4fSDavid du Colombier		return { code(*(*PC-4)), code(*SP+4), code(*AX) };
1539a747e4fSDavid du Colombier	if (objtype == "mips") || (objtype == "mips2") then
1549a747e4fSDavid du Colombier		return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R1) };
155*f8bc6aafSDavid du Colombier	if objtype == "mips64" then
156*f8bc6aafSDavid du Colombier		return { code(*(*PC-8) & 0xffff), code(*SP), code(*R1) };
1579a747e4fSDavid du Colombier	if objtype == "arm" then
1589a747e4fSDavid du Colombier		return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R0) };	// untested
1599a747e4fSDavid du Colombier	if objtype == "alpha" then
1609a747e4fSDavid du Colombier		return { code(*(*PC-4) & 0xffff), code(*SP+4), code(*R0) };	// untested
1619a747e4fSDavid du Colombier}
1629a747e4fSDavid du Colombier
1639a747e4fSDavid du Colombierdefn trapoffset() {
1649a747e4fSDavid du Colombier	// return offset from entry point to trap instr
1659a747e4fSDavid du Colombier	if objtype == "386" then return 5;
1669a747e4fSDavid du Colombier	if objtype == "mips" then return 8;
1679a747e4fSDavid du Colombier	if objtype == "mips2" then return 8;
168*f8bc6aafSDavid du Colombier	if objtype == "mips64" then return 12;
1699a747e4fSDavid du Colombier	if objtype == "arm" then return 8;	// untested
1709a747e4fSDavid du Colombier	if objtype == "alpha" then return 8;	// untested
1719a747e4fSDavid du Colombier}
1729a747e4fSDavid du Colombier
1739a747e4fSDavid du Colombierdefn trapreason() {
1749a747e4fSDavid du Colombier	// return reason for trap
1759a747e4fSDavid du Colombier	if objtype == "386" then return reason(*TRAP);
1769a747e4fSDavid du Colombier	if objtype == "mips" then return reason(*CAUSE);
1779a747e4fSDavid du Colombier	if objtype == "mips2" then return reason(*CAUSE);
178*f8bc6aafSDavid du Colombier	if objtype == "mips64" then return reason(*CAUSE);
1799a747e4fSDavid du Colombier	if objtype == "arm" then return "unknown trap";	// untested
1809a747e4fSDavid du Colombier	if objtype == "alpha" then return reason(cause);	// untested
1819a747e4fSDavid du Colombier}
1829a747e4fSDavid du Colombier
1839a747e4fSDavid du Colombier
1849a747e4fSDavid du Colombierdefn usyscall() {	// gives args for system call in user level; not useful with -k
1859a747e4fSDavid du Colombier	local n, sl, h, p;
1869a747e4fSDavid du Colombier
1879a747e4fSDavid du Colombier	// stopped at TRAP instruction in system call library
1889a747e4fSDavid du Colombier	pcsp = UPCSPRET();
1899a747e4fSDavid du Colombier	n = eval pcsp[0];
1909a747e4fSDavid du Colombier	sl = syscalls;
1919a747e4fSDavid du Colombier	while sl != {} do {
1929a747e4fSDavid du Colombier		h = head sl;
1939a747e4fSDavid du Colombier		sl = tail sl;
1949a747e4fSDavid du Colombier
1959a747e4fSDavid du Colombier		if n == h[0] then {
1969a747e4fSDavid du Colombier			p = h[1];
1979a747e4fSDavid du Colombier			printsyscall(p[0], p[1], pcsp[1]);
1989a747e4fSDavid du Colombier		}
1999a747e4fSDavid du Colombier	}
2009a747e4fSDavid du Colombier}
201