M pc/ether589.c => pc/ether589.c +5 -1
@@ 123,12 123,15 @@ reset(Ether* ether)
if(ioalloc(port, 0x10, 0, "3C589") < 0)
return -1;
- if((slot = pcmspecial(ether->type, ether)) < 0)
+ if((slot = pcmspecial(ether->type, ether)) < 0){
+ iofree(port);
return -1;
+ }
/* try configuring as a 10BaseT */
if(configASIC(ether, port, xcvr10BaseT) < 0){
pcmspecialclose(slot);
+ iofree(port);
return -1;
}
delay(100);
@@ 143,6 146,7 @@ reset(Ether* ether)
COMMAND(port, GlobalReset, 0);
if(configASIC(ether, port, xcvr10Base2) < 0){
pcmspecialclose(slot);
+ iofree(port);
return -1;
}
print("#l%d: xcvr10Base2 %s\n", ether->ctlrno, ether->type);
M pc/etherelnk3.c => pc/etherelnk3.c +6 -2
@@ 1312,7 1312,7 @@ tcm509isa(void)
* it fully.
*/
while(port = activate()){
- if(ioalloc(port, 0x20, 0, "tcm509isa") < 0){
+ if(ioalloc(port, 0x10, 0, "tcm509isa") < 0){
print("tcm509isa:port %d in use\n", port);
continue;
}
@@ 1436,8 1436,12 @@ tcm5XXpcmcia(Ether* ether)
for(i = 0; tcmpcmcia[i] != nil; i++){
if(!cistrcmp(ether->type, tcmpcmcia[i])){
- if(ioalloc(ether->port, 0x20, 0, "tcm5XXpcmcia") < 0)
+ /*
+ * No need for an ioalloc here, the 589 reset
+ * code deals with it.
+ if(ioalloc(ether->port, 0x10, 0, "tcm5XXpcmcia") < 0)
return 0;
+ */
return ether->port;
}
}
M pc/vgas3.c => pc/vgas3.c +10 -1
@@ 64,12 64,14 @@ s3page(VGAscr* scr, int page)
static ulong
s3linear(VGAscr* scr, int* size, int* align)
{
- ulong aperture, oaperture;
+ ulong aperture, oaperture, osize;
int oapsize, wasupamem;
Pcidev *p;
+ Physseg seg;
oaperture = scr->aperture;
oapsize = scr->apsize;
+ osize = *size;
wasupamem = scr->isupamem;
if(wasupamem)
upafree(oaperture, oapsize);
@@ 90,6 92,13 @@ s3linear(VGAscr* scr, int* size, int* align)
else
scr->isupamem = 1;
+ memset(&seg, 0, sizeof(seg));
+ seg.attr = SG_PHYSICAL;
+ seg.name = smalloc(NAMELEN);
+ snprint(seg.name, NAMELEN, "s3screen");
+ seg.pa = aperture;
+ seg.size = osize;
+ addphysseg(&seg);
return aperture;
}
M port/chan.c => port/chan.c +5 -5
@@ 643,7 643,7 @@ saveregisters(void)
* In place, rewrite name to compress multiple /, eliminate ., and process ..
*/
void
-cleanname(Cname *n, int offset)
+cleancname(Cname *n, int offset)
{
char *p, *q, *dotdot, *name;
int rooted;
@@ 669,7 669,7 @@ cleanname(Cname *n, int offset)
if(q > dotdot) { /* can backtrack */
while(--q > dotdot && *q != '/')
;
- } else if(!rooted) { /* ``/..'' ≡ ``/'', but ``./../'' ≡ ``..'' */
+ } else if(!rooted) { /* /.. is / but ./../ is .. */
if(q != name)
*q++ = '/';
*q++ = '.';
@@ 685,7 685,7 @@ cleanname(Cname *n, int offset)
}
if(q == name) /* empty string is really ``.'' */
*q++ = '.';
- *q = 0;
+ *q = '\0';
n->len = (q-name) + offset;
}
@@ 910,9 910,9 @@ namec(char *name, int amode, int omode, ulong perm)
/* peculiar workaround for #/ */
if(newname){
if(cname->s[0]=='#' && cname->s[1]=='/')
- cleanname(cname, 2);
+ cleancname(cname, 1);
else
- cleanname(cname, 0);
+ cleancname(cname, 0);
cnameclose(c->name);
c->name = cname;
}else
M port/devdraw.c => port/devdraw.c +2 -2
@@ 1,9 1,9 @@
#include "u.h"
-#include "../port/lib.h"
+#include "lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
-#include "../port/error.h"
+#include "error.h"
#define Image IMAGE
#include <draw.h>
M port/devsrv.c => port/devsrv.c +3 -1
@@ 114,7 114,7 @@ srvopen(Chan *c, int omode)
error(Eshutdown);
if(omode&OTRUNC)
- error(Eperm);
+ error("srv file already exists");
if(openmode(omode)!=sp->chan->mode && sp->chan->mode!=ORDWR)
error(Eperm);
@@ 270,6 270,8 @@ srvwrite(Chan *c, void *va, long n, vlong)
cclose(c1);
nexterror();
}
+ if(c1->flag & (CCEXEC|CRCLOSE))
+ error("posted fd has remove-on-close or close-on-exec");
sp = srvlookup(nil, c->qid.path);
if(sp == 0)
error(Enonexist);
M port/lib.h => port/lib.h +2 -1
@@ 66,7 66,8 @@ extern int print(char*, ...);
/*
* one-of-a-kind
*/
-ulong getcallerpc(void*);
+extern char* cleanname(char*);
+extern ulong getcallerpc(void*);
extern long strtol(char*, char**, int);
extern ulong strtoul(char*, char**, int);
extern vlong strtoll(char*, char**, int);