Support for non-blocking block reads/writes

Ben Laughton


Overview
========

Support has been added to allow block reads and writes (using OS_GBPB) to be
non-blocking.  The existing blocking API is not unchanged so full backwards
compatibility is maintained.

Non-blocking operation for a stream is enabled using a new IOCtl.  This IOCtl
can also be used to read the blocking status of a stream.  When streams are
first opened they are always in blocking mode by default.

A new IOCtl group (&ff) has been created for performing miscellaneous
operations on a stream.  Reason code 1 in this group reads/writes the
blocking status of a stream.

This new IOCtl group is dealt with in DeviceFS; IOCtls in this group are not
passed on to device drivers.


Changes
=======

Flags
-----

A new flag has been added to the flags word in the file structure:

bit 29	ff_NonBlocking	0:Non-blocking mode disabled for this file
			1:Non-blocking mode enabled for this file

IOCtl
-----

The args_ioctl routine has been changed to recognise with the new IOCtl group
and a couple of routines have been added to deal with this group:
ioctl_miscop ioctl_miscop_nonblock

Two new errors have been added which relate to the IOCtl handing:
DeviceFS_BadIOCtlReasonCode
DeviceFS_BadIOCtlParameter

GBPB
----

gbpb_get:
When in non-blocking mode, if gbpb_get cannot get the complete number of
requested bytes it returns with number of bytes not done in R3.

gbpb_put:
When in non-blocking mode, if gppb_put cannot output all the bytes it was
told to send it returns with the number of bytes not done in R3 and the C
flag set.