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)
commitb296da9e1ed1d4b20b33f13533a2ef07f693d1ca
tree9fd00c6ebe0766f866a6438c7d8c2f8f95f44582
parent395784cdf2b20ee7cf567561b8683f90e1db6344
Make newfd() take an int

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