]> git.ipfire.org Git - thirdparty/grub.git/log
thirdparty/grub.git
2 years agofs/hfsplus: Set grub_errno to prevent NULL pointer access
Lidong Chen [Wed, 3 May 2023 17:32:19 +0000 (17:32 +0000)] 
fs/hfsplus: Set grub_errno to prevent NULL pointer access

When an invalid node size is detected in grub_hfsplus_mount(), data
pointer is freed. Thus, file->data is not set. The code should also
set the grub_errno when that happens to indicate an error and to avoid
accessing the uninitialized file->data in grub_file_close().

Signed-off-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agofs/hfsplus: Prevent out of bound access in catalog file
Lidong Chen [Wed, 3 May 2023 17:32:18 +0000 (17:32 +0000)] 
fs/hfsplus: Prevent out of bound access in catalog file

A corrupted hfsplus can have a catalog key that is out of range. This
can lead to out of bound access when advancing the pointer to access
catalog file info. The valid range of a catalog key is specified in
HFS Plus Technical Note TN1150 [1].

[1] https://developer.apple.com/library/archive/technotes/tn/tn1150.html

Signed-off-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agofs/hfsplus: Validate btree node size
Lidong Chen [Wed, 3 May 2023 17:32:17 +0000 (17:32 +0000)] 
fs/hfsplus: Validate btree node size

The invalid btree node size can cause crashes when parsing the btree.
The fix is to ensure the btree node size is within the valid range
defined in the HFS Plus technical note, TN1150 [1].

[1] https://developer.apple.com/library/archive/technotes/tn/tn1150.html

Signed-off-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoINSTALL: Use exfat-utils package instead of exfatprogs
Glenn Washburn [Sun, 14 May 2023 04:21:20 +0000 (23:21 -0500)] 
INSTALL: Use exfat-utils package instead of exfatprogs

The exfat-utils package is an older package complementing exfat-fuse, and
was the only exfat tools for a long time. The exfat filesystem testing code
was written with these tools in mind. A newer project exfatprogs appears to
be of better quality and functionality and was written to complement the
somewhat new exfat kernel module. Ideally we should be using the newer
exfatprogs. However, the command line interface for mkfs.exfat is different
between the two. So we can't use the exfatprogs tools until the test scripts
have been updated to account for this. Recommend installing exfat-utils
instead of exfatprogs for now.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoINSTALL: Document that building grub-mkfont requires xfonts-unifont
Glenn Washburn [Sat, 29 Apr 2023 05:08:03 +0000 (00:08 -0500)] 
INSTALL: Document that building grub-mkfont requires xfonts-unifont

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agonet/dns: Fix lookup error when no IPv6 is returned
Renaud Métrich [Wed, 3 May 2023 10:21:31 +0000 (12:21 +0200)] 
net/dns: Fix lookup error when no IPv6 is returned

When trying to resolve DNS names into IP addresses, the DNS code fails
from time to time with the following error:
-------- 8< ---------------- 8< ---------------- 8< ---------------- 8< --------
error: ../../grub-core/net/dns.c:688:no DNS record found.
-------- 8< ---------------- 8< ---------------- 8< ---------------- 8< --------

This happens when both IPv4 and IPv6 queries are performed against the
DNS server (e.g. 8.8.8.8) but there is no IP returned for IPv6 query, as
shown below:
-------- 8< ---------------- 8< ---------------- 8< ---------------- 8< --------
grub> net_del_dns 192.168.122.1
grub> net_add_dns 8.8.8.8
grub> net_nslookup ipv4.test-ipv6.com
error: ../../grub-core/net/dns.c:688:no DNS record found.
grub> net_nslookup ipv4.test-ipv6.com
216.218.228.115
-------- 8< ---------------- 8< ---------------- 8< ---------------- 8< --------

The root cause is the code exiting prematurely when the data->addresses
buffer has been allocated in recv_hook(), even if there was no address
returned last time recv_hook() executed.

Signed-off-by: Renaud Métrich <rmetrich@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agonet/dns: Add debugging messages in recv_hook() function
Renaud Métrich [Wed, 3 May 2023 10:21:30 +0000 (12:21 +0200)] 
net/dns: Add debugging messages in recv_hook() function

Signed-off-by: Renaud Métrich <rmetrich@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agonet/dns: Simplify error handling of recv_hook() function
Renaud Métrich [Wed, 3 May 2023 10:21:29 +0000 (12:21 +0200)] 
net/dns: Simplify error handling of recv_hook() function

Signed-off-by: Renaud Métrich <rmetrich@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agonet/dns: Fix removal of DNS server
Renaud Métrich [Fri, 28 Apr 2023 11:05:37 +0000 (13:05 +0200)] 
net/dns: Fix removal of DNS server

When deleting the DNS server, we get the following error message:
-------- 8< ---------------- 8< ---------------- 8< ---------------- 8< --------
grub> net_del_dns 192.168.122.1
error: ../../grub-core/net/dns.c:646:no DNS reply received.
-------- 8< ---------------- 8< ---------------- 8< ---------------- 8< --------

This happens because the implementation is broken, it does a "add"
internally instead of a "delete".

Signed-off-by: Renaud Métrich <rmetrich@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests: Add LoongArch to various test cases
Xiaotian Wu [Thu, 27 Apr 2023 07:46:22 +0000 (15:46 +0800)] 
tests: Add LoongArch to various test cases

I ran the test suite on a 3A5000 desktop, a LoongArch architecture machine,
using Archlinux for LoongArch distro, see https://github.com/loongarchlinux.

Some software versions are:
* linux 6.3.0-rc4
* gcc 13.0.1 20230312
* binutils 2.40
* qemu 7.2.0

The test results of running "make check" with qemu 7.2 are as follows:

=================================
   GRUB 2.11: ./test-suite.log
=================================

  # TOTAL: 85
  # PASS:  73
  # SKIP:  8
  # XFAIL: 0
  # FAIL:  2
  # XPASS: 0
  # ERROR: 2

.. contents:: :depth: 2

ERROR: f2fs_test
================

mount: /tmp/grub-fs-tester.20230418175640563815408.f2fs.UDs/f2fs_rw: unknown filesystem type 'f2fs'.
       dmesg(1) may have more information after failed mount system call.
MOUNT FAILED.
ERROR f2fs_test (exit status: 99)

FAIL: hfs_test
==============

recode: Request `utf8..macroman' is erroneous
mkfs.hfs: name required with -v option
FAIL hfs_test (exit status: 1)

ERROR: zfs_test
===============

zpool not installed; cannot test zfs.
ERROR zfs_test (exit status: 99)

SKIP: pata_test
===============

SKIP pata_test (exit status: 77)

SKIP: ahci_test
===============

SKIP ahci_test (exit status: 77)

SKIP: uhci_test
===============

SKIP uhci_test (exit status: 77)

SKIP: ohci_test
===============

SKIP ohci_test (exit status: 77)

SKIP: ehci_test
===============

SKIP ehci_test (exit status: 77)

SKIP: fddboot_test
==================

SKIP fddboot_test (exit status: 77)

SKIP: netboot_test
==================

SKIP netboot_test (exit status: 77)

SKIP: pseries_test
==================

SKIP pseries_test (exit status: 77)

FAIL: grub_func_test
====================

WARNING: Image format was not specified for '/tmp/grub-shell.HeTAD8Ty3U/grub.iso' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
Functional test failure: shift_test:
...
gfxterm_menu_640x480xi16:3 failed: 0xce34981e vs 0xd9f04953
 tests/video_checksum.c:checksum:615: assert failed: 0 Checksum
gfxterm_menu_640x480xi16:2 failed: 0xa8fb749d vs 0xbf3fa5d0
 tests/video_checksum.c:checksum:615: assert failed: 0 Checksum
gfxterm_menu_640x480xi16:1 failed: 0xce34981e vs 0xd9f04953
gfxterm_menu: FAIL
...
videotest_checksum:
videotest_checksum: PASS
exfctest:
exfctest: PASS
TEST FAILURE
FAIL grub_func_test (exit status: 1)

We got 2 errors:

* f2fs_test
The kernel uses 16k pages, causing failures when loading the f2fs kernel module,
see https://github.com/torvalds/linux/blob/master/fs/f2fs/super.c#L4670
This error can be ignored.

* zfs_test
zfs does not support the LoongArch architecture and is not compatible with the
6.3 kernel.
This error can be ignored.

We got 2 failures:

* hfs_test
I use recode 3.7.14-1 on Archlinux, running `recode -l` gives no output `MacRoman`,
so we get this error.
On Linux systems that support LoongArch, there is currently no need to use HFS,
so this failure can be ignored.

* grub_func_test
I don't know the reason for this failure. I guess it may be related to qemu's edk2.
In the previous review, I was told that the failure here is the expected behavior.
So, we can ignore this failure.

Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests: Fix timezone inconsistency in squashfs_test
Xiaotian Wu [Thu, 27 Apr 2023 07:46:21 +0000 (15:46 +0800)] 
tests: Fix timezone inconsistency in squashfs_test

The image timestamp was not returned in UTC, but the following logic
expected and used UTC.

This patch fixes the test failure like described below:

  unsquashfs -s /tmp/grub-fs-tester.20230407111703613257436.squash4_gzip.9R4/squash4_gzip_512_4096_1_0.img
  grep '^Creation'
  awk '{print $6 " " $7 " " $8 " " $9 " " $10; }'
  FSTIME='Fri Apr 7 11:17:05 2023'
  date -d 'Fri Apr 7 11:17:05 2023' -u '+%Y-%m-%d %H:%M:%S'
  FSTIME='2023-04-07 11:17:05'
  date -d '2023-04-07 11:17:05 UTC -1 second' -u '+%Y-%m-%d %H:%M:%S'
  FSTIMEM1='2023-04-07 11:17:04'
  date -d '2023-04-07 11:17:05 UTC -2 second' -u '+%Y-%m-%d %H:%M:%S'
  FSTIMEM2='2023-04-07 11:17:03'
  date -d '2023-04-07 11:17:05 UTC -3 second' -u '+%Y-%m-%d %H:%M:%S'
  FSTIMEM3='2023-04-07 11:17:02'
  grep -F 'Last modification time 2023-04-07 11:17:05'
  echo 'Device loop0: Filesystem type squash4 - Last modification time 2023-04-07 03:17:05 Friday - Sector size 512B - Total size 10680KiB'
  echo 'Device loop0: Filesystem type squash4 - Last modification time 2023-04-07 03:17:05 Friday - Sector size 512B - Total size 10680KiB'
  grep -F 'Last modification time 2023-04-07 11:17:04'
  echo 'Device loop0: Filesystem type squash4 - Last modification time 2023-04-07 03:17:05 Friday - Sector size 512B - Total size 10680KiB'
  grep -F 'Last modification time 2023-04-07 11:17:03'
  echo 'Device loop0: Filesystem type squash4 - Last modification time 2023-04-07 03:17:05 Friday - Sector size 512B - Total size 10680KiB'
  grep -F 'Last modification time 2023-04-07 11:17:02'
  echo FSTIME FAIL

Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Reviewed-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoloongarch: Add to build system
Xiaotian Wu [Thu, 27 Apr 2023 07:46:20 +0000 (15:46 +0800)] 
loongarch: Add to build system

This patch adds LoongArch to the GRUB build system and various tools,
so GRUB can be built on LoongArch as a UEFI application.

Signed-off-by: Zhou Yang <zhouyang@loongson.cn>
Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoloongarch: Add auxiliary files
Xiaotian Wu [Thu, 27 Apr 2023 07:46:19 +0000 (15:46 +0800)] 
loongarch: Add auxiliary files

Add support for manipulating architectural cache and timers, and EFI
memory maps.

Signed-off-by: Zhou Yang <zhouyang@loongson.cn>
Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoloongarch: Add support for ELF psABI v2.00 relocations
Xiaotian Wu [Thu, 27 Apr 2023 07:43:05 +0000 (15:43 +0800)] 
loongarch: Add support for ELF psABI v2.00 relocations

A new set of relocation types was added in the LoongArch ELF psABI v2.00
spec [1], [2] to replace the stack-based scheme in v1.00. Toolchain
support is available from binutils 2.40 and gcc 13 onwards.

This patch adds support for the new relocation types, that are simpler
to handle (in particular, stack operations are gone). Support for the
v1.00 relocs are kept for now, for compatibility with older toolchains.

[1] https://github.com/loongson/LoongArch-Documentation/pull/57
[2] https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_appendix_revision_history

Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoloongarch: Add support for ELF psABI v1.00 relocations
Xiaotian Wu [Thu, 27 Apr 2023 07:43:04 +0000 (15:43 +0800)] 
loongarch: Add support for ELF psABI v1.00 relocations

This patch adds support of the stack-based LoongArch relocations
throughout GRUB, including tools, dynamic linkage, and support for
conversion of ELF relocations into PE ones. A stack machine is required
to handle these per the spec [1] (see the R_LARCH_SOP types), of which
a simple implementation is included.

These relocations are produced by binutils 2.38 and 2.39, while the newer
v2.00 relocs require more recent toolchain (binutils 2.40+ & gcc 13+, or
LLVM 16+). GCC 13 has not been officially released as of early 2023, so
support for v1.00 relocs are expected to stay relevant for a while.

[1] https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_relocations

Signed-off-by: Zhou Yang <zhouyang@loongson.cn>
Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoloongarch: Add early startup code
Xiaotian Wu [Thu, 27 Apr 2023 07:43:03 +0000 (15:43 +0800)] 
loongarch: Add early startup code

On entry, we need to save the system table pointer as well as our image
handle. Add an early startup file that saves them and then brings us
into our main function.

Signed-off-by: Zhou Yang <zhouyang@loongson.cn>
Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoloongarch: Add setjmp implementation
Xiaotian Wu [Thu, 27 Apr 2023 07:43:02 +0000 (15:43 +0800)] 
loongarch: Add setjmp implementation

This patch adds a setjmp implementation for LoongArch.

Signed-off-by: Zhou Yang <zhouyang@loongson.cn>
Signed-off-by: Sun Haiyong <sunhaiyong@loongson.cn>
Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoelf: Add LoongArch definitions
Xiaotian Wu [Thu, 27 Apr 2023 07:43:01 +0000 (15:43 +0800)] 
elf: Add LoongArch definitions

Add ELF e_machine ID [1] and relocations types [2] for LoongArch to
the current in-repo definitions.

[1] https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_e_machine_identifies_the_machine
[2] https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html#_relocations

Signed-off-by: Zhou Yang <zhouyang@loongson.cn>
Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agope: Add LoongArch definitions
Xiaotian Wu [Thu, 27 Apr 2023 07:43:00 +0000 (15:43 +0800)] 
pe: Add LoongArch definitions

Add PE machine types [1] and relocation types [2] for LoongArch to
the current in-repo definitions.

[1] https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#machine-types
[2] https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#base-relocation-types

Signed-off-by: Zhou Yang <zhouyang@loongson.cn>
Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agofont: Try opening fonts from the bundled memdisk
Chris Coulson [Wed, 26 Apr 2023 10:06:52 +0000 (12:06 +0200)] 
font: Try opening fonts from the bundled memdisk

GRUB since 93a786a00 (kern/efi/sb: Enforce verification of font files)
has enforced verification of font files in secure boot mode. In order to
continue to be able to load some default fonts, vendors may bundle them
with their signed EFI image by adding them to the built-in memdisk.

This change makes the font loader try loading fonts from the memdisk
before the prefix path when attempting to load a font file by specifying
its filename, which avoids having to make changes to GRUB configurations
in order to accommodate memdisk bundled fonts. It expects the directory
structure to be the same as fonts stored in the prefix path,
i.e. /fonts/<name>.pf2.

Signed-off-by: Chris Coulson <chris.coulson@canonical.com>
Reviewed-by: Steve McIntyre <93sam@debian.org>
Tested-by: Steve McIntyre <93sam@debian.org>
Reviewed-by: Robbie Harwood <rharwood@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agonet: Read bracketed IPv6 addrs and port numbers
Robbie Harwood [Tue, 25 Apr 2023 15:05:13 +0000 (11:05 -0400)] 
net: Read bracketed IPv6 addrs and port numbers

Allow specifying port numbers for http and tftp paths and allow IPv6
addresses to be recognized with brackets around them, which is required
to specify a port number.

Co-authored-by: Aaron Miller <aaronmiller@fb.com>
Signed-off-by: Aaron Miller <aaronmiller@fb.com>
Co-authored-by: Peter Jones <pjones@redhat.com>
Signed-off-by: Peter Jones <pjones@redhat.com>
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoRevert "net/http: Allow use of non-standard TCP/IP ports"
Robbie Harwood [Tue, 25 Apr 2023 15:05:12 +0000 (11:05 -0400)] 
Revert "net/http: Allow use of non-standard TCP/IP ports"

The notation introduced in ac8a37dda (net/http: Allow use of non-standard
TCP/IP ports) contradicts that used in downstream distributions including
Fedora, RHEL, Debian, Ubuntu, and others. Revert it and apply the downstream
notation which was originally proposed to the GRUB in 2016.

This reverts commit ac8a37dda (net/http: Allow use of non-standard TCP/IP ports).

Signed-off-by: Robbie Harwood <rharwood@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoterm/at_keyboard: Add timeout to fix hang on HP EliteBooks
Riku Viitanen [Sun, 23 Apr 2023 09:59:34 +0000 (09:59 +0000)] 
term/at_keyboard: Add timeout to fix hang on HP EliteBooks

This fixes the GRUB on Coreboot on HP EliteBooks by implementing
a 200 ms timeout. The GRUB used to hang.

Fixes: https://ticket.coreboot.org/issues/141
Signed-off-by: Riku Viitanen <riku.viitanen@protonmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests/util/grub-fs-tester: Add missing redirect to /dev/null
Glenn Washburn [Mon, 10 Apr 2023 03:15:57 +0000 (03:15 +0000)] 
tests/util/grub-fs-tester: Add missing redirect to /dev/null

In filesystem timestamp test, a check is done to verify that the timestamp
for a file as reported in Linux by the filesystem is within a few seconds
of the timestamp as reported by GRUB. This is done by grepping the output
of GRUB's ls command for the timestamp as reported by the filesystem in
Linux and for each of 3 seconds past that timestamp. All of these checks
except one redirect the output of grep to /dev/null. Fix this exception
to behave as the other checks.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agodisk: Replace transform_sector() function with grub_disk_to_native_sector()
Mukesh Kumar Chaurasiya [Mon, 3 Apr 2023 10:09:18 +0000 (15:39 +0530)] 
disk: Replace transform_sector() function with grub_disk_to_native_sector()

The transform_sector() function is not very clear in what it's doing
and confusing. The GRUB already has a function which is doing the same
thing in a very self explanatory way, i.e., grub_disk_to_native_sector().
So, it's much better to use self explanatory one than transform_sector().

Signed-off-by: Mukesh Kumar Chaurasiya <mchauras@linux.vnet.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests: Add test for iso9660 delayed CE hop
Thomas Schmitt [Tue, 7 Mar 2023 16:56:51 +0000 (17:56 +0100)] 
tests: Add test for iso9660 delayed CE hop

The ISO filesystem image iso9660_early_ce.iso exposes the unusual
situation that the Rock Ridge name entry of its only file is located
after a CE entry which points to the next continuation area.

The correct behavior is to read the Rock Ridge name and to only then
load the next continuation area. If GRUB performs this correctly, then
the name "RockRidgeName:x" will be read and reported by grub-fstest.
If GRUB wrongly performs the CE hop immediately when encountering the CE
entry, then the dull ISO 9660 name "rockridg" will not be overridden and
be put out by grub-fstest.

Signed-off-by: Thomas Schmitt <scdbackup@gmx.net>
Tested-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agofs/iso9660: Delay CE hop until end of current SUSP area
Thomas Schmitt [Tue, 7 Mar 2023 16:56:50 +0000 (17:56 +0100)] 
fs/iso9660: Delay CE hop until end of current SUSP area

The SUSP specs demand that the reading of the next SUSP area which is
depicted by a CE entry shall be delayed until reading of the current
SUSP area is completed. Up to now GRUB immediately ends reading of the
current area and loads the new one. So, buffer the parameters of a found
CE entry and perform checks and reading of new data only after the
reader loop has ended.

Signed-off-by: Thomas Schmitt <scdbackup@gmx.net>
Tested-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agokern/ieee1275/init: Extended support in Vec5
Avnish Chouhan [Mon, 27 Mar 2023 06:55:40 +0000 (12:25 +0530)] 
kern/ieee1275/init: Extended support in Vec5

This patch enables multiple options in Vec5 which are required and
solves the boot issues seen on some machines which are looking for
these specific options.

1. LPAR: Client program supports logical partitioning and
   associated hcall()s.
2. SPLPAR: Client program supports the Shared
   Processor LPAR Option.
3. DYN_RCON_MEM: Client program supports the
   “ibm,dynamic-reconfiguration-memory” property and it may be
   presented in the device tree.
4. LARGE_PAGES: Client supports pages larger than 4 KB.
5. DONATE_DCPU_CLS: Client supports donating dedicated processor cycles.
6. PCI_EXP: Client supports PCI Express implementations
   utilizing Message Signaled Interrupts (MSIs).

7. CMOC: Enables the Cooperative Memory Over-commitment Option.
8. EXT_CMO: Enables the Extended Cooperative Memory Over-commit Option.

9. ASSOC_REF: Enables “ibm,associativity” and
   “ibm,associativity-reference-points” properties.
10. AFFINITY: Enables Platform Resource Reassignment Notification.
11. NUMA: Supports NUMA Distance Lookup Table Option.

12. HOTPLUG_INTRPT: Supports Hotplug Interrupts.
13. HPT_RESIZE: Enable Hash Page Table Resize Option.

14. MAX_CPU: Defines maximum number of CPUs supported.

15. PFO_HWRNG: Supports Random Number Generator.
16. PFO_HW_COMP: Supports Compression Engine.
17. PFO_ENCRYPT: Supports Encryption Engine.

18. SUB_PROCESSORS: Supports Sub-Processors.

19. DY_MEM_V2: Client program supports the “ibm,dynamic-memory-v2” property in the
    “ibm,dynamic-reconfiguration-memory” node and it may be presented in the device tree.
20. DRC_INFO: Client program supports the “ibm,drc-info” property definition and it may be
    presented in the device tree.

Signed-off-by: Avnish Chouhan <avnish@linux.vnet.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agokern/ieee1275/init: Convert plain numbers to constants in Vec5
Avnish Chouhan [Mon, 27 Mar 2023 06:55:39 +0000 (12:25 +0530)] 
kern/ieee1275/init: Convert plain numbers to constants in Vec5

This patch converts the plain numbers used in Vec5 properties to constants.

1. LPAR: Client program supports logical partitioning and
   associated hcall()s.
2. SPLPAR: Client program supports the Shared
   Processor LPAR Option.
3. CMO: Enables the Cooperative Memory Over-commitment Option.
4. MAX_CPU: Defines maximum number of CPUs supported.

Signed-off-by: Avnish Chouhan <avnish@linux.vnet.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoloader/emu/linux: Work around systemctl kexec returning
Robbie Harwood [Thu, 23 Mar 2023 15:59:51 +0000 (11:59 -0400)] 
loader/emu/linux: Work around systemctl kexec returning

Per systemctl(1), it "is asynchronous; it will return after the reboot
operation is enqueued, without waiting for it to complete". This differs
from kexec(8), which calls reboot(2) and therefore does not return.

When not using fallback, this confusingly results in:

  error trying to perform 'systemctl kexec': 0
  Aborted. Press any key to exit.

on screen for a bit, followed by successful kexec.

To reduce the likelihood of hitting this case, add a delay on successful
return. Ultimately, the systemd interface is racy: we can't avoid it
entirely unless we never fallback on success.

Signed-off-by: Robbie Harwood <rharwood@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotpm: Disable the tpm verifier if the TPM device is not present
Michael Chang [Wed, 22 Mar 2023 04:25:43 +0000 (12:25 +0800)] 
tpm: Disable the tpm verifier if the TPM device is not present

When the tpm module is loaded, the verifier reads entire file into
memory, measures it and uses verified content as a backing buffer for
file accesses. However, this process may result in high memory
utilization for file operations, sometimes causing a system to run out
of memory which may finally lead to boot failure. To address this issue,
among others, the commit 887f98f0d (mm: Allow dynamically requesting
additional memory regions) have optimized memory management by
dynamically allocating heap space to maximize memory usage and reduce
threat of memory exhaustion. But in some cases problems may still arise,
e.g., when large ISO images are mounted using loopback or when dealing
with embedded systems with limited memory resources.

Unfortunately current implementation of the tpm module doesn't allow
elimination of the back buffer once it is loaded. Even if the TPM device
is not present or it has been explicitly disabled. This may unnecessary
allocate a lot memory. To solve this issue, a patch has been developed
to detect the TPM status at module load and skip verifier registration
if the device is missing or deactivated. This prevents allocation of
memory for the back buffer, avoiding wasting memory when no real measure
boot functionality is performed. Disabling the TPM device in the system
can reduce memory usage in the GRUB. It is useful in scenarios where
high memory utilization is a concern and measurements of loaded
artifacts are not necessary.

Signed-off-by: Michael Chang <mchang@suse.com>
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoINSTALL: Document programs and packages needed for using gdb_grub script
Glenn Washburn [Wed, 15 Mar 2023 04:03:11 +0000 (04:03 +0000)] 
INSTALL: Document programs and packages needed for using gdb_grub script

Now that the gdb_grub script uses the Python API in GDB, a GDB with Python
support must be used. Note that this means a GDB with version greater than
7.0 must be used. This should not be an issue since that was released over
a decade ago. Also, the minimum version of Python must be 3.5, which was
released around 8 years ago.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoRISC-V: Use common linux loader
Atish Patra [Thu, 9 Mar 2023 23:59:53 +0000 (15:59 -0800)] 
RISC-V: Use common linux loader

RISC-V doesn't have to do anything very different from other architectures
to loader EFI stub linux kernel. As a result, just use the common linux
loader instead of defining a RISC-V specific linux loader.

Signed-off-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoefi: Remove arch specific image headers for RISC-V, ARM64 and ARM
Atish Patra [Thu, 9 Mar 2023 23:59:52 +0000 (15:59 -0800)] 
efi: Remove arch specific image headers for RISC-V, ARM64 and ARM

The arch specific image header details are not very useful as most of
the GRUB just looks at the PE/COFF spec parameters (PE32 magic and
header offset).

Remove the arch specific images headers and define a generic arch
headers that provide enough PE/COFF fields for the GRUB to parse
kernel images correctly.

Signed-off-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoloader/efi: Move ARM64 linux loader to common code
Atish Patra [Thu, 9 Mar 2023 23:59:51 +0000 (15:59 -0800)] 
loader/efi: Move ARM64 linux loader to common code

ARM64 linux loader code is written in such a way that it can be reused
across different architectures without much change. Move it to common
code so that RISC-V doesn't have to define a separate loader.

Signed-off-by: Atish Patra <atishp@rivosinc.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoutil/grub-module-verifierXX: Add module_size parameter to functions for sanity checking
Alec Brown [Thu, 9 Mar 2023 19:43:59 +0000 (14:43 -0500)] 
util/grub-module-verifierXX: Add module_size parameter to functions for sanity checking

In grub-module-verifierXX.c, the function grub_module_verifyXX() performs an
initial check that the ELF section headers are within the module's size, but
doesn't check if the sections being accessed have contents that are within the
module's size. In particular, we need to check that sh_offset and sh_size are
less than the module's size. However, for some section header types we don't
need to make these checks. For the type SHT_NULL, the section header is marked
as inactive and the rest of the members within the section header have undefined
values, so we don't need to check for sh_offset or sh_size. In the case of the
type SHT_NOBITS, sh_offset has a conceptual offset which may be beyond the
module size. Also, this type's sh_size may have a non-zero size, but a section
of this type will take up no space in the module. This can all be checked in the
function get_shdr(), but in order to do so, the parameter module_size must be
added to functions so that the value of the module size can be used in
get_shdr() from grub_module_verifyXX().

Also, had to rework some for loops to ensure the index passed to get_shdr() is
within bounds.

Signed-off-by: Alec Brown <alec.r.brown@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: Add extra early initialization symbols for i386-pc
Glenn Washburn [Mon, 27 Feb 2023 21:15:38 +0000 (15:15 -0600)] 
gdb: Add extra early initialization symbols for i386-pc

Add symbols for boot.image, disk.image, and lzma_decompress.image if the
target is i386-pc. This is only done for i386-pc because that is the only
target that uses the images. By loading the symbols for these images,
these images can be more easily debugged by allowing the setting of break-
points in that code and to see easily get the value of data symbols.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: Modify gdb prompt when running gdb_grub script
Glenn Washburn [Mon, 27 Feb 2023 21:15:37 +0000 (15:15 -0600)] 
gdb: Modify gdb prompt when running gdb_grub script

This will let users know that the GDB session is using the GRUB gdb scripts.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: Allow running user-defined commands at GRUB start
Glenn Washburn [Mon, 27 Feb 2023 21:15:36 +0000 (15:15 -0600)] 
gdb: Allow running user-defined commands at GRUB start

A new command, run_on_start, for things to do before GRUB starts executing.
Currently, this is setting up the loading of module symbols as they are
loaded and allowing user-defined script to be run if a command named
"onstart" exists.

On some platforms, notably x86, software breakpoints set in GDB before
the GRUB image is loaded will be cleared when the image is loaded. This
is because the breakpoints work by overwriting the memory of the break-
point location with a special instruction which when hit will cause the
debugger to stop execution. Just before execution is resumed by the
debugger, the original instruction bytes are put back. When a breakpoint
is set before the GRUB image is loaded, the special debugger instruction
will be written to memory and when the GRUB image is loaded by the
firmware, which has no knowledge of the debugger, the debugger instruction
is overwritten. To the GDB user, GDB will show the breakpoint as set, but
it will never be hit. Furthermore, GDB now becomes confused, such that
even deleting and re-setting the breakpoint after the GRUB image is loaded
will not allow for a working breakpoint.

To work around this, in run_on_start, first a watchpoint is set on _start,
which will be triggered when the firmware starts loading the GRUB image.
When the _start watchpoint is hit, the current breakpoints are saved to a
file and then deleted by GDB before they can be overwritten by the firmware
and confuse GDB. Then a temporary software breakpoint is set on _start,
which will get triggered when the firmware hands off to GRUB to execute. In
that breakpoint load the previously saved and deleted breakpoints now that
there is no worry of them getting overwritten by the firmware. This is
needed for runtime_load_module to work when it is run before the GRUB image
is loaded.

Note that watchpoints are generally types of hardware breakpoints on x86, so
its deleted as soon as it gets triggered so that a minimal set of hardware
breakpoints are used, allowing more for the user.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: Add functions to make loading from dynamically positioned targets easier
Glenn Washburn [Mon, 27 Feb 2023 21:15:35 +0000 (15:15 -0600)] 
gdb: Add functions to make loading from dynamically positioned targets easier

Many targets, such as EFI, load GRUB at addresses that are determined at
runtime. So the load addresses in kernel.exec will almost certainly be
wrong. Given the address of the start of the text segment, these
functions will tell GDB to load the symbols at the proper locations. It
is left up to the user to determine how to get the text address of the
loaded GRUB image.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: Replace module symbol loading implementation with Python one
Glenn Washburn [Mon, 27 Feb 2023 21:15:34 +0000 (15:15 -0600)] 
gdb: Replace module symbol loading implementation with Python one

Remove gmodule.pl and rewrite as a python in gdb_helper.py. This removes
Perl dependency for the GRUB GDB script, but adds Python as a dependency.
This is more desirable because Python is tightly integrated with GDB and
can do things not even available to GDB native scripting language. GDB must
be built with Python, however this is not a major limitation because every
major distro non-end-of-life versions build GDB with Python support. And GDB
has had support for Python since around 7.1-ish, which is about a decade.

This re-implementation has an added feature. If there is a user defined
command named "onload_<module name>", then that command will be executed
after the symbols for the specified module are loaded. When debugging a
module it can be desirable to set break points on code in the module.
This is difficult in GRUB because, at GDB start, the module is not loaded
and on EFI platforms its not known ahead of time where the module will
be loaded. So allow users to create an "onload_<modname>" command which
will be run when the module with name "modname" is loaded.

Another addition is a new convenience function is defined
$is_user_command(), which returns true if its string argument is
the name of a user-defined command.

A secondary benefit of these changes is that the script does not write
temporary files and has better error handling capabilities.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: Only connect to remote target once when first sourced
Glenn Washburn [Mon, 27 Feb 2023 21:15:33 +0000 (15:15 -0600)] 
gdb: Only connect to remote target once when first sourced

The gdb_grub script was originally meant to be run once when GDB first
starts up via the -x argument. So it runs commands unconditionally
assuming that the script has not been run before. Its nice to be able
to source the script again when developing the script to modify/add
commands. So only run the commands not defined in user-defined commands,
if a variable $runonce has already been set and when those commands have
been run to set $runonce.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: Conditionally run GDB script logic for dynamically or statically positioned...
Glenn Washburn [Mon, 27 Feb 2023 21:15:32 +0000 (15:15 -0600)] 
gdb: Conditionally run GDB script logic for dynamically or statically positioned GRUB

There are broadly two classes of targets to consider when loading symbols
for GRUB, targets that determine where to load GRUB at runtime
(dynamically positioned) and those that do not (statically positioned).
For statically positioned targets, symbol loading is determined at link
time, so nothing more needs to be known to load the symbols. For
dynamically positioned targets, such as EFI targets, at runtime symbols
should be offset by an amount that depends on where the runtime chose to
load GRUB.

It is important to not load symbols statically for dynamic targets
because then when subsequently loading the symbols correctly one must
take care to remove the existing static symbols, otherwise there will be
two sets of symbols and GDB seems to prefer the ones loaded first (i.e.
the static ones).

Use autoconf variables to generate a gdb_grub for a particular target,
which conditionally run startup code depending on if the target uses
static or dynamic loading.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: Move runtime module loading into runtime_load_module
Glenn Washburn [Mon, 27 Feb 2023 21:15:31 +0000 (15:15 -0600)] 
gdb: Move runtime module loading into runtime_load_module

By moving this code into a function, it can be run re-utilized while gdb is
running, not just when loading the script. This will also be useful in
some following changes which will make a separate script path for targets
which statically vs dynamically position GRUB code.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoosdep/devmapper/getroot: Fix build error on 32-bit host
Michael Chang [Wed, 1 Mar 2023 09:23:08 +0000 (17:23 +0800)] 
osdep/devmapper/getroot: Fix build error on 32-bit host

The gcc build has failed for 32-bit host (e.g. i386-emu and arm-emu)
due to mismatch between format specifier and data type.

../grub-core/osdep/devmapper/getroot.c: In function
'grub_util_pull_devmapper':

../grub-core/osdep/devmapper/getroot.c:265:75: error: format '%lu'
expects argument of type 'long unsigned int', but argument 2 has type
'int' [-Werror=format=]

../grub-core/osdep/devmapper/getroot.c:276:80: error: format '%lu'
expects argument of type 'long unsigned int', but argument 2 has type
'int' [-Werror=format=]

This patch fixes the problem by casting the type of calculated offset to
grub_size_t and use platform PRIuGRUB_SIZE as format specifier.

Signed-off-by: Michael Chang <mchang@suse.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agocommands/ieee1275/ibmvtpm: Add support for trusted boot using a vTPM 2.0
Stefan Berger [Mon, 6 Feb 2023 15:03:25 +0000 (10:03 -0500)] 
commands/ieee1275/ibmvtpm: Add support for trusted boot using a vTPM 2.0

Add support for trusted boot using a vTPM 2.0 on the IBM IEEE1275
PowerPC platform. With this patch grub now measures text and binary data
into the TPM's PCRs 8 and 9 in the same way as the x86_64 platform
does.

This patch requires Daniel Axtens's patches for claiming more memory.

Note: The tpm_init() function cannot be called from GRUB_MOD_INIT() since
it does not find the device nodes upon module initialization and
therefore the call to tpm_init() must be deferred to grub_tpm_measure().

For vTPM support to work on PowerVM, system driver levels 1010.30
or 1020.00 are required.

Note: Previous versions of firmware levels with the 2hash-ext-log
API call have a bug that, once this API call is invoked, has the
effect of disabling the vTPM driver under Linux causing an error
message to be displayed in the Linux kernel log. Those users will
have to update their machines to the firmware levels mentioned
above.

Cc: Eric Snowberg <eric.snowberg@oracle.com>
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Signed-off-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
Tested-by: Nageswara R Sastry <rnsastry@linux.ibm.com>
Reviewed-by: Robbie Harwood <rharwood@redhat.com>
2 years agocommands/memtools: Add memtool module with memory allocation stress-test
Daniel Axtens [Mon, 6 Feb 2023 15:03:24 +0000 (10:03 -0500)] 
commands/memtools: Add memtool module with memory allocation stress-test

When working on memory, it's nice to be able to test your work.

Add a memtest module. When compiled with --enable-mm-debug, it exposes
3 commands:

 * lsmem - print all allocations and free space in all regions
 * lsfreemem - print free space in all regions

 * stress_big_allocs - stress test large allocations:
  - how much memory can we allocate in one chunk?
  - how many 1MB chunks can we allocate?
  - check that gap-filling works with a 1MB aligned 900kB alloc + a
     100kB alloc.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
Tested-by: Nageswara R Sastry <rnsastry@linux.ibm.com>
Reviewed-by: Robbie Harwood <rharwood@redhat.com>
2 years agoieee1275: Implement vec5 for cas negotiation
Diego Domingos [Mon, 6 Feb 2023 15:03:23 +0000 (10:03 -0500)] 
ieee1275: Implement vec5 for cas negotiation

As a legacy support, if the vector 5 is not implemented, Power Hypervisor will
consider the max CPUs as 64 instead 256 currently supported during
client-architecture-support negotiation.

This patch implements the vector 5 and set the MAX CPUs to 256 while setting the
others values to 0 (default).

Signed-off-by: Diego Domingos <diegodo@linux.vnet.ibm.com>
Acked-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Signed-off-by: Avnish Chouhan <avnish@linux.vnet.ibm.com>
Tested-by: Nageswara R Sastry <rnsastry@linux.ibm.com>
Reviewed-by: Robbie Harwood <rharwood@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoieee1275: Support runtime memory claiming
Daniel Axtens [Mon, 6 Feb 2023 15:03:22 +0000 (10:03 -0500)] 
ieee1275: Support runtime memory claiming

On powerpc-ieee1275, we are running out of memory trying to verify
anything. This is because:

 - we have to load an entire file into memory to verify it. This is
   difficult to change with appended signatures.
 - We only have 32MB of heap.
 - Distro kernels are now often around 30MB.

So we want to be able to claim more memory from OpenFirmware for our heap
at runtime.

There are some complications:

 - The grub mm code isn't the only thing that will make claims on
   memory from OpenFirmware:

    * PFW/SLOF will have claimed some for their own use.

    * The ieee1275 loader will try to find other bits of memory that we
      haven't claimed to place the kernel and initrd when we go to boot.

    * Once we load Linux, it will also try to claim memory. It claims
      memory without any reference to /memory/available, it just starts
      at min(top of RMO, 768MB) and works down. So we need to avoid this
      area. See arch/powerpc/kernel/prom_init.c as of v5.11.

 - The smallest amount of memory a ppc64 KVM guest can have is 256MB.
   It doesn't work with distro kernels but can work with custom kernels.
   We should maintain support for that. (ppc32 can boot with even less,
   and we shouldn't break that either.)

 - Even if a VM has more memory, the memory OpenFirmware makes available
   as Real Memory Area can be restricted. Even with our CAS work, an LPAR
   on a PowerVM box is likely to have only 512MB available to OpenFirmware
   even if it has many gigabytes of memory allocated.

What should we do?

We don't know in advance how big the kernel and initrd are going to be,
which makes figuring out how much memory we can take a bit tricky.

To figure out how much memory we should leave unused, I looked at:

 - an Ubuntu 20.04.1 ppc64le pseries KVM guest:
    vmlinux: ~30MB
    initrd:  ~50MB

 - a RHEL8.2 ppc64le pseries KVM guest:
    vmlinux: ~30MB
    initrd:  ~30MB

So to give us a little wriggle room, I think we want to leave at least
128MB for the loader to put vmlinux and initrd in memory and leave Linux
with space to satisfy its early allocations.

Allow other space to be allocated at runtime.

Tested-by: Stefan Berger <stefanb@linux.ibm.com>
Signed-off-by: Daniel Axtens <dja@axtens.net>
Tested-by: Nageswara R Sastry <rnsastry@linux.ibm.com>
Reviewed-by: Robbie Harwood <rharwood@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoieee1275: Drop len -= 1 quirk in heap_init
Daniel Axtens [Mon, 6 Feb 2023 15:03:21 +0000 (10:03 -0500)] 
ieee1275: Drop len -= 1 quirk in heap_init

This was apparently "required by some firmware": commit dc9468500919
(2007-02-12  Hollis Blanchard  <hollis@penguinppc.org>).

It's not clear what firmware that was, and what platform from 14 years ago
which exhibited the bug then is still both in use and buggy now.

It doesn't cause issues on qemu (mac99 or pseries) or under PFW for Power8.

I don't have access to old Mac hardware, but if anyone feels especially
strongly we can put it under some feature flag. I really want to disable
it under pseries because it will mess with region merging.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
Tested-by: Nageswara R Sastry <rnsastry@linux.ibm.com>
Reviewed-by: Robbie Harwood <rharwood@redhat.com>
2 years agoieee1275: Request memory with ibm, client-architecture-support
Daniel Axtens [Mon, 6 Feb 2023 15:03:20 +0000 (10:03 -0500)] 
ieee1275: Request memory with ibm, client-architecture-support

On PowerVM, the first time we boot a Linux partition, we may only get
256MB of real memory area, even if the partition has more memory.

This isn't enough to reliably verify a kernel. Fortunately, the Power
Architecture Platform Reference (PAPR) defines a method we can call to ask
for more memory: the broad and powerful ibm,client-architecture-support
(CAS) method.

CAS can do an enormous amount of things on a PAPR platform: as well as
asking for memory, you can set the supported processor level, the interrupt
controller, hash vs radix mmu, and so on.

If:

 - we are running under what we think is PowerVM (compatible property of /
   begins with "IBM"), and

 - the full amount of RMA is less than 512MB (as determined by the reg
   property of /memory)

then call CAS as follows: (refer to the Linux on Power Architecture
Reference, LoPAR, which is public, at B.5.2.3):

 - Use the "any" PVR value and supply 2 option vectors.

 - Set option vector 1 (PowerPC Server Processor Architecture Level)
   to "ignore".

 - Set option vector 2 with default or Linux-like options, including a
   min-rma-size of 512MB.

 - Set option vector 3 to request Floating Point, VMX and Decimal Floating
   point, but don't abort the boot if we can't get them.

 - Set option vector 4 to request a minimum VP percentage to 1%, which is
   what Linux requests, and is below the default of 10%. Without this,
   some systems with very large or very small configurations fail to boot.

This will cause a CAS reboot and the partition will restart with 512MB
of RMA. Importantly, grub will notice the 512MB and not call CAS again.

Notes about the choices of parameters:

 - A partition can be configured with only 256MB of memory, which would
   mean this request couldn't be satisfied, but PFW refuses to load with
   only 256MB of memory, so it's a bit moot. SLOF will run fine with 256MB,
   but we will never call CAS under qemu/SLOF because /compatible won't
   begin with "IBM".)

 - unspecified CAS vectors take on default values. Some of these values
   might restrict the ability of certain hardware configurations to boot.
   This is why we need to specify the VP percentage in vector 4, which is
   in turn why we need to specify vector 3.

Finally, we should have enough memory to verify a kernel, and we will
reach Linux. One of the first things Linux does while still running under
OpenFirmware is to call CAS with a much fuller set of options (including
asking for 512MB of memory). Linux includes a much more restrictive set of
PVR values and processor support levels, and this CAS invocation will likely
induce another reboot. On this reboot grub will again notice the higher RMA,
and not call CAS. We will get to Linux again, Linux will call CAS again, but
because the values are now set for Linux this will not induce another CAS
reboot and we will finally boot all the way to userspace.

On all subsequent boots, everything will be configured with 512MB of RMA,
so there will be no further CAS reboots from grub. (phyp is super sticky
with the RMA size - it persists even on cold boots. So if you've ever booted
Linux in a partition, you'll probably never have grub call CAS. It'll only
ever fire the first time a partition loads grub, or if you deliberately lower
the amount of memory your partition has below 512MB.)

Signed-off-by: Daniel Axtens <dja@axtens.net>
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
Tested-by: Nageswara R Sastry <rnsastry@linux.ibm.com>
Reviewed-by: Robbie Harwood <rharwood@redhat.com>
2 years agoRISC-V: Handle R_RISCV_CALL_PLT reloc
Khem Raj [Thu, 23 Feb 2023 21:15:08 +0000 (13:15 -0800)] 
RISC-V: Handle R_RISCV_CALL_PLT reloc

GNU assembler starting 2.40 release always generates R_RISCV_CALL_PLT
reloc for call in assembler [1], similarly LLVM does not make
distinction between R_RISCV_CALL_PLT and R_RISCV_CALL [2].

Fixes "grub-mkimage: error: relocation 0x13 is not implemented yet.".

[1] https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=70f35d72ef04cd23771875c1661c9975044a749c
[2] https://reviews.llvm.org/D132530

Signed-off-by: Khem Raj <raj.khem@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoosdep/hurd/getroot: Remove unused variables in grub_util_find_hurd_root_device()
John Paul Adrian Glaubitz [Wed, 22 Feb 2023 08:43:02 +0000 (09:43 +0100)] 
osdep/hurd/getroot: Remove unused variables in grub_util_find_hurd_root_device()

Found during a test build on Debian/hurd-i386 with --disable-werror enabled:

  In file included from grub-core/osdep/getroot.c:12:
  grub-core/osdep/hurd/getroot.c: In function ‘grub_util_find_hurd_root_device’:
  grub-core/osdep/hurd/getroot.c:126:13: error: unused variable ‘next’ [-Werror=unused-variable]
    126 |       char *next;
        |             ^~~~
  grub-core/osdep/hurd/getroot.c:125:14: error: unused variable ‘size’ [-Werror=unused-variable]
    125 |       size_t size;
        |              ^~~~

Fixes: e981b0a24 (osdep/hurd/getroot: Use "part:" qualifier)
Signed-off-by: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: If no modules have been loaded, do not try to load module symbols
Glenn Washburn [Tue, 21 Feb 2023 18:28:48 +0000 (12:28 -0600)] 
gdb: If no modules have been loaded, do not try to load module symbols

This prevents load_all_modules from failing when called before any
modules have been loaded. Failures in GDB user-defined functions cause
any function which called them to also fail.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: Prevent wrapping when writing to .segments.tmp
Glenn Washburn [Tue, 21 Feb 2023 18:28:47 +0000 (12:28 -0600)] 
gdb: Prevent wrapping when writing to .segments.tmp

GDB logging is redirected to write .segments.tmp, which means that GDB
will wrap lines longer than what it thinks is the screen width
(typically 80 characters). When wrapping does occur it causes gmodule.pl
to misbehave. So disable line wrapping by using GDB's "with" command so
that its guaranteed to return the width to the previous value upon
command completion.

Also disable command tracing when dumping the module sections because that
output will go to .segments.tmp and thus cause gmodule.pl to misbehave.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: Fix redirection issue in dump_module_sections
Glenn Washburn [Tue, 21 Feb 2023 18:28:46 +0000 (12:28 -0600)] 
gdb: Fix redirection issue in dump_module_sections

An error in any GDB command causes it to immediately abort with an error,
this includes any command that calls that command. This leads to an issue
in dump_module_sections where an error causes the command to exit without
turning off file redirection. The user then ends up with a GDB command
line where commands output nothing to the console.

Instead do the work of dump_module_sections in the command
dump_module_sections_helper and run the command using GDB's pipe command
which does the redirection and undoes the redirection when it finishes
regardless of any errors in the command.

Also, remove .segments.tmp file prior to loading modules in case one was
left from a previous run.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoefi: Allow expression as func argument to efi_call_* macros on all platforms
Glenn Washburn [Tue, 21 Feb 2023 18:20:32 +0000 (12:20 -0600)] 
efi: Allow expression as func argument to efi_call_* macros on all platforms

On EFI platforms where EFI calls do not require a wrapper (notably i386-efi
and arm64-efi), the func argument needs to be wrapped in parenthesis to
allow valid syntax when func is an expression which evaluates to a function
pointer. On EFI platforms that do need a wrapper, this was never an issue
because func is passed to the C function wrapper as an argument and thus
does not need parenthesis to be evaluated.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoloader/i386/linux: Correct wrong initrd address for debug
Jeremy Szu [Mon, 20 Feb 2023 23:42:51 +0000 (07:42 +0800)] 
loader/i386/linux: Correct wrong initrd address for debug

The "addr" is used to request the memory with specific ranges but the real
loadable address come from the relocator. Thus, print the final retrieved
addresses, virtual and physical, for initrd.

On the occasion migrate to PRIxGRUB_ADDR and PRIxGRUB_SIZE format specifiers.

Signed-off-by: Jeremy Szu <jeremy.szu@canonical.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoINSTALL: Document that the functional test requires the package xfonts-unifont
Glenn Washburn [Thu, 16 Feb 2023 07:15:01 +0000 (01:15 -0600)] 
INSTALL: Document that the functional test requires the package xfonts-unifont

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Thomas Schmitt <scdbackup@gmx.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests: Return hard error for functional test when unicode.pf2 does not exist
Glenn Washburn [Thu, 16 Feb 2023 07:15:00 +0000 (01:15 -0600)] 
tests: Return hard error for functional test when unicode.pf2 does not exist

The functional test requires unicode.pf2 to run successfully, so
explicitly have the test return ERROR when its not found.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Tested-by: Thomas Schmitt <scdbackup@gmx.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests: grub_cmd_cryptomount should hard error when pre-requisites are not met
Glenn Washburn [Thu, 16 Feb 2023 07:08:21 +0000 (01:08 -0600)] 
tests: grub_cmd_cryptomount should hard error when pre-requisites are not met

Tests should be SKIP'd only when they do not apply to a particular target.
Hard errors are for when the test should run but can not be setup properly.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests: Add pathological iso9660 filesystem tests
Glenn Washburn [Thu, 16 Feb 2023 07:04:37 +0000 (01:04 -0600)] 
tests: Add pathological iso9660 filesystem tests

These are not added to grub-fs-tester because they are not generated and
none of the filesystem tests are run on these ISOs. The test is to run the
command "ls /" on the ISO, and a failure is determined if the command
times out, has non-zero return value or has any output.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Tested-by: Thomas Schmitt <scdbackup@gmx.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoosdep/linux/hostdisk: Modify sector by sysfs as disk sector
Mukesh Kumar Chaurasiya [Thu, 9 Feb 2023 07:39:16 +0000 (13:09 +0530)] 
osdep/linux/hostdisk: Modify sector by sysfs as disk sector

The disk sector size provided by sysfs file system considers the sector
size of 512 irrespective of disk sector size, thus causing the read by
the GRUB to an incorrect offset from what was originally intended.

Considering the 512 sector size of sysfs data the actual sector needs to
be modified corresponding to disk sector size.

Signed-off-by: Mukesh Kumar Chaurasiya <mchauras@linux.vnet.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests/util/grub-fs-tester: Use shell variable instead of autoconf
Glenn Washburn [Sun, 5 Feb 2023 00:26:07 +0000 (18:26 -0600)] 
tests/util/grub-fs-tester: Use shell variable instead of autoconf

By using a shell variable that is set once by the expansion of an autoconf
variable, the resulting script is more readable.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests/util/grub-fs-tester: Remove unused variable
Glenn Washburn [Sun, 5 Feb 2023 00:26:06 +0000 (18:26 -0600)] 
tests/util/grub-fs-tester: Remove unused variable

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agonet/bootp: Fix unchecked return value
Alec Brown [Fri, 3 Feb 2023 22:18:14 +0000 (17:18 -0500)] 
net/bootp: Fix unchecked return value

In the function send_dhcp_packet(), added an error check for the return
value of grub_netbuff_push().

Fixes: CID 404614
Signed-off-by: Alec Brown <alec.r.brown@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agomm: Avoid complex heap growth math in hot path
Zhang Boyang [Sun, 29 Jan 2023 11:49:33 +0000 (19:49 +0800)] 
mm: Avoid complex heap growth math in hot path

We do a lot of math about heap growth in hot path of grub_memalign().
However, the result is only used if out of memory is encountered, which
is seldom.

This patch moves these calculations away from hot path. These
calculations are now only done if out of memory is encountered. This
change can also help compiler to optimize integer overflow checks away.

Signed-off-by: Zhang Boyang <zhangboyang.id@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agomm: Preallocate some space when adding new regions
Zhang Boyang [Sun, 29 Jan 2023 11:49:32 +0000 (19:49 +0800)] 
mm: Preallocate some space when adding new regions

When grub_memalign() encounters out-of-memory, it will try
grub_mm_add_region_fn() to request more memory from system firmware.
However, it doesn't preallocate memory space for future allocation
requests. In extreme cases, it requires one call to
grub_mm_add_region_fn() for each memory allocation request. This can
be very slow.

This patch introduces GRUB_MM_HEAP_GROW_EXTRA, the minimal heap growth
granularity. The new region size is now set to the bigger one of its
original value and GRUB_MM_HEAP_GROW_EXTRA. Thus, it will result in some
memory space preallocated if current allocations request is small.

The value of GRUB_MM_HEAP_GROW_EXTRA is set to 1MB. If this value is
smaller, the cost of small memory allocations will be higher. If this
value is larger, more memory will be wasted and it might cause
out-of-memory on machines with small amount of RAM.

Signed-off-by: Zhang Boyang <zhangboyang.id@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agomm: Adjust new region size to take management overhead into account
Zhang Boyang [Sun, 29 Jan 2023 11:49:31 +0000 (19:49 +0800)] 
mm: Adjust new region size to take management overhead into account

When grub_memalign() encounters out-of-memory, it will try
grub_mm_add_region_fn() to request more memory from system firmware.
However, the size passed to it doesn't take region management overhead
into account. Adding a memory area of "size" bytes may result in a heap
region of less than "size" bytes really available. Thus, the new region
may not be adequate for current allocation request, confusing
out-of-memory handling code.

This patch introduces GRUB_MM_MGMT_OVERHEAD to address the region
management overhead (e.g. metadata, padding). The value of this new
constant must be large enough to make sure grub_memalign(align, size)
always succeeds after a successful call to
  grub_mm_init_region(addr, size + align + GRUB_MM_MGMT_OVERHEAD),
for any given addr and size (assuming no integer overflow).

The size passed to grub_mm_add_region_fn() is now correctly adjusted,
thus if grub_mm_add_region_fn() succeeded, current allocation request
can always succeed.

Signed-off-by: Zhang Boyang <zhangboyang.id@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests/util/grub-shell: Add $GRUB_QEMU_OPTS to run.sh to easily see unofficial QEMU...
Glenn Washburn [Sat, 21 Jan 2023 06:10:46 +0000 (00:10 -0600)] 
tests/util/grub-shell: Add $GRUB_QEMU_OPTS to run.sh to easily see unofficial QEMU arguments

When re-running a failed test, even the non-standard grub-shell QEMU
arguments should be preserved in the run.sh to more precisely replay
the failed test run.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests/util/grub-shell: Create run.sh in working directory for easily running test...
Glenn Washburn [Sat, 21 Jan 2023 06:10:45 +0000 (00:10 -0600)] 
tests/util/grub-shell: Create run.sh in working directory for easily running test again

Now it becomes trivial to re-run a test from the output in its working
directory. This also makes it easy to send a reproducible failing test to
the mailing list. This has allowed a refactor so that the duplicated code
to call QEMU has be condensed (e.g. the use of timeout and file descriptor
redirection). The run.sh script will pass any arguments given to QEMU.
This allows QEMU to be easily started in a state ready for GDB to be
attached.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests: Allow turning on shell tracing from environment variables
Glenn Washburn [Sat, 21 Jan 2023 06:10:44 +0000 (00:10 -0600)] 
tests: Allow turning on shell tracing from environment variables

This allows turning on shell tracing for grub-shell and grub-fs-tester
when its not practical or not possible to use command line arguments
(e.g. from "make check"). Turn on tracing when the envvar is an integer
greater than 1, since these can generate a lot of output. Since this
change uses the environment variables to set the default value for debug
in grub-shell, this allows enabling grub-shell's debug mode which will
preserve various generated output files that are helpful for debugging
tests.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agomisc: Move *printf function declarations to same location
Glenn Washburn [Sat, 21 Jan 2023 03:57:33 +0000 (21:57 -0600)] 
misc: Move *printf function declarations to same location

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agofs/iso9660: Prevent skipping CE or ST at start of continuation area
Thomas Schmitt [Wed, 1 Feb 2023 16:28:49 +0000 (17:28 +0100)] 
fs/iso9660: Prevent skipping CE or ST at start of continuation area

If processing of a SUSP CE entry leads to a continuation area which
begins by entry CE or ST, then these entries were skipped without
interpretation. In case of CE this would lead to premature end of
processing the SUSP entries of the file. In case of ST this could
cause following non-SUSP bytes to be interpreted as SUSP entries.

Signed-off-by: Thomas Schmitt <scdbackup@gmx.net>
Tested-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Thomas Schmitt <scdbackup@gmx.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agofs/iso9660: Incorrect check for entry boundary
Lidong Chen [Fri, 20 Jan 2023 19:39:41 +0000 (19:39 +0000)] 
fs/iso9660: Incorrect check for entry boundary

An SL entry consists of the entry info and the component area.
The entry info should take up 5 bytes instead of sizeof(*entry).
The area after the first 5 bytes is the component area. It is
incorrect to use the sizeof(*entry) to check the entry boundary.

Signed-off-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Thomas Schmitt <scdbackup@gmx.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agofs/iso9660: Avoid reading past the entry boundary
Lidong Chen [Fri, 20 Jan 2023 19:39:40 +0000 (19:39 +0000)] 
fs/iso9660: Avoid reading past the entry boundary

Added a check for the SP entry data boundary before reading it.

Signed-off-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Thomas Schmitt <scdbackup@gmx.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agofs/iso9660: Prevent read past the end of system use area
Lidong Chen [Wed, 1 Feb 2023 16:08:44 +0000 (17:08 +0100)] 
fs/iso9660: Prevent read past the end of system use area

In the code, the for loop advanced the entry pointer to the next entry before
checking if the next entry is within the system use area boundary. Another
issue in the code was that there is no check for the size of system use area.
For a corrupted system, the size of system use area can be less than the size
of minimum SUSP entry size (4 bytes). These can cause buffer overrun. The fixes
added the checks to ensure the read is valid and within the boundary.

Signed-off-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Thomas Schmitt <scdbackup@gmx.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agofs/iso9660: Add check to prevent infinite loop
Lidong Chen [Fri, 20 Jan 2023 19:39:38 +0000 (19:39 +0000)] 
fs/iso9660: Add check to prevent infinite loop

There is no check for the end of block when reading
directory extents. It resulted in read_node() always
read from the same offset in the while loop, thus
caused infinite loop. The fix added a check for the
end of the block and ensure the read is within directory
boundary.

Signed-off-by: Lidong Chen <lidong.chen@oracle.com>
Reviewed-by: Thomas Schmitt <scdbackup@gmx.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogrub-fs-tester: Add LUKS1 and LUKS2 support
Pierre-Louis Bonicoli [Thu, 12 Jan 2023 23:05:10 +0000 (17:05 -0600)] 
grub-fs-tester: Add LUKS1 and LUKS2 support

The logical sector size used by LUKS1 is 512 bytes and LUKS2 uses 512 to
4069 bytes. The default password used is "pass", but can be overridden
by setting the PASS environment variable. The device mapper name is set
to the name of the temp directory so that its easy to correlate device
mapper name with a particular test run. Also since this name is unique
per test run, multiple simultaneous test runs are allowed.

Note that cryptsetup is passing the --disable-locks parameter to allow
cryptsetup run successfully when /run/lock/cryptsetup is not accessible.
Since the device mapper name is unique per test run, there is no need to
worry about locking the device to serialize access.

Signed-off-by: Pierre-Louis Bonicoli <pierre-louis.bonicoli@libregerbil.fr>
Tested-by: Glenn Washburn <development@efficientek.com>
Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Patrick Steinhardt <ps@pks.im>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoosdep/devmapper/getroot: Set up cheated LUKS2 cryptodisk mount from DM parameters
Josselin Poiret [Thu, 12 Jan 2023 23:05:09 +0000 (17:05 -0600)] 
osdep/devmapper/getroot: Set up cheated LUKS2 cryptodisk mount from DM parameters

This lets a LUKS2 cryptodisk have its cipher and hash filled out,
otherwise they wouldn't be initialized if cheat mounted.

Signed-off-by: Josselin Poiret <dev@jpoiret.xyz>
Tested-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Patrick Steinhardt <ps@pks.im>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoosdep/devmapper/getroot: Have devmapper recognize LUKS2
Josselin Poiret [Thu, 12 Jan 2023 23:05:08 +0000 (17:05 -0600)] 
osdep/devmapper/getroot: Have devmapper recognize LUKS2

Changes UUID comparisons so that LUKS1 and LUKS2 are both recognized
as being LUKS cryptodisks.

Signed-off-by: Josselin Poiret <dev@jpoiret.xyz>
Tested-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Patrick Steinhardt <ps@pks.im>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agodisk/cryptodisk: When cheatmounting, use the sector info of the cheat device
Fabian Vogt [Thu, 12 Jan 2023 23:05:07 +0000 (17:05 -0600)] 
disk/cryptodisk: When cheatmounting, use the sector info of the cheat device

When using grub-probe with cryptodisk, the mapped block device from the host
is used directly instead of decrypting the source device in GRUB code.
In that case, the sector size and count of the host device needs to be used.
This is especially important when using LUKS2, which does not assign
total_sectors and log_sector_size when scanning, but only later when the
segments in the JSON area are evaluated. With an unset log_sector_size,
grub_device_open() complains.

This fixes grub-probe failing with
"error: sector sizes of 1 bytes aren't supported yet.".

Signed-off-by: Fabian Vogt <fvogt@suse.de>
Reviewed-by: Patrick Steinhardt <ps@pks.im>
Tested-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Patrick Steinhardt <ps@pks.im>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agofs/f2fs: Fix off-by-one error in nat journal entries check
Daniel Axtens [Sat, 14 Jan 2023 13:19:50 +0000 (00:19 +1100)] 
fs/f2fs: Fix off-by-one error in nat journal entries check

Oops. You're allowed to have up to n = NAT_JOURNAL_ENTRIES entries
_inclusive_, because the loop below uses i < n, not i <= n. D'oh.

Fixes: 4bd9877f6216 (fs/f2fs: Do not read past the end of nat journal entries)
Reported-by: программист нект <programmer11180@programist.ru>
Tested-by: программист нект <programmer11180@programist.ru>
Signed-off-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogentpl.py: Remove .interp section from .img files
Nicholas Vinson [Fri, 13 Jan 2023 07:56:35 +0000 (02:56 -0500)] 
gentpl.py: Remove .interp section from .img files

When building .img files, a .interp section from the .image files will
sometimes be copied into the .img file. This additional section pushes
the .img file beyond the 512-byte limit and causes grub-install to fail
to run for i386-pc platforms.

Signed-off-by: Nicholas Vinson <nvinson234@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests: Add cryptomount functional test
Glenn Washburn [Tue, 10 Jan 2023 22:09:00 +0000 (16:09 -0600)] 
tests: Add cryptomount functional test

The grub_cmd_cryptomount make check test performs some functional testing
of cryptomount and by extension the underlying cryptodisk infrastructure.

A utility test script named grub-shell-luks-tester is created to handle the
complexities of the testing, making it simpler to add new test cases in
grub_cmd_cryptomount.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests/util/grub-shell: Add halt_cmd variable to testcase namespace
Glenn Washburn [Tue, 10 Jan 2023 22:08:59 +0000 (16:08 -0600)] 
tests/util/grub-shell: Add halt_cmd variable to testcase namespace

This allows test case scripts to use the appropriate halt command for
the built architecture to end execution early. Otherwise, test case
scripts have no way to know the appropriate mechanism for halting the
test case early.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests/util/grub-shell: Trim line should always be matched from the beginning of the...
Glenn Washburn [Tue, 10 Jan 2023 22:08:58 +0000 (16:08 -0600)] 
tests/util/grub-shell: Trim line should always be matched from the beginning of the line

When turning on shell tracing the trim line will be output before we
actually want to start the trim. However, in this case the trim line never
starts from the beginning of the line. So start trimming from the correct
line by matching from the beginning of the line.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests/util/grub-shell: Allow specifying non-default trim line contents
Glenn Washburn [Tue, 10 Jan 2023 22:08:57 +0000 (16:08 -0600)] 
tests/util/grub-shell: Allow specifying non-default trim line contents

This will be useful for tests that have unwanted output from setup. This is
not documented because its only intended to be internal at the moment. Also,
--no-trim is allowed to explicitly turn off trim.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests/util/grub-shell: Only cleanup working directory file if QEMU does not fail...
Glenn Washburn [Tue, 10 Jan 2023 22:08:56 +0000 (16:08 -0600)] 
tests/util/grub-shell: Only cleanup working directory file if QEMU does not fail or timeout

This keeps the generated files to aid in diagnosing the source of the failure.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests/util/grub-shell: Set exit status to QEMU exit status
Glenn Washburn [Tue, 10 Jan 2023 22:08:55 +0000 (16:08 -0600)] 
tests/util/grub-shell: Set exit status to QEMU exit status

This allows us to test if unexpected output in test scripts is because of
a bug in GRUB, because there was an error in QEMU, or QEMU was killed due
to a timeout.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoio/gzio: Remove confusing, out-dated comment
Glenn Washburn [Tue, 10 Jan 2023 21:10:34 +0000 (15:10 -0600)] 
io/gzio: Remove confusing, out-dated comment

The "transparent" parameter to grub_gzio_open() was removed in 2010, fc2ef1172c
(* grub-core/io/gzio.c (grub_gzio_open): Removed "transparent" parameter.)

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoefi: Fix spacing
Glenn Washburn [Tue, 10 Jan 2023 21:08:35 +0000 (15:08 -0600)] 
efi: Fix spacing

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agomisc: Fix spacing
Glenn Washburn [Tue, 10 Jan 2023 21:08:34 +0000 (15:08 -0600)] 
misc: Fix spacing

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agomisc: Spelling fixes
Glenn Washburn [Tue, 10 Jan 2023 21:08:33 +0000 (15:08 -0600)] 
misc: Spelling fixes

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agogdb: Unregister gdbstub_break command when unloading module
Glenn Washburn [Tue, 10 Jan 2023 21:03:59 +0000 (15:03 -0600)] 
gdb: Unregister gdbstub_break command when unloading module

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agotests: Fix help test to reflect updated help output
Glenn Washburn [Tue, 10 Jan 2023 21:02:15 +0000 (15:02 -0600)] 
tests: Fix help test to reflect updated help output

Commit f5759a878 (normal/help: Add paging instructions to normal and help
prompts) changed the output of the help command, which broke the help
test. This change allows the test to pass.

On the occasion do s/outpu/output/.

Signed-off-by: Glenn Washburn <development@efficientek.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoterm/serial: Improve detection of duplicate serial ports
Benjamin Herrenschmidt [Fri, 23 Dec 2022 01:48:49 +0000 (12:48 +1100)] 
term/serial: Improve detection of duplicate serial ports

We currently rely on some pretty fragile comparison by name to
identify whether a serial port being configured is identical

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoterm/serial: Avoid double lookup of serial ports
Benjamin Herrenschmidt [Fri, 23 Dec 2022 01:48:48 +0000 (12:48 +1100)] 
term/serial: Avoid double lookup of serial ports

The various functions to add a port used to return port->name, and
the callers would immediately iterate all registered ports to "find"
the one just created by comparing that return value with ... port->name.

This is a waste of cycles and code. Instead, have those functions
return "port" directly.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoterm/serial: Replace usage of memcmp() with strncmp()
Benjamin Herrenschmidt [Fri, 23 Dec 2022 01:48:47 +0000 (12:48 +1100)] 
term/serial: Replace usage of memcmp() with strncmp()

We are comparing strings after all.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2 years agoterm/serial: Add ability to specify MMIO ports via "serial" command
Benjamin Herrenschmidt [Fri, 23 Dec 2022 01:47:59 +0000 (12:47 +1100)] 
term/serial: Add ability to specify MMIO ports via "serial" command

This adds the ability to explicitly add an MMIO based serial port
via the "serial" command. The syntax is:

  serial --port=mmio,<hex_address>{.b,.w,.l,.q}

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>