Annotation of qemu/roms/SLOF/README, revision 1.1

1.1     ! root        1: Slimline Open Firmware - SLOF
        !             2: 
        !             3: Copyright (C) 2004, 2008  IBM Corporation
        !             4: 
        !             5: 
        !             6: Index
        !             7: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        !             8: 1.0 Introduction to Open Firmware
        !             9: 1.1 Build process
        !            10: 2.0 Extension
        !            11: 3.0 Limitations
        !            12: 
        !            13: 1.0 Introduction to Open Firmware
        !            14: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        !            15: 
        !            16: The IEEE Standard 1275-1994 [1], Standard for Boot (Initialization Configuration)
        !            17: Firmware, Core Requirements and Practices, is the first non-proprietary open
        !            18: standard for boot firmware that is usable on different processors and buses.
        !            19: Firmware which complies with this standard (also known as Open Firmware)
        !            20: includes a processor-independent device interface that allows add-in devices
        !            21: to identify itself and to supply a single boot driver that can be used,
        !            22: unchanged, on any CPU.  In addition, Open Firmware includes a user interface
        !            23: with powerful scripting and debugging support and a client interface that
        !            24: allows an operating system and its loaders to use Open Firmware services
        !            25: during the configuration and initialization process.  Open Firmware stores
        !            26: information about the hardware in a tree structure called the
        !            27: ``device tree''.  This device tree supports multiple interconnected system
        !            28: buses and offers a framework for ``plug and play''-type auto configuration
        !            29: across different buses.  It was designed to support a variety of different
        !            30: processor Instruction Set Architectures (ISAs) and buses.
        !            31: 
        !            32: The full documentation of this Standard can be found in [1].
        !            33: 
        !            34: 
        !            35: 1.1 Build process
        !            36: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        !            37: 
        !            38: Open Firmware (OF) is based on the programming language Forth. 
        !            39: SLOF use Paflof as the Forth engine, which was developed by
        !            40: Segher Boessenkool.  Most parts of the Forth engine are implemented in 
        !            41: C, by using GNU extensions of ANSI C, (e.g. assigned goto, often misnamed "computed goto"),
        !            42: resulting in a very efficient yet still quite portable engine.  
        !            43: 
        !            44: The basic Forth words, so-called primitives,  are implemented with 
        !            45: a set of C macros.  A set of .in and .code files are provided, which
        !            46: define the semantic of the Forth primitives.  A Perl script translates 
        !            47: these files into valid C code, which will be compiled into the Forth engine.
        !            48: The complete Forth system composes of the basic Forth primitives and
        !            49: a set of Forth words, which are compiled during the start of the Forth
        !            50: system.
        !            51: 
        !            52: Example:
        !            53: Forth primitive 'dup'
        !            54: 
        !            55:        dup ( a -- a a) \ Duplicate top of stack element
        !            56: 
        !            57: 
        !            58: prim.in:       
        !            59:        cod(DUP)
        !            60: 
        !            61: prim.code:
        !            62:        PRIM(DUP) cell x = TOS; PUSH; TOS = x; MIRP
        !            63: 
        !            64: Generated code:
        !            65: 
        !            66: static cell xt_DUP[] = { { .a = xt_DOTICK }, { .c = "\000\003DUP" },
        !            67:         { .a = &&code_DUP }, };
        !            68: 
        !            69: code_DUP: { asm("#### " "DUP"); void *w = (cfa = (++ip)->a)->a;
        !            70:         cell x = (*dp); dp++; (*dp) = x; goto *w; }
        !            71: 
        !            72: Without going into detail, it can be seen, that the data stack is
        !            73: implemented in C as an array of cells, where dp is the pointer to the top of
        !            74: stack. 
        !            75: 
        !            76: For the implementation of the Open Firmware, most of the
        !            77: code is added as Forth code and bound to the engine.  Also 
        !            78: the system vector for reset and all kinds of exceptions
        !            79: will be part of the image. Additionally a secondary boot-loader
        !            80: or any other client application can be bound to the code as payload, 
        !            81: e.g. diagnostics and test programs.
        !            82: 
        !            83: The Open Firmware image will be put together by the build 
        !            84: process, with a loader at the start of the image. This loader
        !            85: is called by Low Level Firmware and loads at boot time the Open 
        !            86: Firmware to it's location in memory (see 1.3 Load process). Additionally 
        !            87: a secondary boot loader or any other client application can be bound
        !            88: to the code as payload.
        !            89: 
        !            90: The Low Level Firmware (LLFW) is responsible for setting up the 
        !            91: system in an initial state. This task includes the setup of the 
        !            92: CPUs, the system memory and all the buses as well as the serial port
        !            93: itself.
        !            94: 
        !            95: 
        !            96: 2.0 Extension
        !            97: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        !            98: 
        !            99: In the following paragraphs it will be shown how to add
        !           100: new primitive words (i.e., words implemented not by building
        !           101: pre-existing Forth words together, but instead implemented in
        !           102: C or assembler).  With this, it is possible to adapt SLOF to
        !           103: the specific needs of different hardware and architectures.
        !           104: 
        !           105: 
        !           106: To add primitives:
        !           107:    
        !           108:    For a new primitive, following steps have to be done:
        !           109: 
        !           110:    + Definition of primitive name in <arch>.in
        !           111:      - cod(ABC) defines primitive ABC
        !           112: 
        !           113:      You can also use the following in a .in file, see existing
        !           114:      code for how to use these:
        !           115:      - con(ABC) defines constant ABC   
        !           116:      - col(ABC) defines colon definition ABC
        !           117:      - dfr(ABC) defines defer definition ABC
        !           118: 
        !           119:    + Definition of the primitives effects in <arch>.code
        !           120:      - PRIM(ABC) ... MIRP
        !           121: 
        !           122:        The code for the primitive body is any C-code. With
        !           123:        the macros of prim.code the data and return stack of 
        !           124:        the Forth engine can be appropriately manipulated.
        !           125: 
        !           126: 
        !           127: 3.0 Limitations of this package
        !           128: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        !           129: 
        !           130:  On a JS20 the memory setup is very static and therefore there are
        !           131:  only very few combinations of memory DIMM placement actually work.
        !           132: 
        !           133:  Known booting configurations:
        !           134: 
        !           135:     * 4x 256 MB (filling all slots) -- only "0.5 GB" reported.
        !           136:     * 2x 1 GB, slots 3/4 -- only "0.5 GB" reported.
        !           137: 
        !           138:  Known failing configurations
        !           139: 
        !           140:     * 2x 256 MB, slots 3/4
        !           141:     * 2x 256 MB, slots 1/2
        !           142: 
        !           143:  On a JS20 SLOF wil always report 0.5 GB even if there is much more memory
        !           144:  available.
        !           145: 
        !           146:  On a JS21 all memory configurations should work.
        !           147: 
        !           148: Documentation
        !           149: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        !           150: 
        !           151: [1] IEEE 1275-1994 Standard, Standard for Boot (Initialization Configuration)
        !           152:     Firmware: Core Requierements and Practices
        !           153: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.