Support calling a function other than maininit() from reloc_preinit().

Pass a function pointer to reloc_preinit() instead of always running
maininit() after relocating the init code.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
post: Export functions which will be used individually by CSM

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Export callrom() for CSM to use

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Export copy_smbios() from biostables.c

Yes, copy_table() would invoke it, but CSM will *only* use it for SMBIOS
tables and however much we trick the compiler by gratuitously checking
the table signature right before calling copy_table(), it still doesn't
seem to notice that fact. And emits code for all the other three cases
we don't care about.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Add find_pmtimer() function

With CSM (and maybe coreboot) we'll want to find the pmtimer from the ACPI
tables, instead of knowing where it is and *putting* it into the ACPI
tables.

Extract the first part of the existing find_resume_vector() function into
a find_fadt() function, and use it from both find_resume_vector() and our
new find_pmtimer().

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Import LegacyBios.h from OVMF

This is under a BSD licence so it's fine to import directly.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Complete and checksum EFI_COMPATIBILITY16_TABLE at build time

GCC, for reasons unknown, will refuse to compile code such as
   extern int bar;
   uint16_t foo = &bar;

The assembler would happily emit a R_386_16 relocation for this if asked
nicely, and all would be well. But instead, GCC complains about the
initialiser not being constant.

So we tend to fill in 16-bit offsets at run-time, which is only
moderately inefficient. But for the CSM table used by EFI, it doesn't
work. We need the offset to be present in the *image*, before a line of
our own code has been run. Likewise the checksum.

This special-cases the table and entry point in checkrom.py rather than
attempting to do something generic. I did have a functional generic
implementation which could be invoked from csm.c along the lines of
 CHECKSUM(csm_compat_table, TableChecksum)
... and which would emit the required offsetof(typeof(\1), \2) into
a special data section which was elided from the final build but parsed
by 'objdump -s' and the location of the table to be checksummed was
inferred from the name of the *variable* that got put into that special
section... seriously, it's better just to special-case it.

It was baroque enough just for the checksums, and filling in the entry
point which required access to *two* symbols was probably going to involve
emitting a *string* into that special build-data section. It had to die.

So yes, we have hard-coded symbol names, and even magic numbers in the
python script for table offsets etc., but that's because this is an ABI.
It doesn't change, and neither do any of the other tables that we might
now consider filling at build time just to avoid having to spend time
on doing so at runtime.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Add pic_save_mask() and pic_restore_mask() functions

CSM will (unfortunately) need to use these.

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Ensure exported symbols are visible in the final link

I'm about to introduce some post-processing in checkrom.py which will want
access to public symbols. So let's make sure they're defined in the final
link even if they're *not* cross-referenced from a different code section.
build: Define 16bit exported symbols in final rom.o object.

Based on patch by: David Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Add CSM support

Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Modify CSM code for non-returning reloc_preinit system.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>