6 years agoUpdate pthread futex_waiti() to unlock after yield
Kevin Klues [Fri, 31 Jan 2014 22:00:35 +0000 (14:00 -0800)]
Update pthread futex_waiti() to unlock after yield

The previous version of the futex code was adopted from the linux parlib
code, which doesn't have to worry about uthreads spuriously dropping
into vcore context while not holding a pdr lock.  Without this change,
it was possible for a vcore to spin indefinitely on a futex_wait() while
the uthread it was trying to wake had not actually yielded yet (and
couldn't because it was trying to yield on the very same vcore that was
spinning trying to wake it).

With this change we now have to hold the futex lock a little longer, but
it is necessary for correctness.  In the future, we will probably want
to use some sort of hashtable to maintain one lock per futex, rather
than a global futex lock, and this will help alleviate some of these

6 years agox86: Fixes smp_call_function
Barret Rhoden [Fri, 31 Jan 2014 21:54:49 +0000 (13:54 -0800)]
x86: Fixes smp_call_function

This broke back when I added multiple IRQ handlers to a given vector.
Old handler/data pairs were never being removed.

6 years agoFixes vendor_id
Barret Rhoden [Fri, 31 Jan 2014 21:22:38 +0000 (13:22 -0800)]
Fixes vendor_id

Need to return something, compiler warning.

6 years agoFix up the msr command to run on all cores
Ronald G. Minnich [Fri, 31 Jan 2014 20:32:51 +0000 (12:32 -0800)]
Fix up the msr command to run on all cores

save it now behaves very badly, usually causing traps.


Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agosys_readlink works.
Ronald G. Minnich [Fri, 31 Jan 2014 20:11:21 +0000 (12:11 -0800)]
sys_readlink works.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoFix up sys*stat
Ronald G. Minnich [Fri, 31 Jan 2014 20:02:39 +0000 (12:02 -0800)]
Fix up sys*stat

I'd rather not go into how big a mess I made of these
functions. It's all better now.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoCreate akaros wrappers for sysstat and sysfstat
Ronald G. Minnich [Fri, 31 Jan 2014 16:50:38 +0000 (08:50 -0800)]
Create akaros wrappers for sysstat and sysfstat

We'll need this as we need to see the raw dir struct
for sys_readlink.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoProperly pass S_IFLINK back
Ronald G. Minnich [Fri, 31 Jan 2014 16:25:27 +0000 (08:25 -0800)]
Properly pass S_IFLINK back

If DMSYMLINK is set, convert it to S_IFLINK.
We now see proper stat for files served by (e.g.) ufs.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoAdd the inferno mkroot script
Ronald G. Minnich [Fri, 31 Jan 2014 16:18:39 +0000 (08:18 -0800)]
Add the inferno mkroot script

I used this to build the code currently in kern/drivers/dev/root.c

It's handy for reference. It's also no longer right for the structs
in there.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoAdd the e1000 kbuild
Ronald G. Minnich [Fri, 31 Jan 2014 16:17:48 +0000 (08:17 -0800)]
Add the e1000 kbuild

This is the gpxe driver. We'll either finish it or dump it,
although 'dump it' now seems the likelier choice

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoPrint the name of the device as well as the pointers
Ronald G. Minnich [Fri, 31 Jan 2014 16:17:17 +0000 (08:17 -0800)]
Print the name of the device as well as the pointers

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoAdd DMSYMLINK
Ronald G. Minnich [Fri, 31 Jan 2014 16:16:25 +0000 (08:16 -0800)]

the value is compatible with 9p2000.u

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoadd a command to read and write msrs
Ronald G. Minnich [Fri, 31 Jan 2014 16:15:51 +0000 (08:15 -0800)]
add a command to read and write msrs

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agovmx: don't try to do vmx on cpus that don't do vmx.
Ronald G. Minnich [Fri, 31 Jan 2014 15:56:49 +0000 (07:56 -0800)]
vmx: don't try to do vmx on cpus that don't do vmx.

Which seems obvious, doesn't it?

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoAdd a function to return vendor_id string
Ronald G. Minnich [Fri, 31 Jan 2014 15:55:32 +0000 (07:55 -0800)]
Add a function to return vendor_id string

Needed so we can figure out what we are.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoFixes krealloc()
Barret Rhoden [Thu, 30 Jan 2014 23:57:46 +0000 (15:57 -0800)]
Fixes krealloc()

Two things:

1) It was assuming the memory of buf was from a slab.  For large
regions, it's from contiguous memory.

2) It was assuming that the size of the memory from whatever source
(slab or pages) was for the entire buffer.  We need room for the kmalloc

Something like this happened: a krealloc to 8192 thought that it had
8192 already, even though it was just shy of 8192.  The memmove
(probably) clobbered the slab allocator bufctl of the object, which is
stored right after the slab object.  Random bytes then were interpreted
as a pointer, which caused a GPF (the address was non-canonical).

Man, krealloc for large regions has to be terribly slow.  The only thing
worse than our contiguous page allocator is calling the contiguous page
allocator repeatedly.

6 years agoAdds rootwstat, for chmod
Barret Rhoden [Thu, 30 Jan 2014 20:21:34 +0000 (12:21 -0800)]
Adds rootwstat, for chmod

Plus some other chmod tidbits.

I also have a new busybox config, with chmod built in.  You'll need to
copy it to your .config, rebuild busybox, and load it in KFS.

6 years agoTest script for the vm device.
Ronald G. Minnich [Thu, 30 Jan 2014 21:46:00 +0000 (13:46 -0800)]
Test script for the vm device.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agochmod() touchups
Barret Rhoden [Thu, 30 Jan 2014 19:13:23 +0000 (11:13 -0800)]
chmod() touchups

Mode sanitization, t_path memory, and syswstat doesn't throw errors.

6 years agoSample chmod implementation.
Ronald G. Minnich [Thu, 30 Jan 2014 18:41:32 +0000 (10:41 -0800)]
Sample chmod implementation.

You'll need this sort of thing for rename, chown, etc.
Anything that does a wstat.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoProperly extract errno from p9 rpc; fix incorrect mkdir error
Ronald G. Minnich [Thu, 30 Jan 2014 18:08:04 +0000 (10:08 -0800)]
Properly extract errno from p9 rpc; fix incorrect mkdir error

mkdir /mnt/tmp/xxx would fail with the wrong errno (EEXIST)
because we could not properly get errno from the Plan 9 RPC.

I've fixed my version of go9p (github.com/rminnich/go9p) to
return Rerror strings in the form 'XXXX error message'
(space after XXXX is important) where XXXX is the hex-encoded
errno (this is how I did it for the original Linux 9p in 1998).
This format has the advantage of being all text; later implementations
(e.g. 9p2000.[ul]) break the rule and embed binary data in the string
and were a backward step IMHO.

I've fixed Akaros 9p parsing to look for a string at least 5 bytes long,
with the first 4 bytes being hex digits, and if that is the case to
set_errno using those digits.

I added get_errno to allow code to save the current errno value.

Finally, in the namec create case, I save errno as well as errstr
and restore them on the errpath.

mkdir /mnt/tmp/xxx now returns the correct errno/error message.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoDevroot fixup
Barret Rhoden [Thu, 30 Jan 2014 03:08:31 +0000 (19:08 -0800)]
Devroot fixup

There's a lot of changes, especially with gen.  There are also some bug
fixes that aren't as big of a deal.  Gen is usually the hard part.

6 years agoQTFILE isn't 0...
Barret Rhoden [Thu, 30 Jan 2014 02:37:40 +0000 (18:37 -0800)]
QTFILE isn't 0...

This might cause some bugs, but I can't stand when we use the value 0
for a bit.  You can't tell the difference between no type and QTFILE.

6 years agoFixes remove bug
Barret Rhoden [Wed, 29 Jan 2014 23:48:20 +0000 (15:48 -0800)]
Fixes remove bug

Inferno has this annoying habit of assuming a dev type == 0 means "do a
noop on close".  Devroot used to be the first in the devtab, but we
can't guarantee that since devtab is built by the linker.

6 years agoFixes mkdir
Barret Rhoden [Wed, 29 Jan 2014 23:45:16 +0000 (15:45 -0800)]
Fixes mkdir

I think.  We should be passing DMDIR in the perms argument.  Also, this
tries to catch issues with nasty "mode"/permissions from userspace.

6 years agoFile creation working but ... broken
Ronald G. Minnich [Wed, 29 Jan 2014 21:48:43 +0000 (13:48 -0800)]
File creation working but ... broken

try cp /root '#r/srv/root'

The error is
rootcreate: c 0xffff80007fff8850, name root, omode 1101, perm 81ed
kernel warning at kern/src/ns/sysfile.c:113, from core 0: Trunc mode issue: mode 1, mode minus trunc 1, chan mode 0

So somehow the chan mode is getting set wrong.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agomkdir works.
Ronald G. Minnich [Wed, 29 Jan 2014 20:51:15 +0000 (12:51 -0800)]
mkdir works.

Was checking in the wrong place.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoFinally! at least the hierarchy is right
Ronald G. Minnich [Wed, 29 Jan 2014 20:37:50 +0000 (12:37 -0800)]
Finally! at least the hierarchy is right

There were some issues due to the changed use of this code.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoLindent pass
Barret Rhoden [Wed, 29 Jan 2014 20:14:58 +0000 (12:14 -0800)]
Lindent pass

Downside: it messes up git's history for specific lines.

Here's a useful command (from the last time we did this):

git diff --name-status master..HEAD | grep '^A' | cut -f 2 | grep
'^kern' | grep -v Kbuild | xargs ./scripts/lindent

6 years agoCloser.
Ronald G. Minnich [Wed, 29 Jan 2014 15:57:43 +0000 (07:57 -0800)]

File creation kind of works. Turns out the ptr struct member
in the table is the child pointer for directories, which I
should have realized. The translation from NIX to Inferno
keeps bollixing me up.

No more kernel panics, things seem to be right, but
mkdir #r/srv/x
cat #r/srv
shows x there, but 'ls '#r/srv' gets an error that x is not

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agorootdev with a bit fewer errors.
Ronald G. Minnich [Wed, 29 Jan 2014 15:14:05 +0000 (07:14 -0800)]
rootdev with a bit fewer errors.

mkdir '#r/srv' followed by 'ls '#r/srv' panics akaros.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoLess braindead root. I'm about half way through.
Ronald G. Minnich [Wed, 29 Jan 2014 04:16:43 +0000 (20:16 -0800)]
Less braindead root. I'm about half way through.

Just sat back, made some rules that seem to make sense,
added the opcodes, and the bits that are finished work as expected.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoNot very good implementation of root file system
Ronald G. Minnich [Mon, 27 Jan 2014 19:51:05 +0000 (11:51 -0800)]
Not very good implementation of root file system

mkdir sort of works. A lot else doesn't but I need to tend
to some other fires. If you don't agree with my bias against
linked lists then feel free to redo.

Sorry, wish this were better.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoMakes mount slightly more useful
Barret Rhoden [Wed, 29 Jan 2014 19:56:50 +0000 (11:56 -0800)]
Makes mount slightly more useful

Couldn't pass more than one flag (e.g. -a and -c).

6 years agoFixes a few warnings and printfmt %i
Barret Rhoden [Wed, 29 Jan 2014 19:45:02 +0000 (11:45 -0800)]
Fixes a few warnings and printfmt %i

The warning was hiding the wrong order of hnputl.  Hopefully this does
what we want.  =)

I also commented out the mii.c, which we're not using right now.

6 years agoAdds chaninfo()
Barret Rhoden [Wed, 29 Jan 2014 19:34:08 +0000 (11:34 -0800)]
Adds chaninfo()

This is useful for debugging.  Most devices will use devchaninfo.  But
if you want to spit out extra info, take a look at ipchaninfo.

This info will show up now when we do a "procinfo pid #" from the kernel
monitor.  We could also use it from procfs in the future.

6 years agoMoved devtab and dev to k/s/ns
Barret Rhoden [Wed, 29 Jan 2014 19:08:07 +0000 (11:08 -0800)]
Moved devtab and dev to k/s/ns

They aren't really devices, just support stuff.

6 years agoDev zeros the dir path before genning
Barret Rhoden [Thu, 14 Nov 2013 20:58:25 +0000 (12:58 -0800)]
Dev zeros the dir path before genning

It's useful for devices to be able to get information about the last run
through their gen function when run in a tight loop.  There's no good
way to do pass an arbitrary value back, but we can use the dir to
communicate the result of the previous run.  So long as we handle the
initial case.

Gens communicate via the dir, and dir->qid.path is the last path used in
the previous run.  This works if we can bootstrap it, and passing in
gibberish (on the stack) or ancient versions of dir will mess things up.
So now any caller of a gen in a loop will make sure dir's path is 0.

Also, it's not sufficient to just check for {s,i} == 0 to detect the
"first run" of a gen.  Sometimes (devdirread()), a device will be asked
to gen starting at a higher value of its iterator.  By zeroing dir's
path, a gen can tell if it is in the middle or not of a series of runs.

6 years agoFixes netifgen
Barret Rhoden [Wed, 29 Jan 2014 18:55:38 +0000 (10:55 -0800)]
Fixes netifgen

This was a problem from back in plan9, which I fixed in our NxM port.

The root issue is that netif code can't tell the difference between a
QID with a netid of 0 and one with no netid at all.  I think I fixed it.
I left in my comments for the next time we need to debug this.

6 years agoSimple mount command
Barret Rhoden [Wed, 29 Jan 2014 03:11:49 +0000 (19:11 -0800)]
Simple mount command

Based off bind.  Doesn't do anything with auth or similar things.  Feel
free to replace this.  =)

6 years agoFix O_TRUNC for devmnt
Barret Rhoden [Wed, 29 Jan 2014 00:45:23 +0000 (16:45 -0800)]
Fix O_TRUNC for devmnt

We have different bits for OTRUNC than 9p, so we need to convert.

6 years ago9ns supports O_APPEND
Barret Rhoden [Tue, 28 Jan 2014 22:54:38 +0000 (14:54 -0800)]
9ns supports O_APPEND

Should be able to set it via fcntl/setfl or during open().

6 years agogetfl and setfl for 9ns
Barret Rhoden [Tue, 28 Jan 2014 22:45:51 +0000 (14:45 -0800)]
getfl and setfl for 9ns

Check out the comments about fd_getfl() for my overall thoughts on the

6 years agoFixes #s
Barret Rhoden [Tue, 28 Jan 2014 22:04:54 +0000 (14:04 -0800)]
Fixes #s

Looks like we won't be able to hang reference counted objects off of
c->aux, such that those objects change as we gen new entries.  The final
culprit was devclone, which copies aux, but doesn't incref.  And later,
it may or may not call the device's close.

We can still put reference counted things on c->aux, but they need to
not change during walks.  Check out devpipe and devip for examples.

6 years agoTemporary fix for kdirent reading
Barret Rhoden [Tue, 28 Jan 2014 21:06:07 +0000 (13:06 -0800)]
Temporary fix for kdirent reading

We need to read exactly one entry.  This doesn't work with mntread right
now, since UFS returns 0 instead of an error when the read buffer is too
small.  That might be a bug.

If you notice directory entries that are missing when you do an ls, let
us know.

6 years agoFixes rm and mkdir for KFS
Barret Rhoden [Mon, 27 Jan 2014 23:35:01 +0000 (15:35 -0800)]
Fixes rm and mkdir for KFS

Attempts in the VFS, as usual, and falls back to 9ns when it fails.

6 years agoSupport for building directories outside the repo
Barret Rhoden [Sun, 26 Jan 2014 22:20:59 +0000 (14:20 -0800)]
Support for building directories outside the repo

If you have a directory, say a custom device, that you want compiled and
linked into the kernel, you can either set up an environment variable or
simply pass a variable to make:

$ export AKAROS_EXTERNAL_DIRS="../some-path/outside-repo/"
$ make

Run make from the usual place, in the Akaros repo.  Kbuild will build
that directory and link it into the final kernel binary.

You can have more than one directory.  They must be space separated.
You can do something like:


All directories must have a Kbuild file, and must produce at least one
.o file.  Whatever CONFIG variables are in the main kernel work here,
though I didn't build in Kconfig support.

Whatever functions you have in external directories won't get called
automatically.  Use linker function macros to get your initialization
routines run, and hopefully that's enough.  It should be for most plan9
style devices.

6 years agoFixes ether initialization
Barret Rhoden [Sun, 26 Jan 2014 22:07:42 +0000 (14:07 -0800)]
Fixes ether initialization

We were unable to initialize more than one ethernet card.  Whichever was
linked in first would have its reset method run each time.

This ethernet init needs work anyways - seems like a lot of extra allocs
and resets.

6 years agoTake the gpxe stuff out of the build.
Ronald G. Minnich [Sun, 26 Jan 2014 22:37:10 +0000 (14:37 -0800)]
Take the gpxe stuff out of the build.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoA bit further.
Ronald G. Minnich [Sun, 26 Jan 2014 22:34:51 +0000 (14:34 -0800)]
A bit further.

We really need to figure out outl(int, ...) vs outl(void *, ...)

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoStart to get e1000 into a shape we can use
Ronald G. Minnich [Sun, 26 Jan 2014 22:15:12 +0000 (14:15 -0800)]
Start to get e1000 into a shape we can use

It's not as bad as it looks. I've got to bail for a bit, but I suggest
we get the mac, then nvm code to build, then see which model we want to

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoMII driver I forgot to push
Ronald G. Minnich [Sun, 26 Jan 2014 16:42:05 +0000 (08:42 -0800)]
MII driver I forgot to push

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agogpx e1000 driver.
Ronald G. Minnich [Sun, 26 Jan 2014 16:41:33 +0000 (08:41 -0800)]
gpx e1000 driver.

15KLOC. Geez. Which of the subdrivers can we do without?

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoThe 8169 and mii from gpxe now build
Ronald G. Minnich [Sun, 26 Jan 2014 16:26:13 +0000 (08:26 -0800)]
The 8169 and mii from gpxe now build

Question: outl takes an int, but should probably take a
uintptr, or not? On MMIO systems it really should be 64-bit
thing, but on standard x86 it's 32 bits, and on (sigh) an alpha
it would be 64 bits without regard to it being IO or MMIO.

Need to redo the pci usage.

And, need to make it a real ether driver. I'm going to put the
basic structure in there for that now, based on the 8139.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoAdd 8169 drivers from etherboot/gpxe
Ronald G. Minnich [Sun, 26 Jan 2014 15:32:53 +0000 (07:32 -0800)]
Add 8169 drivers from etherboot/gpxe

This project is a good source of basic drivers. Since they are
polling-loop driven they're an easier match to our driver style.

Part of this work will be the semantic patches to adapt these
drivers to akaros.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agounlink and mkdir
Ronald G. Minnich [Sun, 26 Jan 2014 05:35:28 +0000 (21:35 -0800)]
unlink and mkdir

They don't work but this is how it probably
ought to look.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoClean up docs on 9p netroot
Ronald G. Minnich [Sat, 25 Jan 2014 05:50:33 +0000 (21:50 -0800)]
Clean up docs on 9p netroot

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoRemoves extra print funcs from devcons
Barret Rhoden [Sat, 25 Jan 2014 01:25:26 +0000 (17:25 -0800)]
Removes extra print funcs from devcons

Unused, and if they were used, we should probably use our own.

6 years agoFix mount chan type error
Barret Rhoden [Sat, 25 Jan 2014 01:24:39 +0000 (17:24 -0800)]
Fix mount chan type error

6 years agoSets ENOENT when appropriate
Barret Rhoden [Sat, 25 Jan 2014 01:10:37 +0000 (17:10 -0800)]
Sets ENOENT when appropriate

Userspace will often require ENOENT be set after syscalls fail in a
certain way.  For instance, cp stats the destination, and if it gets a
generic error, the program aborts.  It ought to get ENOENT (or success).

We'll run into this in any place where userspace makes decisions based
on errno.

6 years agoBetter errstrs when namec fails
Barret Rhoden [Fri, 24 Jan 2014 23:24:43 +0000 (15:24 -0800)]
Better errstrs when namec fails

6 years agoAdds /mnt/ to #r
Barret Rhoden [Fri, 24 Jan 2014 21:25:15 +0000 (13:25 -0800)]
Adds /mnt/ to #r

Not the ideal way.  I'd like a writeable ramfs anyway.

6 years agoAdds srv utility program
Barret Rhoden [Fri, 24 Jan 2014 21:16:39 +0000 (13:16 -0800)]
Adds srv utility program


6 years agoRewrite of #s
Barret Rhoden [Fri, 24 Jan 2014 20:25:52 +0000 (12:25 -0800)]
Rewrite of #s

Hopefully the c->aux style isn't too broken.

6 years agoFixes minor bugs in #A
Barret Rhoden [Fri, 24 Jan 2014 20:11:03 +0000 (12:11 -0800)]
Fixes minor bugs in #A

6 years agoClarifies O_TRUNC warnings
Barret Rhoden [Fri, 24 Jan 2014 20:09:08 +0000 (12:09 -0800)]
Clarifies O_TRUNC warnings

And some dev debugging.

6 years agonet.c is no longer needed
Ronald G. Minnich [Fri, 24 Jan 2014 03:01:34 +0000 (19:01 -0800)]
net.c is no longer needed

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoadd the 'i' and 'V' formats back
Ronald G. Minnich [Thu, 23 Jan 2014 17:25:08 +0000 (09:25 -0800)]
add the 'i' and 'V' formats back

'i' is ipv6 as four longs, V is ipv4.
This completes restoring well-known plan 9 formats
to the kernel.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoUser-level dial and get_html update
Barret Rhoden [Thu, 23 Jan 2014 01:19:59 +0000 (17:19 -0800)]
User-level dial and get_html update

To use, #include <net.h>.  Later, I might write announce() and whatever
others we need.

We can move dial() or snprintf_overflow() somewhere else, if we want.

6 years agoFix minor TCP-blocking bugs
Barret Rhoden [Thu, 23 Jan 2014 00:45:56 +0000 (16:45 -0800)]
Fix minor TCP-blocking bugs

The hash bug fix was from 034f947dd.

6 years agoAdds custom printf formats
Barret Rhoden [Tue, 15 Oct 2013 20:52:18 +0000 (13:52 -0700)]
Adds custom printf formats

The specifier %r will print the contents of errstr, installed by
default.  Any others need to be manually installed.

For example:
register_printf_specifier('i', printf_ipaddr, printf_ipaddr_info);

See tests/printf-ext.c for some examples.

If you want to add your own, add them to parlib/printf-ext.c.  Check out
the comments for ipaddr and ipaddr_info for details.  Once you get the
hang of it, it's pretty simple.

Also, some letters can't have a specifier installed onto it, such as %I
and other special chars.

6 years agoUse linker functions for NIC and medium pre-init
Barret Rhoden [Wed, 22 Jan 2014 21:05:02 +0000 (13:05 -0800)]
Use linker functions for NIC and medium pre-init

I picked levels 3 and 4, so it'll be easier to use the lower levels.  We
can always add higher levels as needed, but adding additional lower
levels will require changing exist call sites (e.g. all linker_func_3
need to be incremented).

6 years agoLinker functions
Barret Rhoden [Wed, 22 Jan 2014 20:56:54 +0000 (12:56 -0800)]
Linker functions

We can run functions automatically during kernel initialization.  If you
want a void foo(void) func to run, write it like this:


The functions will run in any order within a level, and lower levels
will run before higher levels.

6 years agoRestores ifconfig to its normal setting
Barret Rhoden [Wed, 22 Jan 2014 19:26:42 +0000 (11:26 -0800)]
Restores ifconfig to its normal setting

You can now:

$ ash ifconfig
$ ping

with the rtl8139.

6 years agortl8139 port
Barret Rhoden [Wed, 22 Jan 2014 19:07:34 +0000 (11:07 -0800)]
rtl8139 port

We don't support some of the ether->opts yet, probably due to a lack of
archether().  If we had it, the detection would make a little more sense
(they alloc a ctlr for every NIC, and then later find out via the opts
if it's an 8139).

We also don't do some of the mmu stuff, though maybe we should.

6 years agoCalls devtabreset()
Barret Rhoden [Wed, 22 Jan 2014 19:06:40 +0000 (11:06 -0800)]
Calls devtabreset()

Not sure if we should do reset before or after init.  Inferno, nxm, and
plan9 might have had different meanings for these.

6 years agoFixes MAC addr formatting
Barret Rhoden [Wed, 22 Jan 2014 18:59:50 +0000 (10:59 -0800)]
Fixes MAC addr formatting

This is actually really important.  etherbind eventually calls
netifread, and translates the string back and forth.  So writing it out
in decimal then reading it back as hex resulted in some messed up
bindings, where our card thought it had the wrong address.  Ah, strings.

6 years agoFixes qio irqsave lock
Barret Rhoden [Wed, 22 Jan 2014 18:18:22 +0000 (10:18 -0800)]
Fixes qio irqsave lock

6 years agoFixes netif binding
Barret Rhoden [Sun, 20 Oct 2013 17:01:28 +0000 (10:01 -0700)]
Fixes netif binding

We were setting the netfile's type to 0, which means we would never
detect/match any incoming packets.  This includes broadcast packets that
we sent ourselves (such as an arp, telling us that we are

The root issue is atoi vs strtol.  I ran into this issue a while ago,
and atoi should catch any further cases of this.

6 years agoLindented 8139
Barret Rhoden [Wed, 22 Jan 2014 04:47:59 +0000 (20:47 -0800)]
Lindented 8139

Might as well do it sooner than later.

6 years agoInitial cut at srv device
Ronald G. Minnich [Wed, 22 Jan 2014 18:48:20 +0000 (10:48 -0800)]
Initial cut at srv device

This is from inferno but is quite cut down.
Needs more work but at least it builds.
Not functional.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoFirst pass at proc
Ronald G. Minnich [Wed, 22 Jan 2014 17:41:08 +0000 (09:41 -0800)]
First pass at proc

This is a placeholder.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoAdd %E, %I, and %M formats.
Ronald G. Minnich [Wed, 22 Jan 2014 17:24:48 +0000 (09:24 -0800)]
Add %E, %I, and %M formats.

%E will print an enet mac.

%I will take a uint8_t * and figure out what kind of address
it is and print it. %M does that for masks.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoAdd eipconvtest.c to user libraries
Ronald G. Minnich [Wed, 22 Jan 2014 16:43:38 +0000 (08:43 -0800)]
Add eipconvtest.c to user libraries

Leave at top level for now. Not sure where it belongs.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoFix up eipconvtest.c
Ronald G. Minnich [Wed, 22 Jan 2014 16:41:16 +0000 (08:41 -0800)]
Fix up eipconvtest.c

This runs under linux now and it prints out IP address strings.
The only problem is ... we don't know the right value. The unit
test did not include them. Ah well, at least it *seems* right.

This file will get copied to user libraries and then it's time to
fix it up for the kernel.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoMoved 8139 NIC driver to k/d/net/
Barret Rhoden [Wed, 22 Jan 2014 00:39:44 +0000 (16:39 -0800)]
Moved 8139 NIC driver to k/d/net/

6 years agoFixes OREAD / omode checks
Barret Rhoden [Tue, 21 Jan 2014 22:08:40 +0000 (14:08 -0800)]
Fixes OREAD / omode checks

The idea behind 424240126 was alright, but when we masked with OREAD, we
were just zeroing everything out.  Did I mention having OREAD/O_RDONLY
the value zero is a bad idea?

Now, we can use the more clear helper IS_RDONLY().  Which we can change
later if so desired.

6 years agoFix a bunch of %lud and %lux
Barret Rhoden [Tue, 21 Jan 2014 21:51:48 +0000 (13:51 -0800)]
Fix a bunch of %lud and %lux

Plan9 has a bunch of trailing ds and xs that our printks don't support.

6 years agoPipe cleanup (XCC)
Barret Rhoden [Tue, 21 Jan 2014 21:16:52 +0000 (13:16 -0800)]
Pipe cleanup (XCC)

Using the 9ns pipes exclusively, so no need for SYS_npipe.

Note the omode change.  That goes back to 424240126c, and it'll be a
concern for all new devices.

Reinstall your kernel headers (or just don't use SYS_npipe).

6 years agoFix VFS hack bug
Barret Rhoden [Tue, 21 Jan 2014 21:09:03 +0000 (13:09 -0800)]
Fix VFS hack bug

Dup wasn't returning the lowest available FD, since the VFS wasn't
telling 9ns about closing its FDs.

6 years agoAdds bind to userspace
Barret Rhoden [Tue, 21 Jan 2014 18:59:37 +0000 (10:59 -0800)]
Adds bind to userspace

6 years agoUses apipes and no alarms for random numbers
Barret Rhoden [Tue, 21 Jan 2014 18:49:29 +0000 (10:49 -0800)]
Uses apipes and no alarms for random numbers

This is better than my old 9ns change to devrandom, in which I didn't
fully understand how the original random code worked.

It's also faster than the our inferno version (due mostly to not taking
13 ms for 2 bits of randomness), and much simpler, due to the apipes.

It also passes the extremely rigorous test for randomness, established
in the old 9ns commit 7f63102c: I can't see a pattern in a bunch of 16
byte random reads:

b42b0a02 1f0740d0 9064d97d ae2a0a02
dd37e3b8 d6f57d77 fd2f8b62 6759d5f5
3d4fd39d dd6d5bd6 e779d775 354dd39d
f39f6759 5f5735cd dff7fd7f f39fe7f9
244934cd 89a22892 59d5759d ce739765
384e9339 b78b2288 8ee37edf e0b8ae3a
f7ef3b0e 82a07ade d7759d09 d39de779
ecfb3f4f 8b2208b0 d9ddf7bd b82e9264
320c03e0 3283a028 751d21c8 9f6759d5
3d23c8f2 8ae2def7 ea3a8e28 ae1a86a1
8a62e6b9 d7759d29 1231cc73 a0282248
0a022008 280a8228 77771d87 4ad27ddf

6 years agoFixes random reads
Barret Rhoden [Tue, 21 Jan 2014 17:40:45 +0000 (09:40 -0800)]
Fixes random reads

This is the old plan9 style, with two 'independent' processes working at
the same time, and not using apipes.

But it's way too slow:

/ $ trandom 16
Read 16 bytes of random in 822003 microseconds
dc6bd80d 9b541b97 a063d7ab 27d7bbea
/ $
/ $ trandom 100
Read 100 bytes of random in 5192485 microseconds
fe50907c 5c5c7473 5d40b3fe 307fbf4c

I think it's slow since genrandom doesn't yield to processes.  When
we're done with our 16 bytes, we pause a bit before returning to

6 years agoKtasks are run with interrupts enabled
Barret Rhoden [Tue, 21 Jan 2014 07:23:13 +0000 (23:23 -0800)]
Ktasks are run with interrupts enabled

In general, I think most ktasks should have IRQs enabled.  If not,
disable them (temporarily) when needed.

6 years agoUse syspipe, not the old kfs, for pipes
Ronald G. Minnich [Tue, 21 Jan 2014 18:34:06 +0000 (10:34 -0800)]
Use syspipe, not the old kfs, for pipes

note that the pipes are bidi.

note also that I broke pipe but I think Barret will fix as always.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoIgnore bogus omode on devpipe
Ronald G. Minnich [Tue, 21 Jan 2014 15:10:46 +0000 (07:10 -0800)]
Ignore bogus omode on devpipe

Somebody is trying to open directories with
omode of 2048; no idea why.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
6 years agoRemoves the old networking stack (XCC)
Barret Rhoden [Tue, 21 Jan 2014 05:01:17 +0000 (21:01 -0800)]
Removes the old networking stack (XCC)

In addition to the socket family of glibc and syscall numbers, I also
removed the syscalls for read/write over serial/ethernet, and the
ethernet audio device.  If we need any of this in the future, we can
get it from git.

You need to fully rebuild glibc for this, including removing the entire
glibc-2.14.1/ directory (but not the -ros one).

6 years agoFix glibc to build with newer makes (XCC)
Barret Rhoden [Tue, 21 Jan 2014 04:54:29 +0000 (20:54 -0800)]
Fix glibc to build with newer makes (XCC)

My make is 4.0, which isn't one of their hardcoded versions.  I get
complaints about sed and makeinfo's versions too.  The version detection
for sed is wrong, for one thing.  I haven't fixed those - not sure it's

It was necessary to put the change in the main configure file, and not
only in the .in.  In fact, I'm not sure the .in is getting autoconfed
into the main configure all the time.  My autoconf is supposedly good,
but I was sometimes getting the dreaded BP_SYM error, which is when our
base_os change isn't in the main configure.

Since we're having a configure file anyway, I put the base_os business
in there too.  These are the only two diffs from our configure.in and
the default glibc one.

You'll need to fully rebuild glibc for this to take effect.

6 years agoDevtab created with linker tables
Barret Rhoden [Tue, 21 Jan 2014 00:30:44 +0000 (16:30 -0800)]
Devtab created with linker tables

One tricky thing is alignment.  Regardless of sizeof(struct dev), the
struct devs in the .devtab section are aligned to 32 bytes.

6 years agoFix devtab assumption with c->type
Barret Rhoden [Tue, 21 Jan 2014 00:24:23 +0000 (16:24 -0800)]
Fix devtab assumption with c->type

Inferno assumed devroot was the first dev in devtab.  They needed
certain chans (ones not associated with a dev yet) to not execute a
dev's close method.  rootclose() was a noop, so they managed.