syssem*: eleminate redundant validaddr() checks
validaddr looks up the segments for an address range and checks the flags and if the address range lies within bounds on the segments. as we'r going to lookup the segment in the syssem* syscalls anyway, we can do the checks ourselfs avoiding the double segment array lookups. the implication of this tho is that now a semaphore cannot span multiple segments. but this would be highly unusual given that segments are page aligned.
This commit is contained in:
parent
365fd745d6
commit
62b3eea271
|
@ -1109,13 +1109,15 @@ syssemacquire(ulong *arg)
|
||||||
long *addr;
|
long *addr;
|
||||||
Segment *s;
|
Segment *s;
|
||||||
|
|
||||||
validaddr(arg[0], sizeof(long), 1);
|
|
||||||
evenaddr(arg[0]);
|
evenaddr(arg[0]);
|
||||||
addr = (long*)arg[0];
|
addr = (long*)arg[0];
|
||||||
block = arg[1];
|
block = arg[1];
|
||||||
|
|
||||||
if((s = seg(up, (ulong)addr, 0)) == nil)
|
s = seg(up, (ulong)addr, 0);
|
||||||
|
if(s == nil || (s->type&SG_RONLY) != 0 || (ulong)addr+sizeof(long) > s->top){
|
||||||
|
validaddr((ulong)addr, sizeof(long), 1);
|
||||||
error(Ebadarg);
|
error(Ebadarg);
|
||||||
|
}
|
||||||
if(*addr < 0)
|
if(*addr < 0)
|
||||||
error(Ebadarg);
|
error(Ebadarg);
|
||||||
return semacquire(s, addr, block);
|
return semacquire(s, addr, block);
|
||||||
|
@ -1128,13 +1130,15 @@ systsemacquire(ulong *arg)
|
||||||
ulong ms;
|
ulong ms;
|
||||||
Segment *s;
|
Segment *s;
|
||||||
|
|
||||||
validaddr(arg[0], sizeof(long), 1);
|
|
||||||
evenaddr(arg[0]);
|
evenaddr(arg[0]);
|
||||||
addr = (long*)arg[0];
|
addr = (long*)arg[0];
|
||||||
ms = arg[1];
|
ms = arg[1];
|
||||||
|
|
||||||
if((s = seg(up, (ulong)addr, 0)) == nil)
|
s = seg(up, (ulong)addr, 0);
|
||||||
|
if(s == nil || (s->type&SG_RONLY) != 0 || (ulong)addr+sizeof(long) > s->top){
|
||||||
|
validaddr((ulong)addr, sizeof(long), 1);
|
||||||
error(Ebadarg);
|
error(Ebadarg);
|
||||||
|
}
|
||||||
if(*addr < 0)
|
if(*addr < 0)
|
||||||
error(Ebadarg);
|
error(Ebadarg);
|
||||||
return tsemacquire(s, addr, ms);
|
return tsemacquire(s, addr, ms);
|
||||||
|
@ -1146,13 +1150,15 @@ syssemrelease(ulong *arg)
|
||||||
long *addr, delta;
|
long *addr, delta;
|
||||||
Segment *s;
|
Segment *s;
|
||||||
|
|
||||||
validaddr(arg[0], sizeof(long), 1);
|
|
||||||
evenaddr(arg[0]);
|
evenaddr(arg[0]);
|
||||||
addr = (long*)arg[0];
|
addr = (long*)arg[0];
|
||||||
delta = arg[1];
|
delta = arg[1];
|
||||||
|
|
||||||
if((s = seg(up, (ulong)addr, 0)) == nil)
|
s = seg(up, (ulong)addr, 0);
|
||||||
|
if(s == nil || (s->type&SG_RONLY) != 0 || (ulong)addr+sizeof(long) > s->top){
|
||||||
|
validaddr((ulong)addr, sizeof(long), 1);
|
||||||
error(Ebadarg);
|
error(Ebadarg);
|
||||||
|
}
|
||||||
/* delta == 0 is a no-op, not a release */
|
/* delta == 0 is a no-op, not a release */
|
||||||
if(delta < 0 || *addr < 0)
|
if(delta < 0 || *addr < 0)
|
||||||
error(Ebadarg);
|
error(Ebadarg);
|
||||||
|
|
Loading…
Reference in a new issue