Skip to content

Commit 3809bed

Browse files
committed
Reject duplicate ACPI entries and document clean rebuilds
1 parent 29c045b commit 3809bed

3 files changed

Lines changed: 22 additions & 26 deletions

File tree

‎README.md‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,15 @@ python3 scripts/build-acpi.py
135135

136136
The build uses the included ACPICA **20260408** source and checks the original tables and the generated ASUS SSDT override against pinned SHA-256 hashes. It rejects other firmware tables and tables that have already been patched. The dump script creates the parent `build/` directory with ownership assigned to the user who will compile the sources. It refuses to overwrite an existing `build/firmware/` directory.
137137

138+
If you generated ACPI files with an older version, retain `build/firmware/` and move the old output aside before rebuilding:
139+
140+
```bash
141+
mv -T --no-clobber build/acpi build/acpi-before-native-dsdt
142+
python3 scripts/build-acpi.py
143+
```
144+
145+
If the backup directory already exists, choose another unused name. The builder refuses to replace different existing output bytes.
146+
138147
Outputs:
139148

140149
```text

‎scripts/verify-boot.py‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def verify_image(path):
5555
raise ValueError('Unzulässige ACPI-Deaktivierung im UKI')
5656
data = sec['.initrd']
5757
offset = 0
58-
files = {}
58+
files = []
5959
while data[offset:offset + 6] in (b'070701', b'070702'):
6060
fields = [int(data[offset + 6 + i * 8:offset + 14 + i * 8], 16) for i in range(13)]
6161
size, namesize = (fields[6], fields[11])
@@ -64,16 +64,16 @@ def verify_image(path):
6464
start = start + namesize + 3 & ~3
6565
if not start + size <= len(data):
6666
raise ValueError('Abgeschnittenes frühes CPIO-Archiv')
67-
files[name] = data[start:start + size]
67+
if name.startswith('kernel/firmware/acpi/'):
68+
files.append((name, data[start:start + size]))
6869
offset = start + size + 3 & ~3
6970
if name == 'TRAILER!!!':
7071
break
71-
expected = {'kernel/firmware/acpi/' + name for name in PINS}
72-
actual = {name for name in files if name.startswith('kernel/firmware/acpi/')}
73-
if actual != expected:
72+
expected = sorted('kernel/firmware/acpi/' + name for name in PINS)
73+
if sorted(name for name, content in files) != expected:
7474
raise ValueError('Only the ASUS SSDT override is allowed; use the native firmware DSDT')
75-
for name, pin in PINS.items():
76-
if not hashlib.sha256(files['kernel/firmware/acpi/' + name]).hexdigest() == pin:
75+
for name, content in files:
76+
if not hashlib.sha256(content).hexdigest() == PINS[name.removeprefix('kernel/firmware/acpi/')]:
7777
raise ValueError('Falsche ACPI-Tabelle im UKI: ' + name)
7878
with tempfile.NamedTemporaryFile() as tmp:
7979
tmp.write(data)

‎tests/test_installation.py‎

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,25 +35,6 @@ def module(name, filename):
3535

3636

3737
class NativeDSDTTests(unittest.TestCase):
38-
def test_relocated_dsdt_does_not_change_selected_asus_table(self):
39-
ssdt = bytearray(36)
40-
ssdt[:4] = b'SSDT'
41-
struct.pack_into('<I', ssdt, 4, len(ssdt))
42-
ssdt[10:24] = acpi.ASUS_SSDT
43-
ssdt[9] = -sum(ssdt) % 256
44-
with tempfile.TemporaryDirectory() as tmp:
45-
dump = Path(tmp)
46-
(dump / 'SSDT9').write_bytes(ssdt)
47-
for address in (0x86f50000, 0x86f70000):
48-
dsdt = bytearray(40)
49-
dsdt[:4] = b'DSDT'
50-
struct.pack_into('<I', dsdt, 4, len(dsdt))
51-
struct.pack_into('<I', dsdt, 36, address)
52-
dsdt[9] = -sum(dsdt) % 256
53-
(dump / 'DSDT').write_bytes(dsdt)
54-
found = acpi.dumped_tables(dump)
55-
self.assertEqual(found, {b'SSDT': {bytes(ssdt): ['SSDT9']}})
56-
5738
def test_initramfs_hook_embeds_only_asus_ssdt(self):
5839
script = 'source "$1"\nadd_file_early() { printf "%s %s\\n" "$1" "$2"; }\nbuild\n'
5940
result = subprocess.check_output(
@@ -93,6 +74,12 @@ def output(args, **kwargs):
9374
acpi.member('TRAILER!!!', b'', 0, 3))
9475
with self.assertRaisesRegex(ValueError, 'native firmware DSDT'):
9576
boot.verify_image('fixture.efi')
77+
# A later valid entry must not hide a preceding table under the same path.
78+
sec['.initrd'] = (acpi.member('kernel/firmware/acpi/SSDT.aml',
79+
b'DSDT with stale addresses', 0o100644, 3) +
80+
early + acpi.member('TRAILER!!!', b'', 0, 4))
81+
with self.assertRaisesRegex(ValueError, 'native firmware DSDT'):
82+
boot.verify_image('fixture.efi')
9683

9784

9885
class MenuTests(unittest.TestCase):

0 commit comments

Comments
 (0)