# Changelog for Crate `multiboot2` ## Unreleased ## v0.23.1 (2024-10-21) - Fix wrong tag ID when using `BootdevTag::new` - `BootInformation::elf_sections` is now deprecated and replaced by the newly - added `BootInformation::elf_sections_tag`. On the returned type, you can call `.sections()` to iterate the sections - Fixed the debug output of `BootInformation` ## v0.23.0 (2024-09-17) - dependency updates - **Breaking:** MSRV is now 1.75 - Added missing tags along with getters for on `BootInformation`: - `ApmTag` - `BootdevTag` - `NetworkTag` - `BootInformation::tags` iterator is now public - misc metadata fixes ## v0.22.2 (2024-08-24) - Documentation improvements - Improve debug formatting for EFIMemoryMapTag ## v0.22.1 (2024-08-20) Minor documentation fixes. ## v0.22.0 (2024-08-20) This release contains another major refactoring of the internals, guaranteeing even more sanity checks for correct behaviour and lack of UB. In this release, the `Builder` was rewritten and lots of corresponding UB in certain corner cases removed. Further, the builder's API was streamlined. If you are interested in the internals of the major refactorings recently taken place, please head to the documentation of `multiboot2-common`. - **Breaking:** The builder type is now just called `Builder`. This needs the `builder` feature. - **Breaking:** The framebuffer tag was refactored and several bugs, memory - issues, and UB were fixed. It is now safe to use this, but some existing usages might break and need to be slightly adapted. - **Breaking:** The trait `TagTrait` was removed and was replaced by a new `Tag` trait coming from `multiboot2-common`. This only affects you if you provide custom tag types for the library. - **Breaking:** The error type returned by `BootInformation::load` has been changed. **General Note on Safety and UB (TL;DR: Crate is Safe)** The major refactorings of release `0.21` and `0.22` were an incredible step forward in code quality and memory safety. We have a comprehensive test coverage and all tests are passed by Miri. It might be that by using fuzzing, more corner and niche cases where UB can occur get uncovered. However, for every-day usage with sane bootloaders that do not intentionally create malformed tags, you are now absolutely good to go. Sorry for all the UB that silently slept insight many parts of the code base. This is a community project that has grown over the years. But now, the code base is in excellent shape! All previous versions have been marked as **YANKED**. `0.22.0` is the first version where all unit tests are passed by Miri, i.e., the first version without Undefined Behavior. ## 0.21.0 (2024-08-17) (**YANKED**) This release contains a massive refactoring of various internals. Now, almost all **unit tests pass Miri**, thus we removed lots of undefined behaviour and increased the memory safety! 🎉 Only a small part of these internal refactorings leak to the public interface. If you don't use external custom tags, you should be fine from any refactorings. _**Edit**: The builder and the framebuffer still contain some UB. This is fixed in the next release._ Please note that **all previous releases** must be considered unsafe, as they contain UB. However, it is never clear how UB results in immediate incorrect behaviour and it _might_ work. **Nevertheless, please migrate to the latest release and you'll be fine!** - **Breaking:** All functions that returns something useful are now `#[must_use]` - **Breaking:** More public fields in tags were replaced by public getters, such as `SmbiosTag::major()` - **Breaking:** Methods of `InformationBuilder` to add tags now consume references instead of owned values - **Breaking:** The `BoxedDst` has been removed in favor of a normal Rust `Box`. This only affects you if you use the `builder` feature. - **Breaking:** Introduced new `TagHeader` type as replacement for the `Tag` type that will be changed in the next step. `Tag` has been renamed to an internal-only `GenericTag` type. - Added missing `InformationBuilder::vbe_info_tag` - documentation enhancements - updated dependencies ## 0.20.2 (2024-05-26) (**YANKED**) - fix Debug implementation of `EfiMemoryMapTag` ## 0.20.1 (2024-05-26) (**YANKED**) - fixed the handling of `EFIMemoryMapTag` and `EFIMemoryAreaIter` - **BREAKING** Fixed wrong creation of `EFIMemoryMapTag`. `EFIMemoryMapTag::new` was replaced by `EFIMemoryMapTag::new_from_descs` and `EFIMemoryMapTag::new_from_map`. - `ModuleTag::new`'s `end` parameter now must be bigger than `start`. ## 0.20.0 (2024-05-01) (**YANKED**) - added `InformationBuilder::default()` - MSRV is 1.70 ## 0.19.0 (2023-09-21) (**YANKED**) - **BREAKING** MSRV is 1.69.0 - **BREAKING** `Tag::get_dst_str_slice` renamed to `Tag::parse_slice_as_string` and now returns `Result<&str, StringError>` - **BREAKING** `BootLoaderNameTag::name` now returns `Result<&str, StringError>` - **BREAKING** `CommandLineTag::cmdline` now returns `Result<&str, StringError>` - **BREAKING** `ModuleTag::cmdline` now returns `Result<&str, StringError>` - Introduced new enum type `StringError` - Additionally, a bug was fixed in `parse_slice_as_string` which now parses multiboot2 strings as expected: as null-terminated UTF-8 strings. - `InformationBuilder` now also allows to add custom tags. The new public method `add_tag` was introduced for that. ## 0.18.1 (2023-07-13) (**YANKED**) - Documentation improvements ## 0.18.0 (2023-07-13) (**YANKED**) - **BREAKING** The `TagTrait` was enhanced and now has an associated `ID` constant. This is only breaking to users that used `BootInformation::get_tag` or that implement custom tags. `BootInformation::get_tag` doesn't need the `typ` parameter anymore, as it can be deduced from the provided type. - **BREAKING** `BoxedDst::new` doesn't have the `typ` parameter anymore. This only effects you when you wrote a custom DST tag. - **BREAKING** Removed deprecated functions `load` and `load_with_offset`. Use `BootInformation::load` instead. - **BREAKING** Renamed `BootInformation::efi_32_ih_tag` to `BootInformation::efi_ih32_tag` for consistency. - **BREAKING** Renamed `BootInformation::efi_64_ih_tag` to `BootInformation::efi_ih64_tag` for consistency. - **BREAKING** Renamed `BootInformation::efi_std_32_tag` to `BootInformation::efi_std32_tag` for consistency. - **BREAKING** Renamed `BootInformation::efi_std_64_tag` to `BootInformation::efi_std64_tag` for consistency. - Better debug output of `BootInformation` and `MemoryArea` - Internal code cleanup. ## 0.17.0 (2023-07-12) (**YANKED**) - **BREAKING** Make functions of `InformationBuilder` chainable. They now consume the builder. - **BREAKING** Allow non-standard memory area types by using new pair of corresponding types: `MemoryAreaTypeId` and `MemoryAreaType`. ## 0.16.0 (2023-06-23) (**YANKED**) - **BREAKING** renamed `MULTIBOOT2_BOOTLOADER_MAGIC` to `MAGIC` - **BREAKING** `EFIMemoryDesc` was removed and is now an alias of `uefi_raw::table::boot::MemoryDescriptor` - **BREAKING** `EFIMemoryAreaType` was removed and is now an alias of `uefi_raw::table::boot::MemoryType` - **BREAKING** MSRV is 1.68.0 - **BREAKING** Removed `MemoryAreaIter` and `MemoryMapTag::available_memory_areas` - **BREAKING** Renamed `BootInformation::load_base_addr` to `BootInformation::load_base_addr_tag` - **BREAKING** Renamed `BootInformation::efi_32_ih` to `BootInformation::efi_32_ih_tag` - **BREAKING** Renamed `BootInformation::efi_32_ih` to `BootInformation::efi_32_ih_tag` - **BREAKING** Renamed `ImageLoadPhysAddr` to `ImageLoadPhysAddrTag` - **BREAKING** Renamed `EFIImageHandle32` to `EFIImageHandle32Tag` - **BREAKING** Renamed `EFIImageHandle64` to `EFIImageHandle64Tag` - **BREAKING** Renamed `EFISdt32` to `EFISdt32Tag` - **BREAKING** Renamed `EFISdt64` to `EFISdt64Tag` - **BREAKING** Renamed `EFIBootServicesNotExited` to `EFIBootServicesNotExitedTag` - **BREAKING** Renamed `CommandLineTag::command_line` renamed to `CommandLineTag::cmdline` - **\[Might be\] BREAKING** Added `TagTrait` trait which enables to use DSTs as multiboot2 tags. This is mostly relevant for the command line tag, the modules tag, and the bootloader name tag. However, this might also be relevant for users of custom multiboot2 tags that use DSTs as types. See the example provided in the doc of the `get_tag` method. - added a `builder` feature and a `builder` module with a `builder::InformationBuilder` struct - added `BootInformation::efi_bs_not_exited_tag` - deprecated `load` and `load_with_offset` - added `BootInformation::load` as new default constructor - added `MemoryMapTag::entry_size` and `MemoryMapTag::entry_version` ## 0.15.1 (2023-03-18) (**YANKED**) - **BREAKING** `MemoryMapTag::all_memory_areas()` was renamed to `memory_areas` and now returns `MemoryAreaIter` instead of `impl Iterator`. Experience showed that its better to return the specific iterator whenever possible. - **BREAKING** `MemoryMapTag::memory_areas()` was renamed to `available_memory_areas` (_Sorry for the breaking changes in a minor release, but I just stumbled upon this und since the last breaking release was just yesterday, users have to deal with changes anyway._) - **BREAKING** `ElfSection::name()` now returns a Result instead of just the value. This prevents possible panics. - fix: prevent a possible panic in `ElfSection::section_type()` ## 0.15.0 (2023-03-17) (**YANKED**) - **BREAKING** MSRV is 1.56.1 - **BREAKING** fixed lifetime issues: `VBEInfoTag` is no longer `&static` - **BREAKING:** `TagType` is now split into `TagTypeId` and `TagType` - `TagTypeId` is a binary-compatible form of a Multiboot2 tag id - `TagType` is a higher-level abstraction for either specified or custom tags but not ABI compatible. - There exists a seamless integration between `u32`, `TagType`, and `TagTypeId` via `From` and `PartialEq`-implementations. - fixed another internal lifetime issue - `BootInformation::framebuffer_tag()` now returns `Option>` instead of `Option` which prevents a possible panic. If the `--unstable` feature is used, `UnknownFramebufferType` implements `core::error::Error`. - Fixed misleading documentation of the `BootInformation::efi_memory_map_tag` - `BootInformation` now publicly exports the `get_tag` function allowing you to work with custom tags. An example is given in the function documentation. (check docs.rs). There is also a small unit test that you can use to learn from. ## 0.14.2 (2023-03-17) (**YANKED**) - documentation fixes - `MbiLoadError` now implements `Display` - Added the `unstable` feature, which enables nightly-only functionality. With this feature, `MbiLoadError` now implements `core::error::Error` and can be used with `anyhow::Result` for example. ## 0.14.1 (2023-03-09) (**YANKED**) - fixed the calculation of the last area of the memory map tag ([#119](https://github.com/rust-osdev/multiboot2/pull/119)) (Previously, iterating the EFI Memory map resulted in a superfluous entry as it ran over the next tag) ## 0.14.0 (2022-06-30) (**YANKED**) - **BREAKING CHANGES** \ This version includes a few small breaking changes that brings more safety when parsing strings from the multiboot information structure. - `BootLoaderNameTag::name` now returns a Result instead of just the value - `CommandLineTag::command_line` now returns a Result instead of just the value - `ModuleTag::cmdline` now returns a Result instead of just the value - `RsdpV1Tag::signature` now returns a Result instead of an Option - `RsdpV1Tag::oem_id` now returns a Result instead of an Option - `RsdpV2Tag::signature` now returns a Result instead of an Option - `RsdpV2Tag::oem_id` now returns a Result instead of an Option - internal code improvements ## 0.13.3 (2022-06-03) (**YANKED**) - impl `Send` for `BootInformation` ## 0.13.2 (2022-05-02) (**YANKED**) - `TagType` now implements `Ord` so that it can be used in `BTreeSet` - small internal improvements and restructuring of the code (no breaking changes to public API) ## 0.13.1 (2022-01-09) (**YANKED**) - minor fix ## 0.13.0 (2022-01-09) (**YANKED**) - added missing getters for tag `ImageLoadPhysAddr` - added missing getters for tags `EFIImageHandle32` and `EFIImageHandle64` ## 0.12.2 (2021-10-02) (**YANKED**) - `TagType` now implements `Eq` and `Hash` - internal improvements - `std` can be used in tests; the crate is still `no_std` - this implies that `cargo test` doesn't work on "non-standard" targets - CI (Ubuntu) still works. - code formatting/style - sensible style checks as optional CI job - `.editorconfig` file - prepared co-existence of crates `multiboot2` and `multiboot2-header` in a Cargo workspace inside the same repository ## 0.12.1 (2021-08-11) (**YANKED**) - `TagType`-enum introduced in `v0.11` is now actually public - internal code improvements ## 0.12.0 (2021-08-06) (**YANKED**) - **breaking:** `load()` and `load_with_offset` now returns a result - added public constant `MULTIBOOT2_BOOTLOADER_MAGIC` - Rust edition 2018 (instead of 2015) - internal code improvements ## 0.11.0 (2021-07-07) (**YANKED**) - **breaking:** iterator functions (e.g. `ElfSectionsTag::sections()`) return `impl Iterator` instead of a concrete type - lib now contains `TagType`-enum that contains all possible mbi tags that are specified (taken from spec) - much improved debug-formatting of `BootInformation` - internal code improvements / formatting ## 0.10.0 (2020-11-03) (**YANKED**) - allow access to all memory regions (MemoryMap-Tag) - internal code improvements ## 0.9.0 (2020-07-06) - Add a `checksum_is_valid` method to the RSDP tags ([#64](https://github.com/rust-osdev/multiboot2/pull/64)) ## 0.8.2 (2022-03-02) - Add some basic documentation ([#62](https://github.com/rust-osdev/multiboot2/pull/62)) - Add MemoryAreaType, to allow users to access memory area types in a type-safe way ([#61](https://github.com/rust-osdev/multiboot2/pull/61))