# Build SD card image
You can build all-in-one SD card image by single make command from [this commit](https://github.com/keystone-enclave/keystone/commit/a06b05485ed59489ba0a8158a7de8c85988a1009).
```shell
make KEYSTONE_PLATFORM=unmatched -j $(nproc)
```
SD card image is to be located in `build-unmatched64/buildroot.build/images/sdcard.img`
## Included components
Some patches included in [freedom-u-sdk](https://github.com/sifive/freedom-u-sdk) are also applied.
- U-Boot SPL
- applied secureboot patch for Keystone
- Keystone SM (OpenSBI)
- U-Boot
- load address is modified due to PMP conflict issue
- Buildroot
- Linux
- Keystone Driver
## Known Issues
- building linux perf sometimes fails
- re-running make , build will succeed
# Deal with buildroot build system
In Keystone's build system, buildroot target can be passed directly by `BUILDROOT_TARGET`. For example,
```shell
make BUILDROOT_TARGET=linux-build
```
Target name format is `<package>-<command>`. `<package>` is package name such as linux, u-boot, opensbi and keystone-sm. `<command>` is subcommand for package such as build, configure, patch, clean and rebuild.
# Build single component
## Keystone SM
You can build following command:
```shell
make KEYSTONE_PLATFORM=unmatched BUILDROOT_TARGET=opensbi-build
```
Artifacts are located in `build-unmatched64/buildroot.build/build/opensbi-<version>/build/platform/generic/firmware`
### PMP issue
Security Monitor set no permission to range `0x80000000 - 0x801fffff`. But U-Boot initially set stack pointer its load address, `0x80200000`, and stack stretches to lower region. So U-Boot try to touch protected region, and access violation occurs.
Changing U-Boot's load address to upper region solve this issue. U-Boot built in keystone build system is loaded to `0x80210000`.
U-Boot load address can be changed by adding/modifying config as following:
```
CONFIG_TEXT_BASE=0x80210000
CONFIG_SYS_LOAD_ADDR=0x80210000
```