[ZT]PSP program formats

The PSP uses ELF (Executable and Linking Format) as the executable format. These are packaged into a EBOOT.PBP along with other files for easy distribution and loading. When loaded, the MIPS cpu can run the code in kernel or user mode. Most of the XMB and drivers for the hardware boot in kernel mode. Most of the kernel code and device drivers for the PSP are coded in a relocateable executable format with the extension .prx. This format is a proprietary format made by Sony. Note that .prx format code need not run in kernel mode, but a vast majority of them are because Sony provided them to control the PSP hardware.

The EBOOT.PBP is an archive format to store many different files filled with data inside one larger file. Below is a breakdown of the different files that are known to exist inside a PSP EBOOT.PBP…
File Name Description
PARAM.SFO Basic header file describing the program
ICON0.PNG Graphical icon for the program that shows up in XMB
ICON1.PMF Animated icon for the program that shows up in XMB
UNKNOWN.PNG Background graphic for the program that shows up in XMB
PIC1.PNG Larger icon for the program that shows up in XMB
SND0.AT3 ATRAC3 music that plays in the XMB for the program
UNKNOWN.PSP The program itself
UNKNOWN.PSAR Encrypted contents of the program
The minimum required files needed to exist inside a EBOOT.PBP so that it can run from firmware 1.0 or 1.5 is PARAM.SFO and UNKNOWN.PSP
The PARAM.SFO (from the EBOOT.PBP above) is a variable length file containing information on the program. It has many optional labels that can be set as a parameter for the program. Below is a listing of a majority of them and common values for a typical update PBP that you place in /PSP/GAME/UPDATE on the memory stick…
Label Value
BOOTABLE Integer: 1
DISC_VERSION String: 1.00
REGION Integer: 32768
TITLE String: PSP Update ver 3.71
TITLE_0 String: (Japanese title)
TITLE_2 String: (French title)
TITLE_3 String: (Spanish title)
TITLE_4 String: (German title)
TITLE_5 String: (Italian title)
TITLE_6 String: (Dutch title)
TITLE_7 String: (Portuguese title)
TITLE_8 String: (Russian title)
TITLE_9 String: (Korean title)
TITLE_10 String: (Traditional Chinese title)
TITLE_11 String: (Simplified Chinese title)
UPDATER_VER String: 3.71
A typical homebrew EBOOT.PBP’s PARAM.SFO would contain these labels
Label Value
BOOTABLE Integer: 1
DISC_ID String: UCJS10000
DISC_VERSION String: 1.00
PSP_SYSTEM_VER String: 1.00
REGION Integer: 32768
TITLE String: MyHomebrewProg
Homebrew programs are normally loaded and run in user mode. In firmware 1.0 and 1.5, programs can actually load and run in kernel mode unencrypted from the memory stick. The difference is mainly the packaging of the EBOOT.PBP. Firmware 1.5 required two EBOOT.PBP in separate directories, while firmware 1.0 needed only one. This unencrypted loading (and running in kernel mode) ability was disabled in later firmware versions, however. Because of this, the vast majority of homebrew (homemade) software were made to run on either firmware 1.0 and 1.5. Many firmware downgraders and exploits were made in order to get PSPs flashed with official Sony firmware 2.0 and higher to “downgrade” back to firmware 1.0 and 1.5 in order to allow it to regain the ability to run homebrew software unencrypted (unsigned by Sony essentially). As a result, homebrew authors wrote code targetting firmware 1.50 (or 1.00) specifically because it is an official Sony firmware that actually did not prohibit running unencrypted (unsigned) code. This trend was solidified when later firmware releases complicated the loading of homebrew software, requiring special loaders that took advantage of bugs or exploits in either the XMB or commercial games. Because of this, homebrew software targetting these firmware versions are very very few, and people often just downgrade to firmware 1.50 or 1.00 to run homebrew software. However, downgrading to lower firmware often results in less features available from the XMB, thus an effort was made by some to make custom firmware that basically took Sony’s latest firmware and put back the ability to run unencrypted user mode code (with some offering ability to run in 1.50 kernel mode as well, which allowed old homebrew software to run unmodified). This custom firmware trend started when the latest firmware was 3.xx. Homebrew software authors nowadays thus still write for either firmware 1.00/1.50 (kernel or user mode), or in user mode for the latest custom firmware (3.xx). Because custom firmware are constantly changing with each official firmware upgrade from Sony, a stable environment for coding on custom firmware is still in flux. The PSP Slim, however, provided an extra 32MB of main memory that can be open for homebrew programmers. This extra memory is not available in firmware 1.0 and 1.5, and the PSP Slim hardware is so vastly different that firmware 1.0 and 1.5 cannot run on it (inside a custom firmware) without major modifications. Because of these reasons the newer trend is for some homebrew authors to basically break away from coding for firmware 1.0 and 1.5 and rely strictly on the latest version of unofficial custom firmware to provide them with the mechanism to run user mode code unencrypted from the memory stick. How this trend affects the homebrew community as a whole is still being sorted out.