C H A P T E R  1

Overview

This chapter introduces OpenBoot as defined by the IEEE Standard 1275-1994 Standard for Boot Firmware. This chapter covers the following topics:


Features of OpenBoot Firmware

OpenBoot firmware is executed immediately after you turn on your system. The primary tasks of OpenBoot firmware are to:

The OpenBoot architecture provides a significant increase in functionality and portability when compared to proprietary systems of the past. Although this architecture was first implemented by Sun Microsystems as OpenBoot on SPARC trademark systems, its design is processor-independent.

The following paragraphs describe some notable features of OpenBoot firmware.

Plug-in Device Drivers

A plug-in device driver is usually loaded from a plug-in device such as an SBus or a PCI card. The plug-in device driver can be used to boot the operating system from that device or to display text on the device before the operating system has activated its own drivers. This feature enables the input and output devices supported by a particular system to evolve without changing the system PROM.

FCode Interpreter

Plug-in drivers are written in a machine-independent interpreted language called FCode . Each OpenBoot system PROM contains an FCode interpreter. Thus, the same device and driver can be used on systems with different CPU instruction sets.

Device Tree

The device tree is a data structure describing the devices (permanently installed and plug-in) attached to a system. Both the user and the operating system can determine the hardware configuration of the system by inspecting the device tree.

Programmable User Interface

The OpenBoot user interface is based on the interactive programming language Forth . By combining sequences of commands to form complete programs, this provides a powerful capability for debugging hardware and software.


User Interface

The user interface is based on an interactive command interpreter that gives you access to an extensive set of functions for hardware and software development, fault isolation, and debugging. Any level of user can use these functions.

The user interface prompt is implementation dependent.

You can enter the OpenBoot environment by:

If your system is not configured to boot automatically, the system stops at the user interface.

If automatic booting is configured, you can make the system stop at the user interface by pressing the Stop-A keys from the keyboard after the display console banner is displayed but before the system starts booting the operating system.

See A Caution About Using Some OpenBoot Commands for information on using commands after entering OpenBoot from the operating system.


Device Tree

Devices are attached to a host computer through a hierarchy of interconnected buses. OpenBoot represents the interconnected buses and their attached devices as a tree of nodes, called the device tree . A node representing the host computer's main physical address bus forms the tree's root node.

Each device node can have:

Nodes with children usually represent buses and their associated controllers, if any. Each such node defines a physical address space that distinguishes the devices connected to the node from one another. Each child of that node is assigned a physical address in the parent's address space.

The physical address generally represents a physical characteristic unique to the device (such as the bus address or the slot number where the device is installed). The use of physical addresses to identify devices prevents device addresses from changing when other devices are installed or removed.

Nodes without children are called leaf nodes and generally represent devices. However, some such nodes represent system-supplied firmware services.

Device Path Names, Addresses, and Arguments

OpenBoot deals directly with hardware devices in the system. Each device has a unique name representing the type of device and where that device is located in the system addressing structure. The following example shows a full device path name:

/sbus@1f,0/SUNW,fas@e,8800000/sd@3,0:a

A full device path name is a series of node names separated by slashes ( / ). The root of the tree is the machine node, which is not named explicitly but is indicated by a leading slash ( / ). Each node name has the form:

device-name @ unit-address : device-arguments

TABLE 1-1 describes each of these parameters.

TABLE 1-1 Device Path Name Parameters

Path Name Parameter

Description

device-name

A human-readable string consisting of one to 31 letters, digits and punctuation characters from the set " , . _ + - " that, ideally, has some mnemonic value. Uppercase and lowercase characters are distinct. In some cases, this name includes the name of the device's manufacturer and the device's model name, separated by a comma. Typically, the manufacturer's upper-case, publicly-listed stock symbol is used as the manufacturer's name (for example, SUNW,sd ). For built-in devices, the manufacturer's name is usually omitted (for example, sbus ).

@

Must precede the address parameter.

unit-address

A text string representing the physical address of the device in its parent's address space. The format of the text is bus dependent.

:

Must precede the arguments parameter.

device-arguments

A text string whose format depends on the particular device. It can be used to pass additional information to the device's software.


The full device path name mimics the hardware addressing used by the system to distinguish between different devices. Thus, you can specify a particular device without ambiguity.

In general, the unit-address part of a node name represents an address in the physical address space of its parent. The exact meaning of a particular address depends on the bus to which the device is attached. Consider this example:

/sbus@1f,0/esp@0,40000/sd@3,0:a

Where:

When specifying a path name, either the @ unit-address or device-name part of a node name is optional, in which case the firmware tries to pick the device that best matches the given name. If there are several matching nodes, the firmware chooses one (but it may not be the one you want).

For example, using /sbus/esp@0,40000/sd@3,0 assumes that the system in question has exactly one SBus on the main system bus, making sbus as unambiguous an address as sbus@1f,0 . On the same system, however, /sbus/esp/sd@3,0 might or might not be ambiguous. Since SBus accepts plug-in cards, there could be more than one esp device on the same SBus bus. If there were more than one on the system, using esp alone would not specify which one, and the firmware might not choose the one you intended.

As another example, /sbus/@2,1/sd@3,0 would normally be unambiguous, while /sbus/scsi@2,1/@3,0 usually would not, since both a SCSI disk device driver and a SCSI tape device driver can use the SCSI target, logical unit address 3,0 .

The : device-arguments part of the node name is also optional. Once again, in the example:

/sbus@1f,0/scsi@2,1/sd@3,0:a

the argument for the disk device is a . The software driver for this device interprets its argument as a disk partition, so the device path name refers to partition a on that disk.

Some implementations also enable you to omit path name components. So long as the omission does not create any ambiguity, those implementations select the device that you intended. For example, if our example system had only one sd device,
/sd:a would identify the same device as the much longer preceding expression.

Device Aliases

A device alias, or simply, alias, is a shorthand representation of a device path .

For example, the alias disk may represent the complete device path name:

/sbus@1f,0/esp@0,40000/sd@3,0:a

Systems usually have predefined device aliases for the most commonly used devices, so you rarely need to type a full device path name.

TABLE 1-2 describes the devalias command, which is used to examine, create, and change aliases.

TABLE 1-2 Examining and Creating Device Aliases

Command

Description

devalias

Display all current device aliases.

devalias alias

Display the device path name corresponding to alias.

devalias alias device-path

Define an alias representing device-path .
If an alias with the same name already exists, the new value supersedes the old.


User-defined aliases are lost after a system reset or power cycle. If you want to create permanent aliases, you can either manually store the devalias command in a portion of non-volatile RAM (NVRAM) called nvramrc , or use the nvalias and nvunalias commands. (See Chapter 3 for further details.)

Displaying the Device Tree

You can browse the device tree to examine individual device tree nodes. The device tree browsing commands are similar to the Solaris trademark commands for changing, displaying and listing the current directory in the Solaris directory tree. Selecting a device node makes it the current node.

The user interface commands for browsing the device tree are shown in TABLE 1-3 .

TABLE 1-3 Commands for Browsing the Device Tree

Command

Description

.properties

Displays the names and values of the current node's properties.

dev device-path

Chooses the indicated device node, making it the current node.

dev node-name

Searches for a node with the given name in the subtree below the current node, and choose the first such node found.

dev ..

Chooses the device node that is the parent of the current node.

dev /

Chooses the root machine node.

device-end

Leaves the device tree.

" device-path " find-device

Chooses the device node, similar to dev .

ls

Displays the names of the current node's children.

pwd

Displays the device path name that names the current node.

see wordname

Decompiles the specified word.

show-devs [ device-path ]

Displays all the devices directly beneath the specified device in the device tree. The show-devs command used by itself shows the entire device tree.

words

Displays the names of the current node's methods.

" device-path " select-dev

Selects the specified device and make it the active node.

unselect-dev

Unselects the previously selected device.


.properties displays the names and values of all the properties in the current node:

ok dev /zs@1,f0000000 
ok .properties 
address               ffee9000 
port-b-ignore-cd 
port-a-ignore-cd 
keyboard 
device_type           serial 
slave                 00000001 
intr                  0000000c  00000000 
interrupts            0000000c 
reg                   00000001  f0000000  00000008 
name                  zs
ok 

dev sets the current node to the named node so its contents can be viewed. For example, to make the ACME company's SBus device named "ACME,widget" the current node:

ok dev /sbus/ACME,widget

find-device is similar to dev , differing only in the way the input pathname is passed.

ok " /sbus/ACME,widget" find-device



Note Note - After choosing a device node with dev or find-device, you can't execute that node's methods because dev does not establish the current instance. For a detailed explanation of this issue, refer to Writing FCode 3.x Programs.



show-devs lists all the devices in the OpenBoot device tree, as shown in the following example:

ok show-devs 
/SUNW,UltraSPARC@0,0
/sbus@1f,0
/counter-timer@1f,3c00
/virtual-memory
/memory@0,0
/aliases
/options
/openprom
/chosen
/packages
/sbus@1f,0/cgsix@1,0
/sbus@1f,0/lebuffer@0,40000
/sbus@1f,0/dma@0,81000
/sbus@1f,0/SUNW,bpp@e,c800000
/sbus@1f,0/SUNW,hme@e,8c00000
/sbus@1f,0/SUNW,fas@e,8800000
/sbus@1f,0/sc@f,1300000
/sbus@1f,0/zs@f,1000000
/sbus@1f,0/zs@f,1100000
/sbus@1f,0/eeprom@f,1200000
/sbus@1f,0/SUNW,fdtwo@f,1400000
/sbus@1f,0/flashprom@f,0
/sbus@1f,0/auxio@f,1900000    
/sbus@1f,0/SUNW,CS4231@d,c000000
/sbus@1f,0/SUNW,fas@e,8800000/st
/sbus@1f,0/SUNW,fas@e,8800000/sd
/openprom/client-services
/packages/disk-label
/packages/obp-tftp
/packages/deblocker
/packages/terminal-emulator
ok 

Here is an example of the use of words :

ok dev /zs 
ok words 
ring-bell  	    read           remove-abort? 	install-abort   
close      	    open           abort?        	restore 
clear          reset          initkbdmouse	   keyboard-addr mouse 
1200baud       setbaud        initport       port-addr


Getting Help

Whenever you see the ok prompt on the display, you can ask the system for help by typing one of the help commands shown in TABLE 1-4 .

TABLE 1-4 Help Commands

Command

Description

help

Lists main help categories.

help category

Shows help for all commands in the category. Use only the first word of the category description.

help command

Shows help for individual command (where available).


help , without any specifier, displays instructions on how to use the help system and lists the available help categories. Because of the large number of commands, help is available only for commands that are used frequently.

If you want to see the help messages for all the commands in a selected category, or, possibly, a list of subcategories, type:

ok help category

If you want help for a specific command, type:

ok help command

For example, when you ask for information on the dump command, you might see the following message:

ok help dump
Category: Memory access
dump ( addr length -- ) display memory at addr for length bytes
ok 

The above help message first shows that dump is a command from the Memory access category. The message also shows the format of the command.



Note Note - In some newer systems, descriptions of additional system-specific commands are available with the help command. Help as described may not be available on all systems.




A Caution About Using Some OpenBoot Commands

OpenBoot might not operate correctly after the operating system has begun execution (for example, after Stop-A or halt). This occurs when the operating system can modify the system state in ways that are inconsistent with continued OpenBoot operation. In this case, you might have to power cycle the system to restore normal operation. Not all OpenBoot commands referenced in this document are available on all systems. The behavior of some of the commands may vary from one system to another.

For example, suppose you boot the operating system, exit to OpenBoot, then execute the probe-scsi command (described in Chapter 2). You may find that probe-scsi fails, and you may not be able to resume the operating system, or you may have to power cycle the systems.

Re-execute an OpenBoot command that failed because the operating system has executed:

1. Note the value of the auto-boot? NVRAM configuration variable using printenv .

2. If the value is true, set the value to false using setenv .

3. Reset the system.

4. After the system stops at the user interface, type the OpenBoot command that failed.

5. Restore the value of the auto-boot? NVRAM configuration.

6. Reset the system.