diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-01-20 00:47:55 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-01-20 00:47:55 +0100 |
commit | 6c2e983d328874ea41cb35bacb510bf2709a229f (patch) | |
tree | e2a5c596a3fcd1af3ed792494b78f2d503911b44 /sys/src/9/port/sysfile.c | |
parent | b99ecee6cd8c7c9fce1ff2cfa56d5a6807a0fc7c (diff) |
kernel: apply uintptr for ulong when a pointer is stored
this change is in preparation for amd64. the systab calling
convention was also changed to return uintptr (as segattach
returns a pointer) and the arguments are now passed as
va_list which handles amd64 arguments properly (all arguments
are passed in 64bit quantities on the stack, tho the upper
part will not be initialized when the element is smaller
than 8 bytes).
this is partial. xalloc needs to be converted in the future.
Diffstat (limited to 'sys/src/9/port/sysfile.c')
-rw-r--r-- | sys/src/9/port/sysfile.c | 476 |
1 files changed, 274 insertions, 202 deletions
diff --git a/sys/src/9/port/sysfile.c b/sys/src/9/port/sysfile.c index b810a4256..20edecf1f 100644 --- a/sys/src/9/port/sysfile.c +++ b/sys/src/9/port/sysfile.c @@ -113,7 +113,6 @@ newfd2(int fd[2], Chan *c[2]) f->fd[fd[0]] = c[0]; f->fd[fd[1]] = c[1]; unlockfgrp(f); - return 0; } @@ -155,7 +154,6 @@ fdtochan(int fd, int mode, int chkmnt, int iref) cclose(c); error(Ebadusefd); } - return c; } @@ -170,29 +168,36 @@ openmode(ulong o) return o; } -long -sysfd2path(ulong *arg) +uintptr +sysfd2path(va_list list) { Chan *c; + char *buf; + uint len; + int fd; - validaddr(arg[1], arg[2], 1); - - c = fdtochan(arg[0], -1, 0, 1); - snprint((char*)arg[1], arg[2], "%s", chanpath(c)); + fd = va_arg(list, int); + buf = va_arg(list, char*); + len = va_arg(list, uint); + validaddr((uintptr)buf, len, 1); + c = fdtochan(fd, -1, 0, 1); + snprint(buf, len, "%s", chanpath(c)); cclose(c); return 0; } -long -syspipe(ulong *arg) +uintptr +syspipe(va_list list) { - int fd[2]; + int *fd; Chan *c[2]; Dev *d; static char *datastr[] = {"data", "data1"}; - validaddr(arg[0], 2*BY2WD, 1); - evenaddr(arg[0]); + fd = va_arg(list, int*); + validaddr((uintptr)fd, 2*sizeof(int), 1); + evenaddr((uintptr)fd); + d = devtab[devno('|', 0)]; c[0] = namec("#|", Atodir, 0, 0); c[1] = 0; @@ -215,24 +220,23 @@ syspipe(ulong *arg) if(newfd2(fd, c) < 0) error(Enofd); poperror(); - - ((long*)arg[0])[0] = fd[0]; - ((long*)arg[0])[1] = fd[1]; return 0; } -long -sysdup(ulong *arg) +uintptr +sysdup(va_list list) { int fd; Chan *c, *oc; Fgrp *f = up->fgrp; + fd = va_arg(list, int); + /* * Close after dup'ing, so date > #d/1 works */ - c = fdtochan(arg[0], -1, 0, 1); - fd = arg[1]; + c = fdtochan(fd, -1, 0, 1); + fd = va_arg(list, int); if(fd != -1){ lock(f); if(fd<0 || growfd(f, fd)<0) { @@ -258,19 +262,22 @@ sysdup(ulong *arg) error(Enofd); poperror(); } - - return fd; + return (uintptr)fd; } -long -sysopen(ulong *arg) +uintptr +sysopen(va_list list) { int fd; Chan *c; + char *name; + ulong mode; - openmode(arg[1]); /* error check only */ - validaddr(arg[0], 1, 0); - c = namec((char*)arg[0], Aopen, arg[1], 0); + name = va_arg(list, char*); + mode = va_arg(list, ulong); + openmode(mode); /* error check only */ + validaddr((uintptr)name, 1, 0); + c = namec(name, Aopen, mode, 0); if(waserror()){ cclose(c); nexterror(); @@ -279,7 +286,7 @@ sysopen(ulong *arg) if(fd < 0) error(Enofd); poperror(); - return fd; + return (uintptr)fd; } void @@ -311,12 +318,14 @@ fdclose(int fd, int flag) cclose(c); } -long -sysclose(ulong *arg) +uintptr +sysclose(va_list list) { - fdtochan(arg[0], -1, 0, 0); - fdclose(arg[0], 0); + int fd; + fd = va_arg(list, int); + fdtochan(fd, -1, 0, 0); + fdclose(fd, 0); return 0; } @@ -625,17 +634,14 @@ mountfix(Chan *c, uchar *op, long n, long maxn) } static long -read(ulong *arg, vlong *offp) +read(int fd, uchar *p, long n, vlong *offp) { - long n, nn, nnn; - uchar *p; + long nn, nnn; Chan *c; vlong off; - n = arg[2]; - validaddr(arg[1], n, 1); - p = (void*)arg[1]; - c = fdtochan(arg[0], OREAD, 1, 1); + validaddr((uintptr)p, n, 1); + c = fdtochan(fd, OREAD, 1, 1); if(waserror()){ cclose(c); @@ -688,43 +694,51 @@ read(ulong *arg, vlong *offp) poperror(); cclose(c); - return nnn; } -long -sys_read(ulong *arg) +uintptr +sys_read(va_list list) { - return read(arg, nil); + int fd; + void *buf; + long len; + + fd = va_arg(list, int); + buf = va_arg(list, void*); + len = va_arg(list, long); + return (uintptr)read(fd, buf, len, nil); } -long -syspread(ulong *arg) +uintptr +syspread(va_list list) { - vlong v; - va_list list; - - /* use varargs to guarantee alignment of vlong */ - va_start(list, arg[2]); - v = va_arg(list, vlong); - va_end(list); - - if(v == ~0ULL) - return read(arg, nil); - - return read(arg, &v); + int fd; + void *buf; + long len; + vlong off, *offp; + + fd = va_arg(list, int); + buf = va_arg(list, void*); + len = va_arg(list, long); + off = va_arg(list, vlong); + if(off != ~0ULL) + offp = &off; + else + offp = nil; + return (uintptr)read(fd, buf, len, offp); } static long -write(ulong *arg, vlong *offp) +write(int fd, void *buf, long len, vlong *offp) { Chan *c; long m, n; vlong off; - validaddr(arg[1], arg[2], 0); + validaddr((uintptr)buf, len, 0); n = 0; - c = fdtochan(arg[0], OWRITE, 1, 1); + c = fdtochan(fd, OWRITE, 1, 1); if(waserror()) { if(offp == nil){ lock(c); @@ -738,7 +752,7 @@ write(ulong *arg, vlong *offp) if(c->qid.type & QTDIR) error(Eisdir); - n = arg[2]; + n = len; if(offp == nil){ /* use and maintain channel's offset */ lock(c); @@ -751,8 +765,7 @@ write(ulong *arg, vlong *offp) if(off < 0) error(Enegoff); - m = devtab[c->type]->write(c, (void*)arg[1], n, off); - + m = devtab[c->type]->write(c, buf, n, off); if(offp == nil && m < n){ lock(c); c->offset -= n - m; @@ -761,47 +774,51 @@ write(ulong *arg, vlong *offp) poperror(); cclose(c); - return m; } -long -sys_write(ulong *arg) +uintptr +sys_write(va_list list) { - return write(arg, nil); + int fd; + void *buf; + long len; + + fd = va_arg(list, int); + buf = va_arg(list, void*); + len = va_arg(list, long); + return (uintptr)write(fd, buf, len, nil); } -long -syspwrite(ulong *arg) +uintptr +syspwrite(va_list list) { - vlong v; - va_list list; - - /* use varargs to guarantee alignment of vlong */ - va_start(list, arg[2]); - v = va_arg(list, vlong); - va_end(list); - - if(v == ~0ULL) - return write(arg, nil); - - return write(arg, &v); + int fd; + void *buf; + long len; + vlong off, *offp; + + fd = va_arg(list, int); + buf = va_arg(list, void*); + len = va_arg(list, long); + off = va_arg(list, vlong); + if(off != ~0ULL) + offp = &off; + else + offp = nil; + return (uintptr)write(fd, buf, len, offp); } -static void -sseek(ulong *arg) +static vlong +sseek(int fd, vlong o, int type) { Chan *c; uchar buf[sizeof(Dir)+100]; Dir dir; int n; vlong off; - union { - vlong v; - ulong u[2]; - } o; - c = fdtochan(arg[1], -1, 1, 1); + c = fdtochan(fd, -1, 1, 1); if(waserror()){ cclose(c); nexterror(); @@ -810,11 +827,9 @@ sseek(ulong *arg) error(Eisstream); off = 0; - o.u[0] = arg[2]; - o.u[1] = arg[3]; - switch(arg[4]){ + switch(type){ case 0: - off = o.v; + off = o; if((c->qid.type & QTDIR) && off != 0) error(Eisdir); if(off < 0) @@ -826,7 +841,7 @@ sseek(ulong *arg) if(c->qid.type & QTDIR) error(Eisdir); lock(c); /* lock for read/write update */ - off = o.v + c->offset; + off = o + c->offset; if(off < 0){ unlock(c); error(Enegoff); @@ -841,7 +856,7 @@ sseek(ulong *arg) n = devtab[c->type]->stat(c, buf, sizeof buf); if(convM2D(buf, n, &dir, nil) == 0) error("internal error: stat error in seek"); - off = dir.length + o.v; + off = dir.length + o; if(off < 0) error(Enegoff); c->offset = off; @@ -850,38 +865,41 @@ sseek(ulong *arg) default: error(Ebadarg); } - *(vlong*)arg[0] = off; c->uri = 0; c->dri = 0; cclose(c); poperror(); + return off; } -long -sysseek(ulong *arg) +uintptr +sysseek(va_list list) { - validaddr(arg[0], BY2V, 1); - sseek(arg); + int fd, t; + vlong n, *v; + + v = va_arg(list, vlong*); + validaddr((uintptr)v, sizeof(vlong), 1); + + fd = va_arg(list, int); + n = va_arg(list, vlong); + t = va_arg(list, int); + + *v = sseek(fd, n, t); + return 0; } -long -sysoseek(ulong *arg) +uintptr +sysoseek(va_list list) { - union { - vlong v; - ulong u[2]; - } o; - ulong a[5]; - - o.v = (long)arg[1]; - a[0] = (ulong)&o.v; - a[1] = arg[0]; - a[2] = o.u[0]; - a[3] = o.u[1]; - a[4] = arg[2]; - sseek(a); - return o.v; + int fd, t; + long n; + + fd = va_arg(list, int); + n = va_arg(list, long); + t = va_arg(list, int); + return (uintptr)sseek(fd, n, t); } void @@ -926,58 +944,67 @@ pathlast(Path *p) return p->s; } -long -sysfstat(ulong *arg) +uintptr +sysfstat(va_list list) { Chan *c; + int fd; uint l; + uchar *s; - l = arg[2]; - validaddr(arg[1], l, 1); - c = fdtochan(arg[0], -1, 0, 1); + fd = va_arg(list, int); + s = va_arg(list, uchar*); + l = va_arg(list, uint); + validaddr((uintptr)s, l, 1); + + c = fdtochan(fd, -1, 0, 1); if(waserror()) { cclose(c); nexterror(); } - l = devtab[c->type]->stat(c, (uchar*)arg[1], l); + l = devtab[c->type]->stat(c, s, l); poperror(); cclose(c); return l; } -long -sysstat(ulong *arg) +uintptr +sysstat(va_list list) { char *name; Chan *c; - uint l; - - l = arg[2]; - validaddr(arg[1], l, 1); - validaddr(arg[0], 1, 0); - c = namec((char*)arg[0], Aaccess, 0, 0); + uint l, r; + uchar *s; + + name = va_arg(list, char*); + s = va_arg(list, uchar*); + l = va_arg(list, uint); + validaddr((uintptr)s, l, 1); + validaddr((uintptr)name, 1, 0); + c = namec(name, Aaccess, 0, 0); if(waserror()){ cclose(c); nexterror(); } - l = devtab[c->type]->stat(c, (uchar*)arg[1], l); + r = devtab[c->type]->stat(c, s, l); name = pathlast(c->path); if(name) - l = dirsetname(name, strlen(name), (uchar*)arg[1], l, arg[2]); + r = dirsetname(name, strlen(name), s, r, l); poperror(); cclose(c); - return l; + return r; } -long -syschdir(ulong *arg) +uintptr +syschdir(va_list list) { Chan *c; + char *name; - validaddr(arg[0], 1, 0); - - c = namec((char*)arg[0], Atodir, 0, 0); + name = va_arg(list, char*); + validaddr((uintptr)name, 1, 0); + c = namec(name, Atodir, 0, 0); cclose(up->dot); up->dot = c; return 0; @@ -999,7 +1026,7 @@ bindmount(int ismount, int fd, int afd, char* arg0, char* arg1, ulong flag, char error(Ebadarg); if(ismount){ - validaddr((ulong)spec, 1, 0); + validaddr((uintptr)spec, 1, 0); spec = validnamedup(spec, 1); if(waserror()){ free(spec); @@ -1033,7 +1060,7 @@ bindmount(int ismount, int fd, int afd, char* arg0, char* arg1, ulong flag, char cclose(bc); }else{ spec = 0; - validaddr((ulong)arg0, 1, 0); + validaddr((uintptr)arg0, 1, 0); c0 = namec(arg0, Abind, 0, 0); } @@ -1042,7 +1069,7 @@ bindmount(int ismount, int fd, int afd, char* arg0, char* arg1, ulong flag, char nexterror(); } - validaddr((ulong)arg1, 1, 0); + validaddr((uintptr)arg1, 1, 0); c1 = namec(arg1, Amount, 0, 0); if(waserror()){ cclose(c1); @@ -1063,33 +1090,59 @@ bindmount(int ismount, int fd, int afd, char* arg0, char* arg1, ulong flag, char return ret; } -long -sysbind(ulong *arg) +uintptr +sysbind(va_list list) { - return bindmount(0, -1, -1, (char*)arg[0], (char*)arg[1], arg[2], nil); + char *arg0, *arg1; + ulong flag; + + arg0 = va_arg(list, char*); + arg1 = va_arg(list, char*); + flag = va_arg(list, ulong); + return (uintptr)bindmount(0, -1, -1, arg0, arg1, flag, nil); } -long -sysmount(ulong *arg) +uintptr +sysmount(va_list list) { - return bindmount(1, arg[0], arg[1], nil, (char*)arg[2], arg[3], (char*)arg[4]); + char *arg1, *spec; + ulong flag; + int fd, afd; + + fd = va_arg(list, int); + afd = va_arg(list, int); + arg1 = va_arg(list, char*); + flag = va_arg(list, ulong); + spec = va_arg(list, char*); + return (uintptr)bindmount(1, fd, afd, nil, arg1, flag, spec); } -long -sys_mount(ulong *arg) +uintptr +sys_mount(va_list list) { - return bindmount(1, arg[0], -1, nil, (char*)arg[1], arg[2], (char*)arg[3]); + char *arg1, *spec; + ulong flag; + int fd; + + fd = va_arg(list, int); + arg1 = va_arg(list, char*); + flag = va_arg(list, ulong); + spec = va_arg(list, char*); + return (uintptr)bindmount(1, fd, -1, nil, arg1, flag, spec); } -long -sysunmount(ulong *arg) +uintptr +sysunmount(va_list list) { Chan *cmount, *cmounted; + char *name, *old; - cmounted = 0; + name = va_arg(list, char*); + old = va_arg(list, char*); - validaddr(arg[1], 1, 0); - cmount = namec((char *)arg[1], Amount, 0, 0); + cmounted = 0; + validaddr((uintptr)old, 1, 0); + cmount = namec(old, Amount, 0, 0); if(waserror()) { cclose(cmount); if(cmounted) @@ -1097,15 +1150,15 @@ sysunmount(ulong *arg) nexterror(); } - if(arg[0]) { + if(name) { /* * This has to be namec(..., Aopen, ...) because * if arg[0] is something like /srv/cs or /fd/0, * opening it is the only way to get at the real * Chan underneath. */ - validaddr(arg[0], 1, 0); - cmounted = namec((char*)arg[0], Aopen, OREAD, 0); + validaddr((uintptr)name, 1, 0); + cmounted = namec(name, Aopen, OREAD, 0); } cunmount(cmount, cmounted); poperror(); @@ -1115,15 +1168,19 @@ sysunmount(ulong *arg) return 0; } -long -syscreate(ulong *arg) +uintptr +syscreate(va_list list) { - int fd; + int fd, mode, perm; + char *name; Chan *c; - openmode(arg[1]&~OEXCL); /* error check only; OEXCL okay here */ - validaddr(arg[0], 1, 0); - c = namec((char*)arg[0], Acreate, arg[1], arg[2]); + name = va_arg(list, char*); + mode = va_arg(list, int); + perm = va_arg(list, int); + openmode(mode&~OEXCL); /* error check only; OEXCL okay here */ + validaddr((uintptr)name, 1, 0); + c = namec(name, Acreate, mode, perm); if(waserror()) { cclose(c); nexterror(); @@ -1132,16 +1189,18 @@ syscreate(ulong *arg) if(fd < 0) error(Enofd); poperror(); - return fd; + return (uintptr)fd; } -long -sysremove(ulong *arg) +uintptr +sysremove(va_list list) { + char *name; Chan *c; - validaddr(arg[0], 1, 0); - c = namec((char*)arg[0], Aremove, 0, 0); + name = va_arg(list, char*); + validaddr((uintptr)name, 1, 0); + c = namec(name, Aremove, 0, 0); /* * Removing mount points is disallowed to avoid surprises * (which should be removed: the mount point or the mounted Chan?). @@ -1191,31 +1250,39 @@ wstat(Chan *c, uchar *d, int nd) return l; } -long -syswstat(ulong *arg) +uintptr +syswstat(va_list list) { + char *name; + uchar *s; Chan *c; uint l; - l = arg[2]; - validaddr(arg[1], l, 0); - validstat((uchar*)arg[1], l); - validaddr(arg[0], 1, 0); - c = namec((char*)arg[0], Aaccess, 0, 0); - return wstat(c, (uchar*)arg[1], l); + name = va_arg(list, char*); + s = va_arg(list, uchar*); + l = va_arg(list, uint); + validaddr((uintptr)s, l, 0); + validstat(s, l); + validaddr((uintptr)name, 1, 0); + c = namec(name, Aaccess, 0, 0); + return (uintptr)wstat(c, s, l); } -long -sysfwstat(ulong *arg) +uintptr +sysfwstat(va_list list) { + uchar *s; Chan *c; uint l; + int fd; - l = arg[2]; - validaddr(arg[1], l, 0); - validstat((uchar*)arg[1], l); - c = fdtochan(arg[0], -1, 1, 1); - return wstat(c, (uchar*)arg[1], l); + fd = va_arg(list, int); + s = va_arg(list, uchar*); + l = va_arg(list, uint); + validaddr((uintptr)s, l, 0); + validstat(s, l); + c = fdtochan(fd, -1, 1, 1); + return (uintptr)wstat(c, s, l); } static void @@ -1252,19 +1319,21 @@ packoldstat(uchar *buf, Dir *d) PBIT16(p, d->dev); } -long -sys_stat(ulong *arg) +uintptr +sys_stat(va_list list) { Chan *c; uint l; - uchar buf[128]; /* old DIRLEN plus a little should be plenty */ + uchar *s, buf[128]; /* old DIRLEN plus a little should be plenty */ char strs[128], *name; Dir d; char old[] = "old stat system call - recompile"; - validaddr(arg[1], 116, 1); - validaddr(arg[0], 1, 0); - c = namec((char*)arg[0], Aaccess, 0, 0); + name = va_arg(list, char*); + s = va_arg(list, uchar*); + validaddr((uintptr)s, 116, 1); + validaddr((uintptr)name, 1, 0); + c = namec(name, Aaccess, 0, 0); if(waserror()){ cclose(c); nexterror(); @@ -1279,26 +1348,29 @@ sys_stat(ulong *arg) l = convM2D(buf, l, &d, strs); if(l == 0) error(old); - packoldstat((uchar*)arg[1], &d); + packoldstat(s, &d); poperror(); cclose(c); return 0; } -long -sys_fstat(ulong *arg) +uintptr +sys_fstat(va_list list) { Chan *c; char *name; uint l; - uchar buf[128]; /* old DIRLEN plus a little should be plenty */ + uchar *s, buf[128]; /* old DIRLEN plus a little should be plenty */ char strs[128]; Dir d; char old[] = "old fstat system call - recompile"; + int fd; - validaddr(arg[1], 116, 1); - c = fdtochan(arg[0], -1, 0, 1); + fd = va_arg(list, int); + s = va_arg(list, uchar*); + validaddr((uintptr)s, 116, 1); + c = fdtochan(fd, -1, 0, 1); if(waserror()){ cclose(c); nexterror(); @@ -1313,23 +1385,23 @@ sys_fstat(ulong *arg) l = convM2D(buf, l, &d, strs); if(l == 0) error(old); - packoldstat((uchar*)arg[1], &d); + packoldstat(s, &d); poperror(); cclose(c); return 0; } -long -sys_wstat(ulong *) +uintptr +sys_wstat(va_list) { error("old wstat system call - recompile"); - return -1; + return (uintptr)-1; } -long -sys_fwstat(ulong *) +uintptr +sys_fwstat(va_list) { error("old fwstat system call - recompile"); - return -1; + return (uintptr)-1; } |