[librm] Enable the use of SSE instructions if supported by the CPU Clear CR0.EM, clear CR0.TS, and set CR4.OSFXSR in order to allow the execution of SSE instructions such as the AES-NI instructions for AES hardware acceleration. Note that we have to assert CR4.OSFXSR to allow these instructions to execute, but our context switching logic (e.g. the protected-mode and long-mode interrupt handlers) does not actually preserve the FPU/MMX/SSE registers. Our C code therefore cannot in general presume that the FPU/MMX/SSE registers will be preserved across arbitrary context boundaries. However, since C code executes with interrupts disabled, an individual function may safely use temporary FPU/MMX/SSE registers provided that it does not enable interrupts or otherwise relinquish the context. For the same C code to also be usable under the UEFI IA-32 ABI, it must preserve all registers other than %eax, %ecx, and %edx, including preserving all MMX and XMM registers. The practical upshot is therefore that C code may use SSE instructions and may assume that SSE registers will not be changed arbitrarily during execution (either because the ABI guarantees preservation, as with UEFI or Linux, or because the runtime environment guarantees that interrupts are disabled), but the C code must itself restore the values of any modified FPU/MMX/SSE registers. The "fxsave"/"fxrstor" performed by virt_call() would allow for a slightly more relaxed constraint if support for the UEFI IA-32 ABI were ever to be dropped in future. A real-mode caller that is making use of SSE must have already set OSFXSR, and so its non-64-bit registers %xmm0-%xmm7 would already be saved and restored across virt_call(). The tightest constraint would then become the UEFI X64 ABI, which defines %xmm0-%xmm5 as volatile (i.e. caller-saved): this would allow C code in iPXE to use %xmm0-%xmm5 without needing to explicitly save and restore their values. Signed-off-by: Michael Brown <mcb30@ipxe.org>
iPXE is the leading open source network boot firmware. It provides a full PXE implementation enhanced with additional features such as:
boot from a web server via HTTP or HTTPS,
boot from an iSCSI, FCoE, or AoE SAN,
control the boot process with a script,
You can use iPXE to replace the existing PXE ROM on your network card, or you can chainload into iPXE to obtain the features of iPXE without the hassle of reflashing.
iPXE is free, open-source software licensed under the GNU GPL (with some portions under GPL-compatible licences).
You can download the rolling release binaries (built from the latest commit), or use the most recent stable release.
For full documentation, visit the iPXE website.