cpu/qemu: Enable IDT_IN_EVERY_STAGE
[coreboot.git] / Documentation / index.md
blob7ba88f30ef39d63426002b0fbcc3470aef66f3ad
1 # Welcome to the coreboot documentation
3 This is the developer documentation for [coreboot](https://coreboot.org).
4 It is built from Markdown files in the [Documentation] directory in the
5 source code.
7 ## Spelling of coreboot
9 The correct spelling of coreboot is completely in lower case characters and in
10 one word without a space between the two parts.
12 ## Purpose of coreboot
14 coreboot is a project to develop open source boot firmware for various
15 architectures. Its design philosophy is to do the bare minimum necessary to
16 ensure that hardware is usable and then pass control to a different program
17 called the _payload_.
19 ### Separation of concerns
21 The payload can then provide user interfaces, file system drivers,
22 various policies etc. to load the OS. Through this separation of concerns
23 coreboot maximizes reusability of the complicated and fundamental hardware
24 initialization routines across many different use cases, no matter if
25 they provide standard interfaces or entirely custom boot flows.
27 Popular [payloads](payloads.md) in use with coreboot are SeaBIOS,
28 which provides PCBIOS services, edk2, which provides UEFI services,
29 GRUB2, the bootloader used by many Linux distributions, or depthcharge,
30 a custom boot loader used on Chromebooks.
32 ### No resident services (if possible)
34 Ideally coreboot completely hands over control to the payload with no
35 piece of coreboot remaining resident in the system, or even available
36 for callback.  Given the reality of contemporary computer design,
37 there's often a small piece that survives for the whole runtime of
38 the computer. It runs in a highly privileged CPU mode (e.g. SMM on x86)
39 and provides some limited amount of services to the OS. But here, too,
40 coreboot aims to keep everything at the minimum possible, both in scope
41 (e.g. services provided) and code size.
43 ### No specification of its own
45 coreboot uses a very minimal interface to the payload, and otherwise
46 doesn't impose any standards on the ecosystem. This is made possible by
47 separating out concerns (interfaces and resident services are delegated
48 to the payload), but it's also a value that is deeply ingrained in the
49 project. We fearlessly rip out parts of the architecture and remodel it
50 when a better way of doing the same was identified.
52 That said, since there are attempts to coerce coreboot to move in various
53 directions by outside "standardization", long-established practices of
54 coreboot as well as aligned projects can be documented as best practices,
55 making them standards in their own right. However we reserve the right to
56 retire them as the landscape shifts around us.
58 ### One tree for everything
60 Another difference to various other firmware projects is that we try
61 to avoid fragmentation: the traditional development model of firmware
62 is one of "set and forget" in which some code base is copied, adapted
63 for the purpose at hands, shipped and only touched again if there's an
64 important fix to do.
66 All newer development happens on another copy of some code base without
67 flowing back to any older copy, and so normally there's a huge amount
68 of fragmentation.
70 In coreboot, we try to keep everything in a single source tree, and
71 lift up older devices when we change something fundamentally. That way,
72 new and old devices benefit alike from new development in the common parts.
74 There's a downside to that: Some devices might have no maintainer anymore
75 who could ensure that coreboot is still functional for them after a big
76 rework, or maybe a rework even requires knowledge that doesn't exist
77 anymore within the project (for example because the developer moved on
78 to do something else).
80 In this case, we announce the deprecation of the device and defer the big
81 rework until the deprecation period passed, typically 6-12 months. This
82 gives interested developers a chance to step in and bring devices up to
83 latest standards.
85 While without this deprecation mechanism we could inflate the number
86 of supported devices (probably 300+), only a tiny fraction of them
87 would even work, which helps nobody.
89 ## Scope of the coreboot project
91 coreboot as a project is closer to the Linux kernel than to most
92 user level programs. One place where this becomes apparent is the
93 distribution mechanism: The project itself only provides source code
94 and does not ship ready-to-install coreboot-based firmware binaries.
96 What the project distributes, even if - strictly speaking - it's not
97 part of the project, is a collection of vendor binaries (that we call
98 "blobs") that are redistributable. They cover the parts of hardware init
99 that we haven't managed to open up, and while some hardware requires them,
100 there's still hardware that can boot without any such binary components.
102 The build system can integrate them into the build automatically if
103 required, but that requires explicit opt-in and downloads a separate
104 repository to ensure that the distinction remains clear.
106 There are various [distributions](distributions.md), some shipping
107 coreboot with their hardware (e.g. Purism or Chromebooks), others
108 providing after-market images for various devices (e.g. Libreboot,
109 MrChromebox).
111 If you want to use coreboot on your system, that's great!
113 Please note that the infrastructure around coreboot.org is built for
114 development purposes. We gladly help out users through our communication
115 channels, but we also expect a "firmware developer mindset": If compiling
116 your own firmware and, at some point, recovering from a bad flash by
117 hooking wires onto chips in your computer sounds scary to you, you're
118 right, as it is.
120 If that's _way_ beyond your comfort zone, consider looking into the
121 various distributions, as they typically provide pre-tested binaries
122 which massively reduces the risk that the binary you write to flash is
123 one that won't boot the system (with the consequence that to get it to work
124 again, you'll need to attach various tools to various chips)
126 ## The coreboot community
128 If you're interested in getting your hands dirty (incl. potentially wiring
129 up an external flasher to your computer), you've come to the right place!
131 We have various [forums](community/forums.md) where we discuss and coordinate
132 our activities, review patches, and help out each other. To
133 help promote a positive atmosphere, we established a [Code of
134 Conduct](community/code_of_conduct.md). We invested a lot of time
135 to balance it out, so please keep it in mind when engaging with the
136 coreboot community.
138 Every now and then, coreboot is present in one way or another at
139 [conferences](community/conferences.md). If you're around, come and
140 say hello!
142 ## Blob policy in the coreboot project
144 The goal of the coreboot project is to provide a FOSS firmware solution across
145 multiple CPU architectures, such as ARM, x86, and RISC-V. While fully open
146 source implementations for these architectures are encouraged and preferred,
147 we understand that a fully open implementation whereby every firmware component
148 is available as source code for modern platforms is not always feasible.
149 Different reasons inhibit the availability of fully open implementations,
150 including limited development resources, 3rd party license constraints of
151 IP blocks, or a legacy mindset of the silicon vendors.
153 It is important for the coreboot project to have support for modern CPU
154 platforms in order to provide a viable alternative for proprietary firmware
155 implementations. We do not have direct control over how hardware vendors design
156 their products, however we can provide an attractive alternative to the
157 expensive and complicated proprietary firmware model that exists today.
158 For modern platforms, we are largely dependent on the silicon
159 vendor to provide additional information on how to properly initialize the
160 hardware, as the required datasheets are often only available with an NDA.
161 Therefore, one possible way to have coreboot support for the latest platforms
162 is binary code (aka, a blob) provided by the silicon vendor. While we do
163 discourage this solution, it can be a door opener for coreboot’s support of a
164 given platform and thus keep coreboot functional on modern platforms. It is
165 clearly not the goal of the project to accept every blob a silicon vendor wishes
166 to use without question. On the contrary, each new blob needs to be examined
167 critically by the community, evaluating the need, risk, and alternative options.
169 Wherever possible, introducing new blobs should be avoided. That said, there
170 can be situations where a piece of code provided as a blob will enable the rest
171 of the fully open source firmware stack on a brand new platform. If blocking
172 this blob would lead to no support at all for the platform in question in
173 coreboot, this situation needs to be examined carefully. While these kinds
174 of discussion will be coordinated closely with the community (e.g. on the
175 mailing list or dedicated meetings), ultimately it is up to the leadership to
176 decide if there is no agreement between the community and the vendor pushing for
177 the new blob. This decision will be communicated on the mailing list.
178 Please see additionally
179 [coreboot binary policy](https://github.com/coreboot/blobs/blob/master/README.md).
181 ## Getting the source code
183 coreboot is primarily developed in the
184 [git](https://review.coreboot.org/plugins/gitiles/coreboot) version control
185 system, using [Gerrit](https://review.coreboot.org) to manage
186 contributions and code review.
188 In general we try to keep the `main` branch in the repository functional
189 for all hardware we support. So far, the only guarantee we can make is
190 that the main branch will (nearly) always build for all boards in a
191 standard configuration.
193 However, we're continually working on improvements to our infrastructure to
194 get better in that respect, e.g. by setting up boot testing facilities. This
195 is obviously more complex than regular integration testing, so progress
196 is slow.
198 ### What our releases mean
200 We also schedule two source code releases every year, around April and
201 October. These releases see some very limited testing and mostly serve
202 as synchronization points for deprecation notices and for other projects
203 such as external distributions.
205 This approach and terminology differs somewhat from how other projects handle
206 releases where releases are well-tested artifacts and the development
207 repository tends to be unstable. The "rolling release" model of some projects,
208 for example OpenBSD, is probably the closest cousin of our approach.
210 Contents:
212 ```{toctree}
213 :maxdepth: 1
215 Getting Started <getting_started/index.md>
216 Tutorial <tutorial/index.md>
217 Contributing <contributing/index.md>
218 Community <community/index.md>
219 Payloads <payloads.md>
220 Distributions <distributions.md>
221 Technotes <technotes/index.md>
222 ACPI <acpi/index.md>
223 Native Graphics Initialization with libgfxinit <gfx/libgfxinit.md>
224 Display panel <gfx/display-panel.md>
225 CPU Architecture <arch/index.md>
226 Platform independent drivers <drivers/index.md>
227 Northbridge <northbridge/index.md>
228 System on Chip <soc/index.md>
229 Mainboard <mainboard/index.md>
230 Payloads <lib/payloads/index.md>
231 Libraries <lib/index.md>
232 Options <lib/option.md>
233 Security <security/index.md>
234 SuperIO <superio/index.md>
235 Vendorcode <vendorcode/index.md>
236 Utilities <util.md>
237 Software Bill of Materials <sbom/sbom.md>
238 Project infrastructure & services <infrastructure/index.md>
239 Boards supported in each release directory <releases/boards_supported_on_branches.md>
240 Release notes <releases/index.md>
241 Acronyms & Definitions <acronyms.md>
242 External Resources <external_docs.md>
243 Documentation License <documentation_license.md>
246 [Documentation]: https://review.coreboot.org/plugins/gitiles/coreboot/+/refs/heads/main/Documentation/