summaryrefslogtreecommitdiff
path: root/README.md
blob: c38f54320fee4361826472e9cf093ef4688c482e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
RISC-V Open Source Supervisor Binary Interface (OpenSBI)
========================================================

The **RISC-V Supervisor Binary Interface (SBI)** is a recommended
interface between:

1. A platform specific firmware (M-mode) and a general purpose
   OS or hypervisor or bootloader (S-mode or HS-mode).
2. A hypervisor (HS-mode) and a general purpose OS or bootloader (VS-mode)

The *RISC-V SBI specification* is maintained as an independent project
by the RISC-V Foundation in [Github](https://github.com/riscv/riscv-sbi-doc)

OpenSBI aims to provides an open-source and extensible implementation of
the RISC-V SBI specification for case 1 mentioned above. OpenSBI
implementation can be easily extended by RISC-V platform or System-on-Chip
vendors to fit a particular hadware configuration.

OpenSBI provides three components:

1. *libsbi.a* - A generic OpenSBI static library
2. *libplatsbi.a* - Platform specific OpenSBI static library, that is,
                    libsbi.a plus platform specific hooks
3. *firmwares* - Platform specific bootable firmware binaries

Building and Installing generic *libsbi.a*
------------------------------------------

For cross-compiling, the environment variable *CROSS_COMPILE* must
be defined to specify the toolchain executable name prefix, e.g.
*riscv64-unknown-elf-* if the gcc executable used is
*riscv64-unknown-elf-gcc*.

To build the generic OpenSBI library *libsbi.a*, simply execute:
```
make
```

All compiled binaries will be placed in the *build* directory.
To specify an alternate build directory target, run:
```
make O=<build_directory>
```

To generate files to be installed for using *libsbi.a* in other projects,
run:
```
make install
```
This will create the *install* directory with all necessary include files
and binary files under it. To specify an alternate installation directory,
run:
```
make I=<install_directory> install
```

Building and Installing platform specific *libsbi.a* and firmwares
------------------------------------------------------------------

The libplatsbi.a and firmware files are only built if the
*`PLATFORM=<platform_subdir>`* argument is specified on make command lines.
*`<platform_subdir>`* must specify the path to one of the leaf directories
under the *`platform`* directory. For example, to compile the library and
firmware for QEMU RISC-V *virt* machine, *`<platform_subdir>`*
should be *`qemu/virt`*.

To build *libsbi, libplatsbi, and firmwares* for a specific platform, run:
```
make PLATFORM=<platform_subdir>
```
or

```
make PLATFORM=<platform_subdir> O=<build_directory>
```

To install *libsbi, headers, libplatsbi, and firmwares*, run:
```
make PLATFORM=<platform_subdir> install
```
or

```
make PLATFORM=<platform_subdir> I=<install_directory> install`
```

In addition, platform specific make command-line options to top-level make
, such as *PLATFORM_<xyz>* or *FW_<abc>* can also be specified. These
options are described under *docs/platform/<platform_name>.md* and
*docs/firmware/<firmware_name>.md*.

Documentation
-------------

A more detailed documenation is under the *docs* directory and organized
as follows.

* *docs/platform_guide.md* - Guidelines for adding new platform support
* *docs/library_usage.md* - Guidelines for using the static library
* *docs/platform/<platform_name>.md* - Platform specific documentation for
                                       the platform *<platform_name>*
* *docs/firmware/<firmware_name>.md* - Platform specific documentation for
                                       the firmware *<firmware_name>*

The source code is also well documented. For source level documentation,
doxygen style is used. Please refer to [Doxygen manual]
(http://www.stack.nl/~dimitri/doxygen/manual.html) for details on this
format.