Commit Graph

694 Commits

Author SHA1 Message Date
jmcneill e63dca36f8 Only define DEFAULT_TIMEOUT if it is not already defined. 2021-10-17 14:12:21 +00:00
nia b7fed38c88 Remove banner printing code from bootloaders, add it to libsa.
This harmonizes efiboot and the various x86 bootloaders to use shared
code for printing the banner. By friendly coincidence, it also adds
support for specifying 'banner=' in arm efiboot's boot.cfg, as on x86.
2021-09-07 11:41:31 +00:00
mlelstv 70b14a2a2d Add "root" command to provide a BTINFO_ROOTDEVICE parameter. 2021-05-30 05:59:22 +00:00
mrg 13c625776c add bi-endian support to the libsa ufs reader and enable it in efiboot.
ffs frontends to "ufs.c" now also define ufs_dinode_swap, ufs_indp_swap,
and FS_MAGIC (moved from ufs.c #if segments.)  these are used to call
the right (32/64 bit) ffsv1/v2 version.

ufs.c 'struct file' gains f_swapped member.  accessors for d_magic,
d_reclen, and d_ino are introduced (they need to be swapped.)  sfter
reading an inode from disk, read_inode() may call ufs_dinode_swap().
indirect block number and caches may be swapped.

error handling in ffs_find_superblock() is cleaned up.  (size is slightly
reduced on some ports with this part.)

defaults for new defines added to ufs.c.  (XXX: we build ufs.c but i think
all the consumers don't use it, and we can stop building it.)

LFS support is not included.

add a cut-down copy of ffs_bswap.c from the kernel.

also enable bi-endian disklabel support in efiboot.

most ports build and sizes compared for platforms that don't enable this
code and all but one saw reduced code size.  booted several platforms with
new boot code.
2021-05-27 06:54:44 +00:00
mrg ccb4458a63 in getdisklabel() swap the other-endian disklabel, #ifdef LIBSA_DISKLABEL_EI 2021-05-26 04:28:15 +00:00
jmcneill e6f176d843 Capture the endianness of the ELF file loaded in 'netbsd_elf_data', the
same way we do already for the class in 'netbsd_elf_class'.
2021-05-21 21:52:15 +00:00
mrg 7de9d97fa4 move bi-endian disklabel support from the kernel and libsa into libkern.
- dkcksum() and dkcksum_sized() move from subr_disk.c and from
  libsa into libkern/dkcksum.c (which is missing _sized() version),
  using the version from usr.sbin/disklabel.

- swap_disklabel() moves from subr_disk_mbr.c into libkern, now called
  disklabel_swap().  (the sh3 version should be updated to use this.)

- DISKLABEL_EI becomes a first-class option with opt_disklabel.h.

- add libkern.h to libsa/disklabel.c.

this enables future work for bi-endian libsa/ufs.c (relevant for ffsv1,
ffsv2, lfsv1, and lfsv2), as well as making it possible for ports not
using subr_disk_mbr.c to include bi-endian disklabel support (which,
afaict, includes any disk on mbr-supporting platforms that do not have
an mbr as well as disklabel.)

builds successsfully on: alpha, i386, amd64, sun2, sun3, evbarm64,
evbarm64-eb, sparc, and sparc64.  tested in anita on i386 and sparc,
testing in hardware on evbarm64*.
2021-05-17 08:50:36 +00:00
mrg 201465fecc push the FFSv1 superblock code into ffs_find_superblock() and
hide all the ugliness in this function, out of ufs_open().

NFC, objects same size if not identical.
2021-05-12 08:45:28 +00:00
rin 3bc8d4e817 Twiddle also for data transfer for seek. 2021-03-26 10:35:08 +00:00
rin ae5bdb2a50 Fix previous; define missing lfs_version. 2020-12-19 08:51:03 +00:00
rin eb10415da2 ufs_open(): Check fs->lfs_version ifdef LIBSA_*L*FS, not LIBSA_*F*FS.
This was harmless for FFS variants, that define LIBSA_FFSv[12], not LIBSA_FFS.
2020-12-19 07:19:30 +00:00
simonb 20d7b25b25 Add a slow twiddle option. This speeds up a pmax netboot by 15% and
is only 1% slower than no twiddle.
2020-09-29 00:13:12 +00:00
jmcneill 96b5c9e0fe Elf64_Phdr::p_offset is 64 bits, not 32 2020-09-13 13:31:36 +00:00
jmcneill 6fc9a861f9 Elf64_Phdr::p_flags is 32 bits, not 64 2020-09-13 11:09:01 +00:00
mrg c2082ece61 remove GCC_NO_ADDR_OF_PACKED_MEMBER for several subdir builds
that are now handled by lfs_accessors.h internally.
2020-09-07 03:09:53 +00:00
mrg 3b2eb8312b oops, move GCC_NO_ADDR_OF_PACKED_MEMBER into the right header. 2020-09-07 01:54:26 +00:00
mrg 8d620b78e2 apply GCC_NO_ADDR_OF_PACKED_MEMBER 2020-09-07 00:32:49 +00:00
jmcneill 1a7122d335 Support loading boot.cfg from non file-system based devices. 2020-06-27 17:22:12 +00:00
thorpej 30a26bde0a Make libsa's vsnprintf() work as expected when passed a NULL
destinatino buffer.
2020-06-06 15:45:47 +00:00
maxv d151321294 Update the comments. 2020-05-07 18:02:48 +00:00
skrll b3abdcbed7 Make a debug printf compile for all platforms 2020-01-26 10:13:10 +00:00
jakllsch e2703ffc13 Use dp->e2d_namlen rather than strlen(dp->e2d_name) in ext2fs_ls().
Prevents garbage beyond the end of the name from appearing on screen.
2020-01-24 13:20:33 +00:00
martin 39cd2eeea8 To support big partitions we need to make sure all byte offsets are calculated
in 64 bit arithmetic. Pointed out by Rob Newberry.
Unfortunately this causes a code size increase breaking some boot blocks,
so conditionalize it and use 32 bit arithmetic if SA_DOSFS_NO_BIG_PART_SUPPORT
is defined.
2020-01-22 06:11:28 +00:00
mrg 2a440dd580 apply the strncmp hack only to !clang. requested by tnn. 2019-11-21 21:45:34 +00:00
mrg 9631f22ff2 from the new comment:
* XXX Hack alert.  GCC 8.3 mis-compiles this function and calls
 * strncmp() with the wrong second pointer, as seen in PR#54703.
 *
 * Until the real cause is located, work around it by using -O1
 * for this function.

this hack is restricted to i386.
2019-11-21 07:34:39 +00:00
maxv ed6d73e306 Make sure we're dealing with a static binary. Otherwise we could crash if
the user mistakenly tries to boot a KASLR kernel with 'boot' instead of
'pkboot'. Now we fail cleanly. Reported by cryo@.
2019-10-17 14:00:28 +00:00
rin a1eeaadb07 Add SA_ENABLE_BIENDIAN option, which enable us to load kernel image of
opposite byte order (for arm EFI bootloader).

XXX
Currently, it is restricted to load_elf*.c. It would be nice if we can
recognize disklabel and filesystem of opposite byte order.
2019-07-21 16:53:17 +00:00
pgoyette 9ca404d49f Now that the ufs module has been split out from ffs and ext2fs, we need
to update the boot-loader to push all modules required to support the
booted filesystem.  We treat the fsmod string as a slash-separated list
of module names (relative to kern.module.path), rather than as a single
module path name.

Note that ffsv1 and ffsv2 are still exempted from the boot-loader's
auto-push, but the list of required filesystems is still noted in the
source.

Also note that arch/sandpoint needs a similar change.  I have not made
this change because I am totally unable to test it.

Tested on my kernel with _no_ built-in file-systems and with the ffs
bootloader settings of fsmod enabled.
2019-06-24 13:58:24 +00:00
maxv 61683f02cb Add KASLR support in UEFI. 2019-06-20 17:33:30 +00:00
christos b776acde1b Go back ot using 0x%x instead of %#x because we don't always support the
format. See subr_prf.c
2019-04-05 20:09:29 +00:00
christos 94ad267eb1 fix sign-compare and sign-passing errors. 2019-04-02 22:25:10 +00:00
christos 10497fd285 fix warnings, printf formats, etc. 2019-03-31 20:08:45 +00:00
mlelstv fff1131959 correct debug message, d->myport has network byte order. 2019-03-31 16:14:48 +00:00
mrg d64bb6b12a - remove unreachable code 2019-02-03 11:59:43 +00:00
jmcneill b655919a97 Support loading read-only data sections. ARM64 ELF kernels need this. ok skrll@ 2018-08-23 17:35:42 +00:00
christos de3955c3eb Use the standard build rules. 2018-06-05 00:57:47 +00:00
christos c50a4e606c - Introduce :q modifier for make variables and make it double escape $'s so
that passing variables to recursive makes with :q works as expected.
- Revert :Q to work as before.
- Adjust makefiles that use recursive make to use :q

Discussed on tech-toolchain@
XXX: pullup 8
2018-05-27 01:14:50 +00:00
maxv 93eba481f5 Remove annoying things, style, and fix buffer overflows. 2018-05-09 06:49:48 +00:00
nonaka 95e6c1170a efiboot: try to read boot.cfg from /EFI/NetBSD on ESP of the booted disk. 2018-04-02 09:44:18 +00:00
nonaka 58c029ad93 Add missed file in previous commit.
> efiboot: system can boot from CD/DVD-ROM media.
2018-03-08 23:02:50 +00:00
maxv 556958a38c Make sure we're loading a relocatable binary, to give the user a chance to
correct the kernel name if he mistakenly typed pkboot on a static kernel,
without having to reboot the machine (currently the prekern sees it's a
static kernel and panics).
2017-12-21 14:28:39 +00:00
maxv 26e9e80df3 Support large pages on KASLR kernels, in a way that does not reduce
randomness, but on the contrary that increases it.

The size of the kernel sub-blocks is changed to be 1MB. This produces a
kernel with sections that are always < 2MB in size, that can fit a large
page.

Each section is put in a 2MB physical chunk. In this chunk, there is a
padding of approximately 1MB. The prekern uses a random offset aligned to
sh_addralign, to shift the section in physical memory.

For example, physical memory layout created by the bootloader for .text.4
and .rodata.0:
 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
 |+---------------+                  |+---------------+                  |
 ||    .text.4    |       PAD        ||   .rodata.0   |       PAD        |
 |+---------------+                  |+---------------+                  |
 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
 PA                                  PA+2MB                         PA+4MB

Then, physical memory layout, after having been shifted by the prekern:
 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
 | P +---------------+               |          +---------------+        |
 | A |    .text.4    |      PAD      |   PAD    |   .rodata.0   |   PAD  |
 | D +---------------+               |          +---------------+        |
 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+
 PA                                  PA+2MB                         PA+4MB

The kernel maps these 2MB physical chunks with 2MB large pages. Therefore,
randomness is enforced at both the virtual and physical levels, and the
resulting entropy is higher than that of our current implementaion until
now.

The padding around the section is filled by the prekern. Not to consume
too much memory, the sections that are smaller than PAGE_SIZE are mapped
with normal pages - because there is no point in optimizing them. In these
normal pages, the same shift is applied.

This change has two additional advantages: (a) the cache attacks based on
the TLB are mostly mitigated, because even if you are able to determine
that a given page-aligned range is mapped as executable you don't know
where exactly within that range the section actually begins, and (b) given
that we are slightly randomizing the physical layout we are making some
rare physical attacks more difficult to conduct.

NOTE: after this change you need to update GENERIC_KASLR / prekern /
bootloader.
2017-11-15 18:02:36 +00:00
maxv 85357f1eab Don't process ELF sections that don't have the ALLOC flag set.
NOTE: you need to update both the prekern and the bootloader after this
change.
2017-11-13 21:32:21 +00:00
maxv 2c3f7fd267 Revert my last revision, that is to say, don't group sections into
segments anymore. Initially I did this because I wanted to compress the
sections by reducing the padding between them; but we'll handle that
differently.
2017-11-13 20:21:10 +00:00
maxv e1daa555fd Group the sections into segments, and align to KERNALIGN only between
segments. Prerequisite for other changes. Unfortunately the code is not
very compact, but whatever.
2017-10-18 16:29:56 +00:00
maxv f184c30907 Introduce two functions, and dedup code. 2017-10-13 10:39:26 +00:00
maxv 1b305151b2 Constify offset, it must not change. 2017-10-13 10:04:27 +00:00
maxv b0f8eacf51 Improve comments. 2017-10-08 13:51:31 +00:00
maxv a8d8f69c27 Add a new option in libsa, to load dynamic binaries. A separate function
is used, and it does not break in any way the generic static loader. Then,
add a new "pkboot" command in the x86 bootloader, which boots a
GENERIC_KASLR kernel via the prekern. (See thread on tech-kern@.)
2017-10-07 10:26:38 +00:00
christos 39acc162ef try a different style of __used. 2017-10-05 02:59:21 +00:00