| U-Boot for the Xtensa Architecture | 
| ================================== | 
|   | 
| Xtensa Architecture and Diamond Cores | 
| ------------------------------------- | 
|   | 
| Xtensa is a configurable processor architecture from Tensilica, Inc. | 
| Diamond Cores are pre-configured instances available for license and | 
| SoC cores in the same manner as ARM, MIPS, etc. | 
|   | 
| Xtensa licensees create their own Xtensa cores with selected features | 
| and custom instructions, registers and co-processors. The custom core | 
| is configured with Tensilica tools and built with Tensilica's Xtensa | 
| Processor Generator. | 
|   | 
| There are an effectively infinite number of CPUs in the Xtensa | 
| architecture family. It is, however, not feasible to support individual | 
| Xtensa CPUs in U-Boot. Therefore, there is only a single 'xtensa' CPU | 
| in the cpu tree of U-Boot. | 
|   | 
| In the same manner as the Linux port to Xtensa, U-Boot adapts to an | 
| individual Xtensa core configuration using a set of macros provided with | 
| the particular core. This is part of what is known as the hardware | 
| abstraction layer (HAL). For the purpose of U-Boot, the HAL consists only | 
| of a few header files. These provide CPP macros that customize sources, | 
| Makefiles, and the linker script. | 
|   | 
|   | 
| Adding support for an additional processor configuration | 
| -------------------------------------------------------- | 
|   | 
| The header files for one particular processor configuration are inside | 
| a variant-specific directory located in the arch/xtensa/include/asm | 
| directory. The name of that directory starts with 'arch-' followed by | 
| the name for the processor configuration, for example, arch-dc233c for | 
| the Diamond DC233 processor. | 
|   | 
|     core.h    Definitions for the core itself. | 
|   | 
| The following files are part of the overlay but not used by U-Boot. | 
|   | 
|     tie.h    Co-processors and custom extensions defined | 
|         in the Tensilica Instruction Extension (TIE) | 
|         language. | 
|     tie-asm.h    Assembly macros to access custom-defined registers | 
|         and states. | 
|   | 
|   | 
| Global Data Pointer, Exported Function Stubs, and the ABI | 
| --------------------------------------------------------- | 
|   | 
| To support standalone applications launched with the "go" command, | 
| U-Boot provides a jump table of entrypoints to exported functions | 
| (grep for EXPORT_FUNC). The implementation for Xtensa depends on | 
| which ABI (or function calling convention) is used. | 
|   | 
| Windowed ABI presents unique difficulties with the approach based on | 
| keeping global data pointer in dedicated register. Because the register | 
| window rotates during a call, there is no register that is constantly | 
| available for the gd pointer. Therefore, on xtensa gd is a simple | 
| global variable. Another difficulty arises from the requirement to have | 
| an 'entry' at the beginning of a function, which rotates the register | 
| file and reserves a stack frame. This is an integral part of the | 
| windowed ABI implemented in hardware. It makes using a jump table to an | 
| arbitrary (separately compiled) function a bit tricky. Use of a simple | 
| wrapper is also very tedious due to the need to move all possible | 
| register arguments and adjust the stack to handle arguments that cannot | 
| be passed in registers. The most efficient approach is to have the jump | 
| table perform the 'entry' so as to pretend it's the start of the real | 
| function. This requires decoding the target function's 'entry' | 
| instruction to determine the stack frame size, and adjusting the stack | 
| pointer accordingly, then jumping into the target function just after | 
| the 'entry'. Decoding depends on the processor's endianness so uses the | 
| HAL. The implementation (12 instructions) is in examples/stubs.c. | 
|   | 
|   | 
| Access to Invalid Memory Addresses | 
| ---------------------------------- | 
|   | 
| U-Boot does not check if memory addresses given as arguments to commands | 
| such as "md" are valid. There are two possible types of invalid | 
| addresses: an area of physical address space may not be mapped to RAM | 
| or peripherals, or in the presence of MMU an area of virtual address | 
| space may not be mapped to physical addresses. | 
|   | 
| Accessing first type of invalid addresses may result in hardware lockup, | 
| reading of meaningless data, written data being ignored or an exception, | 
| depending on the CPU wiring to the system. Accessing second type of | 
| invalid addresses always ends with an exception. | 
|   | 
| U-Boot for Xtensa provides a special memory exception handler that | 
| reports such access attempts and resets the board. | 
|   | 
|   | 
| ------------------------------------------------------------------------------ | 
| Chris Zankel | 
| Ross Morley |