While looking at VM bootup times, we stumbled over the fact that the NVMe
code only does I/O operations of up to 4kb at a given point in time. This
is usually ok, but if you have an OS that loads a lot of data on boot in
combination to network backed storage, it shows in bootup times.
There is no need to restrict ourselves to 4kb though. The INT13 call we
receive gives us much larger chunks which we can just map into a native
bigger NVMe I/O call if the request buffer is page aligned.
This patch implements all logic required to do the above and gives a
substantial performance boost on boot.
v1 -> v2:
- fix dprintf
- Fix bounds check on PRP list add logic
- Reduce PRP list to 15 entries embedded in the ns struct.
This reduces BIOS reserved memory footprint by 4kb.
v2 -> v3:
- new patch: nvme: Split requests by maximum allowed size
- Adjust the maximum request size to sector units. The hardware field
describes it in pages.
Alexander Graf (4):
nvme: Record maximum allowed request size
nvme: Allow to set PRP2
nvme: Pass large I/O requests as PRP lists
nvme: Split requests by maximum allowed size
src/hw/nvme-int.h | 16 ++++++-
src/hw/nvme.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++-------
2 files changed, 121 insertions(+), 17 deletions(-)
Amazon Development Center Germany GmbH
Geschaeftsfuehrung: Christian Schlaeger, Jonathan Weiss
Eingetragen am Amtsgericht Charlottenburg unter HRB 149173 B
Ust-ID: DE 289 237 879
This series implements support for SMBIOS 3.0 entry points in
The main advantage of SMBIOS 3.0 entry points is the higher limit
for total table size. The SMBIOS 2.1 64435 bytes limit can be
easily hit in QEMU if creating virtual machines with more than
Eduardo Habkost (19):
biostables: copy_fseg_table() function
util.h: Delete unused get_smbios_entry_point() prototype
smbios: Rename code specific for SMBIOS 2.1 entry points
smbios: Generic smbios_next() function
smbios: smbios_get_tables() function
smbios: Use smbios_get_tables()/smbios_next() at display_uuid()
smbios: smbios_major_version()/smbios_minor_version() helpers
tpm: Use smbios_get_tables()
csm: Don't check SMBios21Addr before calling copy_smbios_21()
smbios: Make SMBios21Addr variable static
smbios: Use smbios_next() at smbios_romfile_setup()
smbios: Extract SMBIOS table building code to separate function
smbios: Make smbios_build_tables() more generic
smbios: smbios_21_setup_entry_point() function
smbios: Make some smbios_build_tables() arguments optional
smbios: Make smbios_build_tables() ready for 64-bit tables
smbios: copy_smbios_30() function
smbios: Support SMBIOS 3.0 entry point at copy_table()
smbios: Support SMBIOS 3.0 entry point at smbios_romfile_setup()
src/std/smbios.h | 17 ++-
src/util.h | 5 +-
src/fw/biostables.c | 259 +++++++++++++++++++++++++++++++++-----------
src/fw/csm.c | 6 +-
src/fw/smbios.c | 12 +-
src/tcgbios.c | 12 +-
6 files changed, 227 insertions(+), 84 deletions(-)
This patch series make seabios linkable with lld.
This is beneficial for FreeBSD ports as well
as they can drop an LLD_UNSAFE
As a maintainer of lld ELF, I have triaged numerous pieces of software.
seabios is the only one making use of
This drops the only instance https://sourceware.org/bugzilla/show_bug.cgi?id=12726
1, 2, 3 and 4 are really independent and can be applied in arbitrary order.
5 depends on 4. I originally combined 4 and 5 and that was why I don't think a patch series made sense.
Fangrui Song (5):
romlayout.S: Add missing SHF_ALLOC flag to .fixedaddr.\addr
Make rom16.o linkable with lld
Makefile: Change ET_EXEC to ET_REL so that lld can link bios.bin.elf
romlayout32flag.lds: Use `. +=` instead of `. =`
test-build.sh: Delete unneeded LD capability test
Makefile | 4 ++++
scripts/layoutrom.py | 13 ++++++++++---
scripts/test-build.sh | 42 +-----------------------------------------
src/romlayout.S | 2 +-
4 files changed, 16 insertions(+), 45 deletions(-)
This patch series adds support for all HD and QXGA resolutions.
It has been squashed into two commits as per your advice on version 2.
Elliot Killick (2):
svgamodes: Add all HD and QXGA resolutions
svgamodes: Improve formatting
vgasrc/svgamodes.c | 217 +++++++++++++++++++++++++++++----------------
1 file changed, 140 insertions(+), 77 deletions(-)
Hi Peter. Thanks for the great info.
>> Ok, the main thing is I don't want my OS to have to load
>> this, I want it loaded before the OS is loaded.
> I understood that, and an option ROM satisfies this.
Ok, thanks for confirming.
> The bare board only needs power to run, everything is onboard. Some
> resellers may offer the board mounted in a case.
Ok, I was hoping not to be involved in computers
where even getting a case is a challenge.
>> Does this imply most computers don’t allow their firmware to be
>> flashed with SeaBIOS?
> You can flash it, but the computer will no longer start.
> SeaBIOS doesn't perform hardware initialization of e.g. RAM and PCI
> SeaBIOS was created to be a coreboot payload when a system with coreboot
> needed a BIOS to start the OS.
Oh I see. In that case, let me rephrase - does this imply most
computers don't allow their firmware to be flashed with
>> If that is the case, is there someone else I should be negotiating with?
> Good question - it probably depends on the bigger picture of your project.
> What do you want to accomplish in the end? Is this a one-off thing or high
> volume, how deterministic must it be in which environment etc.?
I have an operating system already, called PDOS/386,
available at http://pdos.org
It uses the BIOS almost exclusively (switching back
and forth to RM16). I intend to eliminate the
non-BIOS code, and I intend to start using INT 14H
to access the outside world.
But for now, that’s the limits of the design changes
I wish to make to the OS.
I instead want to see if I can make the hardware/firmware
conform to the published specs I rely on, while operating
in a modern environment, with Wifi replacing modems.
And then I want to recommend to anyone purchasing
a computer to pay extra to get one that runs PDOS/386.
Other things they should ensure is that the BIOS can
convert all 3 USB sticks/ports into hard disks, not just the
one that is being booted.
Currently I don't know what to recommend, because I
don't understand the other side of the INT 13H/14H,
only the OS side.
And I don't know what is technically possible, so that
there is something to recommend in the future.
>> > Think of an option ROM as a modular expansion to any BIOS.
>> This sounds promising. So perhaps manufacturers allow
>> option ROMs to be flashed, but just not the entire
>> BIOS to be replaced?
> Option ROMs traditionally exist primarily on option cards. SeaBIOS is
> cleverer and can also run option ROMs in the boot flash.
> A proprietary BIOS or UEFI will not likely run an option ROM from the
> boot flash.
I don't need the proprietary one to work, so long as it
can be replaced with coreboot + SeaBIOS.
>> > Here's an open source option ROM: https://github.com/alson/sgabios
>> > It's x86 real mode assembly; the typical BIOS environment.
>> I took a look thanks. But actually I am hoping all of this will
>> be in C. I was expecting INT 14H to be minimal x86 real
>> mode that switched to UEFI C code,
> Oh, UEFI..
> You may know, but interrupt services such as int 14h are a BIOS interface,
> as provided by traditional BIOS implementations.
Sure. For now, I want PDOS/386 to remain traditional.
When I have exhausted everything that is possible
via the BIOS, I will consider adding UEFI support.
> UEFI implementations do
> not provide interrupt services, but a CSM can.
Sure. And there's no disadvantage in CSM, is there?
>> the same as CSM does (right?).
> I don't think UEFI mandates /how/ a CSM implements the interrupt services,
> I'd expect that a CSM can do what it wants without calling into UEFI, but
> depending on what it needs to do it may /want/ to call into UEFI.
Yeah, I'm on the "want" side of that. I'd like to be executing
C-derived code as much as possible.
>> I read that SeaBIOS supports CSM.
> SeaBIOS can act as CSM, at a minimum in VMs, I don't know what the
> situation is with UEFI implementations on hardware.
I don't really understand this. What I'm looking for, at
least ideally, is for a BIOS implementation that switches
to 32-bit or 64-bit mode, and C, to do the actual work.
I thought that was how modern systems worked, and
the very definition of CSM?
>> Ok, for the specific case of converting INT 14H into Bluetooth -
>> I assume that much Bluetooth hardware is proprietary.
> Bluetooth is one of the most, if not the most, proprietary contemporary
> technologies. I think it may be the original case of a quasi-open
> standardization process coupled with fierce intent to keep any
> implementations as closed as possible.
Ok, this is a good starting point for analysis then. The
protocol itself must be open, for two bluetooth devices
to talk to each other. So at what level is it proprietary?
Everyone develops their own silicon?
>> But I know that libbluetooth exists.
> What does libbluetooth refer to, exactly?
> If you mean the shared library (.so file) on Linux systems then that
> isn't relevant for your idea.
Yes, that's what I was referring to. I read that the specs
for bluetooth were buried in the libbluetooth source
code, rather than a document.
>> Basically is it possible to flash libbluetooth onto an option ROM,
>> add 100 lines of x86 assembler to switch to long mode from INT 14H,
>> call libbluetooth, and call it a day?
> No way.
Ok. But that's where my level of understanding is. :-)
>> Or approximately how many lines of x86 assembler and C
>> code are required in addition to what SeaBIOS + libbluetooth
>> already provide? Or is there some technical problem
>> prohibiting this solution?
> The latter. libbluetooth.so is a mere fraction of the software involved
> in using BT on a Linux system. The majority exists in the Linux kernel
> and uses lots of kernel infrastructure, so can not run standalone.
Could it have been modularized so that it could run
standalone? Isn't that what drivers are for? Maybe
if drivers were written to a particular standard they
could be flashed onto the firmware?
> You very likely don't want to get into developing a BT stack, especially
> not one running in a BIOS environment.
I had hoped it already existed, and just needed to be
rearranged and flashed.
The only abnormal thing I wish to do is to get a traditional
INT 14H to call someone else's stack.
> I strongly recommend to keep all BT parts of this project in separate
> hardware outside of the x86 system and to choose/design that hardware
> such that it's comfortable to use in your int 14h handler.
> Since the apu board has two serial ports (one internal on a header)
> its BIOS may already provide int 14h services for those ports, then you
> could just connect a transparent BT UART and be done, no software needed
> at all for that.
The point of my firmware project is not to make BT UARTs
sell like hotcakes. BT is just one target. A more useful one
is Wifi. But I think BT is better for abstracting the problem.
This is a general question about the hardware manufacturing
What options exist for bending hardware (firmware) to the will
of my operating system?
Someone mentioned "SeaBIOS" which is why I'm here, but
I may be in the wrong place.
Obviously I can always go back to 1990 and my OS will work
fine with a real serial port and a real modem.
But I'd like to transport all of that software, designed for
that environment, and change nothing at all, and have
it work on a new environment that includes Wifi, bluetooth
and maybe ethernet, and maybe infrared, and maybe
other things I don't know about, but make sense (at
some level) to be accessed via INT 14H.
But I'm only talking about functions 1 (write) and 2 (read)
of INT 14H. I expect function 0 (initialize) to have no meaning
on modern hardware, and should always have been done
via a separate "MODE" command in MSDOS (and now
PDOS/386), and in a modern environment, you can do the
MODE command if you want, and PDOS/386 will dutifully
pass that on to function 0, as MSDOS presumably did, but
(something - SeaBIOS?) will not actually do anything, because
everything (ie the bluetooth hardware) is effectively operating
at N,8,1 and maximum speed.
Resending ... I thought I was subscribed, but apparently
I am not.
From: Paul Edwards
Sent: Tuesday, June 29, 2021 9:00 AM
Subject: Re: INT 14H
Thanks for your reply.
> Sure. Implement a driver for that redirection which behaves as an
> int14h handler and place the address of its entry point at address
> 0000:0080. (14h*4)
> The method works with any BIOS.
I would like it to work with any OS that uses INT 14H
(regardless of how many of those exist), rather than
For now I am happy if it only works with SeaBIOS, and
I will simply buy a PC that allows me to flash SeaBIOS
Other manufacturers can do other things with INT 14H,
redirecting it to some other device, such as HAM radio.
> If suitable for your hardware you could do all of it in an option ROM.
I'm not familiar with this terminology. Is this something
that goes into SeaBIOS? I'm expecting it to be something
that is set up (and even configured by the end user in the
BIOS) before my OS is even loaded.