Skip to content

Commit 9b4e40c

Browse files
committed
Merge branch 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull EFI fixes from Ingo Molnar: "Misc EFI fixes all across the map: CPER error report fixes, fixes to TPM event log parsing, fix for a kexec hang, a Sparse fix and other fixes" * 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: efi/tpm: Fix sanity check of unsigned tbl_size being less than zero efi/x86: Do not clean dummy variable in kexec path efi: Make unexported efi_rci2_sysfs_init() static efi/tpm: Only set 'efi_tpm_final_log_size' after successful event log parsing efi/tpm: Don't traverse an event log with no events efi/tpm: Don't access event->count when it isn't mapped efivar/ssdt: Don't iterate over EFI vars if no SSDT override was specified efi/cper: Fix endianness of PCIe class code
2 parents fcb45a2 + be59d57 commit 9b4e40c

File tree

6 files changed

+36
-16
lines changed

6 files changed

+36
-16
lines changed

arch/x86/platform/efi/efi.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -917,9 +917,6 @@ static void __init kexec_enter_virtual_mode(void)
917917

918918
if (efi_enabled(EFI_OLD_MEMMAP) && (__supported_pte_mask & _PAGE_NX))
919919
runtime_code_page_mkexec();
920-
921-
/* clean DUMMY object */
922-
efi_delete_dummy_variable();
923920
#endif
924921
}
925922

drivers/firmware/efi/cper.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ static void cper_print_pcie(const char *pfx, const struct cper_sec_pcie *pcie,
381381
printk("%s""vendor_id: 0x%04x, device_id: 0x%04x\n", pfx,
382382
pcie->device_id.vendor_id, pcie->device_id.device_id);
383383
p = pcie->device_id.class_code;
384-
printk("%s""class_code: %02x%02x%02x\n", pfx, p[0], p[1], p[2]);
384+
printk("%s""class_code: %02x%02x%02x\n", pfx, p[2], p[1], p[0]);
385385
}
386386
if (pcie->validation_bits & CPER_PCIE_VALID_SERIAL_NUMBER)
387387
printk("%s""serial number: 0x%04x, 0x%04x\n", pfx,

drivers/firmware/efi/efi.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,9 @@ static __init int efivar_ssdt_load(void)
267267
void *data;
268268
int ret;
269269

270+
if (!efivar_ssdt[0])
271+
return 0;
272+
270273
ret = efivar_init(efivar_ssdt_iter, &entries, true, &entries);
271274

272275
list_for_each_entry_safe(entry, aux, &entries, list) {

drivers/firmware/efi/rci2-table.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ static u16 checksum(void)
7676
return chksum;
7777
}
7878

79-
int __init efi_rci2_sysfs_init(void)
79+
static int __init efi_rci2_sysfs_init(void)
8080
{
8181
struct kobject *tables_kobj;
8282
int ret = -ENOMEM;

drivers/firmware/efi/tpm.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ int __init efi_tpm_eventlog_init(void)
4040
{
4141
struct linux_efi_tpm_eventlog *log_tbl;
4242
struct efi_tcg2_final_events_table *final_tbl;
43-
unsigned int tbl_size;
43+
int tbl_size;
4444
int ret = 0;
4545

4646
if (efi.tpm_log == EFI_INVALID_TABLE_ADDR) {
@@ -75,16 +75,28 @@ int __init efi_tpm_eventlog_init(void)
7575
goto out;
7676
}
7777

78-
tbl_size = tpm2_calc_event_log_size((void *)efi.tpm_final_log
79-
+ sizeof(final_tbl->version)
80-
+ sizeof(final_tbl->nr_events),
81-
final_tbl->nr_events,
82-
log_tbl->log);
78+
tbl_size = 0;
79+
if (final_tbl->nr_events != 0) {
80+
void *events = (void *)efi.tpm_final_log
81+
+ sizeof(final_tbl->version)
82+
+ sizeof(final_tbl->nr_events);
83+
84+
tbl_size = tpm2_calc_event_log_size(events,
85+
final_tbl->nr_events,
86+
log_tbl->log);
87+
}
88+
89+
if (tbl_size < 0) {
90+
pr_err(FW_BUG "Failed to parse event in TPM Final Events Log\n");
91+
goto out_calc;
92+
}
93+
8394
memblock_reserve((unsigned long)final_tbl,
8495
tbl_size + sizeof(*final_tbl));
85-
early_memunmap(final_tbl, sizeof(*final_tbl));
8696
efi_tpm_final_log_size = tbl_size;
8797

98+
out_calc:
99+
early_memunmap(final_tbl, sizeof(*final_tbl));
88100
out:
89101
early_memunmap(log_tbl, sizeof(*log_tbl));
90102
return ret;

include/linux/tpm_eventlog.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ struct tcg_algorithm_info {
152152
* total. Once we've done this we know the offset of the data length field,
153153
* and can calculate the total size of the event.
154154
*
155-
* Return: size of the event on success, <0 on failure
155+
* Return: size of the event on success, 0 on failure
156156
*/
157157

158158
static inline int __calc_tpm2_event_size(struct tcg_pcr_event2_head *event,
@@ -170,6 +170,7 @@ static inline int __calc_tpm2_event_size(struct tcg_pcr_event2_head *event,
170170
u16 halg;
171171
int i;
172172
int j;
173+
u32 count, event_type;
173174

174175
marker = event;
175176
marker_start = marker;
@@ -190,16 +191,22 @@ static inline int __calc_tpm2_event_size(struct tcg_pcr_event2_head *event,
190191
}
191192

192193
event = (struct tcg_pcr_event2_head *)mapping;
194+
/*
195+
* The loop below will unmap these fields if the log is larger than
196+
* one page, so save them here for reference:
197+
*/
198+
count = READ_ONCE(event->count);
199+
event_type = READ_ONCE(event->event_type);
193200

194201
efispecid = (struct tcg_efi_specid_event_head *)event_header->event;
195202

196203
/* Check if event is malformed. */
197-
if (event->count > efispecid->num_algs) {
204+
if (count > efispecid->num_algs) {
198205
size = 0;
199206
goto out;
200207
}
201208

202-
for (i = 0; i < event->count; i++) {
209+
for (i = 0; i < count; i++) {
203210
halg_size = sizeof(event->digests[i].alg_id);
204211

205212
/* Map the digest's algorithm identifier */
@@ -256,8 +263,9 @@ static inline int __calc_tpm2_event_size(struct tcg_pcr_event2_head *event,
256263
+ event_field->event_size;
257264
size = marker - marker_start;
258265

259-
if ((event->event_type == 0) && (event_field->event_size == 0))
266+
if (event_type == 0 && event_field->event_size == 0)
260267
size = 0;
268+
261269
out:
262270
if (do_mapping)
263271
TPM_MEMUNMAP(mapping, mapping_size);

0 commit comments

Comments
 (0)