BenH still need to ACK this though.
From: Nikunj A. Dadhania <nikunj@linux.vnet.ibm.com>
* Determines size of the flash using device tree.
* Provides nvram access functions for RTAS_NVRAM
* Allocates temporary buffer of nvram in SLOF code and use that in C.
(sbrk not available)
* NVRAM_LENGTH is used at various places, make sure it is well guarded
and also use dynamically determined size once an RTAS-NVRAM is
found.
* Use NVRAM_LENGTH as a variable in case of RTAS_NVRAM, not very
elegant though
Signed-off-by: Nikunj A. Dadhania <nikunj@linux.vnet.ibm.com>
--
Changelog from v1:
* #define cleanups suggested by Thomas/Benh
* Fix makefile which missed passing $FLAG for building llfw
* renamed vio-nvram.fs as rtas-nvram.fs
This update our vscsi to encode unit-addresses the same way as IBM
proprietary OFW does, and adds support for the vscsi-report-lun
method.
This fixes booting with grub2 on fedora. It also means that we now
support devices with LUNs.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
We have a couple of issues making grub2 essentially unusable when
using a framebuffer console:
- When we encounter a ";" in a CSI sequence, we still stop the
parsing, so all the positioning sequences are broken
- We made a pretty poor choice of when to use invert video,
basically switching to invert whenever a "m" sequence had any
non-zero value. Instead we remember the foreground and background
colors set by the client and use invert when the foreground value
is lower (or equal) to the background value.
There is still a -lot- of improvements to do here (including proper
support for colors) but at least this makes grub2 from fedora 17
usable.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
The bootinfo.txt parsing code assumed that the filename to the boot loader
always contained a backslash. However, this is maybe not the case if the
boot loader has been put into the root directory of the filesystem. For example
SLES 8 used "boot &device;:1,yaboot.chrp" in its boot-script. Now we look for
the &device; string instead which should always work.
SLOF also failed if there were parameters after the path to the boot loader.
Now we take care of the parameters, too.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
According to the ISO9660/Ecma-119 standard, directory entries must not cross
the boundary of a sector. That means that there might be some padding after
the last directory entry that still fitted into a sector. SLOF did not take
this into account yet so it failed to find files in directories which used
more than one sector for its directory entries. Now we are taking the padding
into account so the "file not found" problems should be gone.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Some parts of envvar.fs were quite hard to read due to bad indentation, and
the handling of env-byte variables was quite shaky. Fixed and cleaned up the
code now so that it should be more maintainable now.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
To analyze the behavior and requirements of boot loaders and OS clients, it's
crucial to know which properties they try to read from our device tree. Thus
we need the possibility to debug the "getprop" client interface call.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
This moves _FASTREMOVE to the cache.h header, 970 uses the
existing code, p7 now uses the new memop hcall.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
The parse-partition function was not able to deal with arguments that only
contained a partition number (without comma), e.g. "boot disk:1" failed.
Also limited the size that we load from a PReP partition in case the hard disk
is smaller than max-prep-partition-blocks.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Functions that use the TO keyword with an instance variable need some special
treatment, just like we did it with the TO for normal variables already (see
the usage of <doto> in debugger.fs).
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
There was a bug that occured when yaboot tried to load its configuration file
via network. The net-snk tries to probe the device tree node for write and read
methods (see ci_device.c), which triggers $call-method in the end. But when
$call-method failed, it did not restore my-self and the return stack, which
caused some bad crashes.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
One of the old FCODE tokenizers uses the opcodes in the range of 0x407 to 0x41f
for supporting Forth local values. To get these FCODE programs working, we have
to support these opcodes, too.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
The USB stack did instance specific allocations for the
various buffers, but would then assign them to package
specific lists, and would generally get badly confused
as soon as multiple instances of the driver got opened.
This typically occurs when using a USB keyboard and booting
from a USB disk.
This makes everything node variables instead, with tracking
of how many instances are open, with one allocation pass
on the first open and one free pass on the last close.
The result is a lot more reliable, I can boot with USB keyboard
and a USB disk fine without hanging qemu.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
When erasing characters or when inserting characters in the middle of a line,
the framebuffer code did not correctly calculate the line width, since it was
not taking the bit depth into account yet.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
We now support populating the device-nodes ourselves when using
a newer qemu which doesn't do it anymore.
Note: I have removed the support for working with the existing
device nodes, so qemu needs to be updated in sync with slof
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
According to IEEE 1275, the "my-unit" command shall return the unit address
of the current _instance_, i.e. this unit address can be set differently for
each instance, it is not bound to the physical unit address like "my-space"
and "my-address". This behaviour is expected by the Citrine FCODE for example,
which does not set a physical unit address for the "sd" (disk) nodes, but
needs the unit address to be specified when opening the device tree node
instead.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Some functions in node.fs were formatted in a very bad way, using wrong
indentation or mixing spaces and tabs for indentation. Cleaned this up now,
without doing any functional changes.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
When the ' (tick) or postpone commands hit an unknown function, they simply
printed out "undefined word" without telling which word was not defined. These
problems were quite cumbersome to debug since it was quite hard to find the
right spot in the source code where such problems happened. Now the tick and
postpone command store the name of the undefined word, too, so that the code
which catches the ABORT also prints this information.
I also fixed the $FIND command to be standard compliant right from the start
(so that it leaves the string parameters on the stack in case the word has
not been found).
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
When the "open" method of the target node failed, the open-node function did
not correctly restore the previous value of "my-self" (it was using my-parent
of the new node to restore the previous value, but that did not work when the
new node could not be opened). Now the old value of "my-self" is saved on the
return stack instead and then always correctly restored.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
For some reasons, interrupt transfers do not work right on QEMU, so we use
control transfers there instead. Also digest one key scancode at a time only
to avoid the problem with phantom keypresses.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Since the FCODE evaluator can be used for more than one PCI card now, the
interpreter is now always included during boot. The framebuffer tokens are now
only initialized when the code from fbuffer.fs is being used.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
The "open-node" command always tried to execute the "open" method of the node
that should be opened and used CATCH to determine whether the method is
available or not (and assumed success if it is not available). That works fine
as long as the "open" method does not ABORT due to any reason - in that case
the "open" should be considered as failure instead. So the code is now using
"find-method" instead to determine whether the "open" method is available or
not.
Second fix is about "my-unit". According to IEEE1275, this value should be
initialized to the firt component of the "reg" property in case it has not
been specified by other means.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
The get-inherited-property function messed up the stack in case the property
could not be found. Now it deals with this situation correctly.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
The BEHAVIOR function only worked with normal DEFER variables so far. It was
not aware of INSTANCE DEFERs yet. This problem has been fixed now.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
IEEE1275 allows offset values to be either encoded with 8-bit values or
16-bit values. So far our FCODE engine only supported 16-bit offsets.
Now 8-bit offsets are working, too.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
The "dev" command parsed the whole remaining input line. That way it was not
possible to do something like "dev / ls" at the prompt. Now it parses only
the next available word in the input so that the rest of the input line can
be interpreted by the Forth engine instead.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
There are a lot of properties in the FDT that contain a string, but commands
like ".properties" only displayed them as byte array since all properties
were encoded with "encode-bytes". Now the code tries to detect valid ASCII
strings and encodes such properties with "encode-string" instead.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
IEEE 1275 stipulates that the "BUFFER:" keyword and its FCODE equivalent
"b(buffer:)" can both be used with the INSTANCE keyword to create an
instance-specific buffer. SLOF lacked this support, but now it's possible
to create such instance-specific buffers with SLOF, too.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
The "Recommended Practice: Interposition" document declares that token 0x12b
is used for "interpose".
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
The OHCI code unmaps the allocated DMA buffers during "quiesce". For this
the dma-map-out and dma-free functions were using the $call-parent function
that requires a valid current instance ("my-self"). However, there is no
current instance available during "quiesce" so $call-parent aborted the boot
process.
To fix the problem, the dma-* functions now use $call-static again so that
they also work without a current instance.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
According to the PCI Bus Binding to IEEE 1275, the dma-alloc, dma-free,
dma-map-in, dma-map-out and dma-sync functions have to be provided by the
PCI bus node, not by the PCI device node, so I moved these functions to the
PHB node now. Since the "ibm,dma-window" property is still located in the
device node instead, I had to add a little hack to the $call-parent method
to remember the calling child, so that the parent node (the PHB node) can
access that property of the calling child.
Also added map-in and map-out functions now according the the PCI Bus Binding.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Refactored the ohci-scan function a little bit and use the new "extend-device"
function to extend the ohci node properly.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Fixed various bugs and added some improvements in the device tree node instance
handling code:
- The ">instance" word now checks whether access is beyond the allocated memory
- Check max-instance-size when creating new instance variables/values
- The arg point and the args-len were stored the wrong way round in the
instance header structure
- Free instance args buffer when closing an instance to avoid memory leaking
- finish-device destroyed the instance-template buffer, causing instance values
not to be initialized correctly anymore
- Added new command "extend-device" to be able to modify the instance template
of already existing nodes
- Added new command "unselect-dev" to undo the changes from select-dev
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Fixed two memory leaks:
- The PCI class file for network nodes did not properly close the obp-tftp
package
- The obp-tftp package used "select-dev" for setting a property in /chosen
which created some instances that were not closed anymore
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
According to IEEE 1275, the return stack commands may also be used in
"interpretation" FCODE mode (i.e. without a surrounding colon definition).
This did not work in SLOF yet since the commands were executed in one function
(called "exec"), but the main loop was done in another function (called
"evaluate-fcode"), so SLOF needed the return stack inbetween. When an FCODE
program put an additional item on the return stack, the FCODE interpreter
crashed. This has been fixed now by merging the exec function into the
evaluate-fcode function with the main loop.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
According to IEEE 1275, the b?branch instruction should jump "if all bits
of x are zero". However, our implementation also jumped already if x was not
equal to TRUE (i.e. 0xffffffff). It's fixed now by simply removing the odd
"?branch" function.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Since some FCODE programs use the normal memory access functions (like c@)
for accessing MMIO memory, we got to use a little hack to support them:
When address is bigger than MIN-RAM-SIZE, assume the FCODE is trying to
access MMIO memory and use the register based access functions (like rb@)
instead.
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
The "offset" function only worked for partitions starting within the first
4 GiB of the disk.
Also increased the amount of data to be read from a PReP partition since some
clients are certainly bigger than 2 MiB nowadays.
- Added support for double and tripple indirect blocks.
- For modern revision of ext2, the inode size is configurable
and thus has to be read out of the superblock
- The group descriptor table can be bigger than one block
- Free allocated memory when closing the package