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

1.1       root        1: Slimline Open Firmware - SLOF
                      2: 
1.1.1.2 ! root        3: Copyright (C) 2004, 2012  IBM Corporation
1.1       root        4: 
                      5: 
                      6: Index
                      7: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                      8: 1.0 Introduction to Open Firmware
1.1.1.2 ! root        9: 2.0 Using the source code
        !            10: 2.1 Build process
        !            11: 2.2 Overview of the source code
        !            12: 2.4 Extending the Forth engine
1.1       root       13: 3.0 Limitations
                     14: 
1.1.1.2 ! root       15: 
        !            16: 1.0 Introduction to Slimline Open Firmware
1.1       root       17: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                     18: 
1.1.1.2 ! root       19: The IEEE Standard 1275-1994 [1], Standard for Boot (Initialization Configura-
        !            20: tion) Firmware, Core Requirements and Practices, was the first non-proprietary
        !            21: open standard for boot firmware that is usable on different processors and
        !            22: buses. Firmware which complies with this standard (also known as Open Firmware)
1.1       root       23: includes a processor-independent device interface that allows add-in devices
                     24: to identify itself and to supply a single boot driver that can be used,
                     25: unchanged, on any CPU.  In addition, Open Firmware includes a user interface
                     26: with powerful scripting and debugging support and a client interface that
                     27: allows an operating system and its loaders to use Open Firmware services
                     28: during the configuration and initialization process.  Open Firmware stores
                     29: information about the hardware in a tree structure called the
1.1.1.2 ! root       30: "device tree".  This device tree supports multiple interconnected system
        !            31: buses and offers a framework for "plug and play"-type auto configuration
1.1       root       32: across different buses.  It was designed to support a variety of different
                     33: processor Instruction Set Architectures (ISAs) and buses.
                     34: 
                     35: The full documentation of this Standard can be found in [1].
                     36: 
1.1.1.2 ! root       37: Slimline Open Firmware (SLOF) is now an implementation of the IEEE 1275
        !            38: standard that is available under a BSD-style license. Please see the file
        !            39: LICENSE for details.
        !            40: 
        !            41: 
        !            42: 2.0 Using the source code
        !            43: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        !            44: 
        !            45: This version of SLOF currently supports two major platforms ("boards" in the
        !            46: SLOF jargon):
        !            47: 
        !            48: - js2x : The PowerPC 970 based systems JS20, JS21 and the PowerStation
        !            49: - qemu : Used as partition firmware for pseries machines running on KVM/QEMU
1.1       root       50: 
1.1.1.2 ! root       51: The following sections will give you a short introduction about how to compile
        !            52: and improve the source code.
        !            53: Please read the file INSTALL for details about how to install the firmware on
        !            54: your target system.
        !            55: 
        !            56: 
        !            57: 2.1 Build process
        !            58: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        !            59: 
        !            60:  To build SLOF you need:
        !            61:   - Recent GNU tools, configured for powerpc64-linux
        !            62:     - GCC: 3.3.3 and newer are known to work
        !            63:     - Binutils: use a version as new as possible
        !            64:     - Subversion (for retrieving the x86 emulator)
        !            65: 
        !            66:   - set the CROSS variable
        !            67:     - something like export CROSS="powerpc64-unknown-linux-gnu-"
        !            68:       when using a cross compiler
        !            69:     or
        !            70:     - export CROSS=""
        !            71:       when using a native compiler
        !            72: 
        !            73:   - For building SLOF for the PowerStation, it is necessary to
        !            74:     download a x86 emulator which is used to execute the BIOS
        !            75:     of VGA card; to download the x86 emulator following steps are
        !            76:     required:
        !            77:     - cd other-licence/x86emu/
        !            78:     - ./x86emu_download.sh      # this downloads the x86 emulator sources
        !            79:     - cd -
        !            80: 
        !            81:   - Now you can compile the firmware.
        !            82:     - For building SLOF for JS20, JS21 or the PowerStation, type:
        !            83:         make js2x
        !            84:       You also might want to build the takeover executable by typing:
        !            85:         make -C board-js2x takeover
        !            86:     - For building SLOF as the partition firmware for KVM/QEMU, type:
        !            87:         make qemu
        !            88:     The resulting ROM image "boot_rom.bin" can then be found in the main
        !            89:     directory.
        !            90: 
        !            91: 
        !            92: 2.2 Overview of the source code
        !            93: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
        !            94: 
        !            95: The SLOF source code is structured into the following directories:
        !            96: 
        !            97: - llfw : The Low-Level Firmware - this part is platform-specific firmware
        !            98:          that is responsible to boot the system from the reset vector to a
        !            99:          state where it is possible to run the Open Firmware Forth engine
        !           100:          (i.e. it sets up the necessary CPU registers, intializes the memory,
        !           101:          does some board-specific hardware configuration, etc.)
        !           102: 
        !           103: - slof : The code for the Open Firmware environment, including the Forth
        !           104:          engine (called "Paflof") and the necessary Forth source files.
        !           105: 
        !           106: - rtas : The Run-Time Abstraction Services, which can be used by the operating
        !           107:          system to access certain hardware without knowing the details.
        !           108:          See [2] for a description of these services.
        !           109: 
        !           110: - clients : Code that runs on top of the Open Firmware client interface.
        !           111:             Currently, there are two clients:
        !           112:             - net-snk : Used for network bootloading (a TFTP client)
        !           113:             - takeover : A separate binary that can be used for bootstrapping
        !           114:                       SLOF on a JS20/JS21 (see FlashingSLOF.pdf for details).
        !           115: 
        !           116: - drivers : Driver code for various hardware (currently only NIC drivers).
        !           117: 
        !           118: - lib : Libraries with common code.
        !           119: 
        !           120: - romfs / tools : Tools that are required for building the firmware image.
        !           121: 
        !           122: - board-* : The board directories contain all the code that is unique to the
        !           123:             corresponding platform.
        !           124: 
        !           125: 
        !           126: 2.3 The Open Firmware engine
1.1       root      127: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    128: 
                    129: Open Firmware (OF) is based on the programming language Forth. 
1.1.1.2 ! root      130: SLOF use Paflof as the Forth engine, which was originally developed by
        !           131: Segher Boessenkool.  Most parts of the Forth engine are implemented in C, by
        !           132: using GNU extensions of ANSI C, (e.g. assigned goto, often misnamed "computed
        !           133: goto"), resulting in a very efficient yet still quite portable engine.  
1.1       root      134: 
                    135: The basic Forth words, so-called primitives,  are implemented with 
                    136: a set of C macros.  A set of .in and .code files are provided, which
                    137: define the semantic of the Forth primitives.  A Perl script translates 
                    138: these files into valid C code, which will be compiled into the Forth engine.
                    139: The complete Forth system composes of the basic Forth primitives and
                    140: a set of Forth words, which are compiled during the start of the Forth
                    141: system.
                    142: 
                    143: Example:
                    144: Forth primitive 'dup'
                    145: 
                    146:        dup ( a -- a a) \ Duplicate top of stack element
                    147: 
                    148: 
1.1.1.2 ! root      149: prim.in:
1.1       root      150:        cod(DUP)
                    151: 
                    152: prim.code:
                    153:        PRIM(DUP) cell x = TOS; PUSH; TOS = x; MIRP
                    154: 
                    155: Generated code:
                    156: 
                    157: static cell xt_DUP[] = { { .a = xt_DOTICK }, { .c = "\000\003DUP" },
                    158:         { .a = &&code_DUP }, };
                    159: 
                    160: code_DUP: { asm("#### " "DUP"); void *w = (cfa = (++ip)->a)->a;
                    161:         cell x = (*dp); dp++; (*dp) = x; goto *w; }
                    162: 
                    163: Without going into detail, it can be seen, that the data stack is
                    164: implemented in C as an array of cells, where dp is the pointer to the top of
                    165: stack. 
                    166: 
1.1.1.2 ! root      167: For the implementation of the Open Firmware, most of the code is added as
        !           168: Forth code and bound to the engine.  Also the system vectors for all kinds of
        !           169: exceptions will be part of the image. Additionally a secondary boot-loader
1.1       root      170: or any other client application can be bound to the code as payload, 
                    171: e.g. diagnostics and test programs.
                    172: 
                    173: The Open Firmware image will be put together by the build 
                    174: process, with a loader at the start of the image. This loader
                    175: is called by Low Level Firmware and loads at boot time the Open 
                    176: Firmware to it's location in memory (see 1.3 Load process). Additionally 
                    177: a secondary boot loader or any other client application can be bound
                    178: to the code as payload.
                    179: 
                    180: The Low Level Firmware (LLFW) is responsible for setting up the 
                    181: system in an initial state. This task includes the setup of the 
                    182: CPUs, the system memory and all the buses as well as the serial port
                    183: itself.
                    184: 
                    185: 
1.1.1.2 ! root      186: 2.4 Extending the Forth engine
1.1       root      187: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    188: 
                    189: In the following paragraphs it will be shown how to add
                    190: new primitive words (i.e., words implemented not by building
                    191: pre-existing Forth words together, but instead implemented in
                    192: C or assembler).  With this, it is possible to adapt SLOF to
                    193: the specific needs of different hardware and architectures.
                    194: 
                    195: 
                    196: To add primitives:
1.1.1.2 ! root      197: 
1.1       root      198:    For a new primitive, following steps have to be done:
                    199: 
                    200:    + Definition of primitive name in <arch>.in
                    201:      - cod(ABC) defines primitive ABC
                    202: 
                    203:      You can also use the following in a .in file, see existing
                    204:      code for how to use these:
                    205:      - con(ABC) defines constant ABC   
                    206:      - col(ABC) defines colon definition ABC
                    207:      - dfr(ABC) defines defer definition ABC
                    208: 
                    209:    + Definition of the primitives effects in <arch>.code
                    210:      - PRIM(ABC) ... MIRP
                    211: 
                    212:        The code for the primitive body is any C-code. With
                    213:        the macros of prim.code the data and return stack of 
                    214:        the Forth engine can be appropriately manipulated.
                    215: 
                    216: 
                    217: 3.0 Limitations of this package
                    218: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    219: 
                    220:  On a JS20 the memory setup is very static and therefore there are
                    221:  only very few combinations of memory DIMM placement actually work.
                    222: 
                    223:  Known booting configurations:
                    224: 
                    225:     * 4x 256 MB (filling all slots) -- only "0.5 GB" reported.
                    226:     * 2x 1 GB, slots 3/4 -- only "0.5 GB" reported.
                    227: 
                    228:  Known failing configurations
                    229: 
                    230:     * 2x 256 MB, slots 3/4
                    231:     * 2x 256 MB, slots 1/2
                    232: 
                    233:  On a JS20 SLOF wil always report 0.5 GB even if there is much more memory
                    234:  available.
                    235: 
                    236:  On a JS21 all memory configurations should work.
                    237: 
1.1.1.2 ! root      238: 
1.1       root      239: Documentation
                    240: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
                    241: 
                    242: [1] IEEE 1275-1994 Standard, Standard for Boot (Initialization Configuration)
1.1.1.2 ! root      243:     Firmware: Core Requirements and Practices
1.1       root      244: 
1.1.1.2 ! root      245: [2] PAPR Standard, Power.org(TM) Standard for Power Architecture(R) Platform
        !           246:     Requirements (Workstation, Server), Version 2.4, December 7, 2009

unix.superglobalmegacorp.com

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