Make newfd() take an int
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 24 Jul 2015 15:48:00 +0000 (11:48 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 27 Jul 2015 15:53:34 +0000 (11:53 -0400)
We want to pass the open flags, not a bool that says whether or not
there are any open flags.

Seeing this made me worry a bit about passing ints to functions that
take bools.  If we do e.g. oflags & O_CLOEXEC, that's actually an
integer greater than 256.  A bool is only 8 bits; are we then losing out
on the upper bits?

It turns out that things aren't as insane as they could be.  The compiler
converts an int to a bool:

void xme(int y)
{
    extern void foo(bool x);
    foo(y);
}

ffffffffc200ae80:   55                      push   %rbp
ffffffffc200ae81:   85 ff                   test   %edi,%edi
ffffffffc200ae83:   40 0f 95 c7             setne  %dil
ffffffffc200ae87:   48 89 e5                mov    %rsp,%rbp
ffffffffc200ae8a:   40 0f b6 ff             movzbl %dil,%edi
ffffffffc200ae8e:   5d                      pop    %rbp
ffffffffc200ae8f:   e9 7c 5d 04 00          jmpq   ffffffffc2050c10 <foo>

But not if it's a uint8!

void xme(int y)
{
    extern void foo(uint8_t x);
    foo(y);
}

ffffffffc200ae80:   55                      push   %rbp
ffffffffc200ae81:   40 0f b6 ff             movzbl %dil,%edi
ffffffffc200ae85:   48 89 e5                mov    %rsp,%rbp
ffffffffc200ae88:   5d                      pop    %rbp
ffffffffc200ae89:   e9 72 5d 04 00          jmpq   ffffffffc2050c00 <foo>

Good times.

kern/include/ns.h
kern/src/ns/sysfile.c

index d94d3c3..f17dc8e 100644 (file)
@@ -973,7 +973,7 @@ void cmderror(struct cmdbuf *cb, char *s);
 struct cmdtab *lookupcmd(struct cmdbuf *cb, struct cmdtab *ctab, int nctab);
 
 /* kern/src/ns/sysfile.c */
-int newfd(struct chan *c, bool oflags);
+int newfd(struct chan *c, int oflags);
 struct chan *fdtochan(struct fd_table *fdt, int fd, int mode, int chkmnt,
                       int iref);
 long kchanio(void *vc, void *buf, int n, int mode);
index 52b089b..05e4aa1 100644 (file)
@@ -53,7 +53,7 @@ static int growfd(struct fgrp *f, int fd)
        return 0;
 }
 
-int newfd(struct chan *c, bool oflags)
+int newfd(struct chan *c, int oflags)
 {
        int i;
        struct fgrp *f = current->open_files.fgrp;