Hi Paul,
Paul Edwards wrote:
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 any BIOS.
It works both with any BIOS (int 14h provider) and any OS (that uses int 14h), so is a very general approach.
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.
For now I am happy if it only works with SeaBIOS, and I will simply buy a PC that allows me to flash SeaBIOS onto it.
PC Engines apu hardware comes with coreboot and SeaBIOS, but may or may not fit your application.
This seems to be a kit.
The bare board only needs power to run, everything is onboard. Some resellers may offer the board mounted in a case.
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 busses.
SeaBIOS was created to be a coreboot payload when a system with coreboot needed a BIOS to start the OS.
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.?
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.
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. UEFI implementations do not provide interrupt services, but a CSM can.
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.
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.
A virtual graphics adapter is fairly complicated so I guess that your end result will be much simpler than SGABIOS is.
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.
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.
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.
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.
You very likely don't want to get into developing a BT stack, especially not one running in a BIOS environment.
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.
//Peter