Skip to content

Commit d42eccc

Browse files
committed
Save the debug and error logs in mok-variables
This changes our debug and error logging to save the entire logs into mok-variables as "shim-dbg.txt" and "shim-log.txt". Signed-off-by: Peter Jones <pjones@redhat.com>
1 parent ea14385 commit d42eccc

File tree

4 files changed

+154
-0
lines changed

4 files changed

+154
-0
lines changed

errlog.c

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,153 @@ ClearErrors(VOID)
9999
errs = NULL;
100100
}
101101

102+
static size_t
103+
format_error_log(UINT8 *dest, size_t dest_sz)
104+
{
105+
size_t err_log_sz = 0;
106+
size_t pos = 0;
107+
108+
for (UINTN i = 0; i < nerrs; i++)
109+
err_log_sz += StrSize(errs[i]);
110+
111+
if (!dest || dest_sz < err_log_sz)
112+
return err_log_sz;
113+
114+
ZeroMem(dest, err_log_sz);
115+
for (UINTN i = 0; i < nerrs; i++) {
116+
UINTN sz = StrSize(errs[i]);
117+
CopyMem(&dest[pos], errs[i], sz);
118+
pos += sz;
119+
}
120+
121+
return err_log_sz;
122+
}
123+
124+
static UINT8 *debug_log = NULL;
125+
static size_t debug_log_sz = 0;
126+
static size_t debug_log_alloc = 0;
127+
128+
UINTN EFIAPI
129+
log_debug_print(const CHAR16 *fmt, ...)
130+
{
131+
ms_va_list args;
132+
CHAR16 *buf;
133+
size_t buf_sz;
134+
UINTN ret = 0;
135+
136+
ms_va_start(args, fmt);
137+
buf = VPoolPrint(fmt, args);
138+
if (!buf)
139+
return 0;
140+
ms_va_end(args);
141+
142+
ret = StrLen(buf);
143+
buf_sz = StrSize(buf);
144+
if (debug_log_sz + buf_sz > debug_log_alloc) {
145+
size_t new_alloc_sz = debug_log_alloc;
146+
CHAR16 *new_debug_log;
147+
148+
new_alloc_sz += buf_sz;
149+
new_alloc_sz = ALIGN_UP(new_alloc_sz, 4096);
150+
151+
new_debug_log = ReallocatePool(debug_log, debug_log_alloc, new_alloc_sz);
152+
if (!new_debug_log)
153+
return 0;
154+
debug_log = (UINT8 *)new_debug_log;
155+
debug_log_alloc = new_alloc_sz;
156+
}
157+
158+
CopyMem(&debug_log[debug_log_sz], buf, buf_sz);
159+
debug_log_sz += buf_sz;
160+
FreePool(buf);
161+
return ret;
162+
}
163+
164+
static size_t
165+
format_debug_log(UINT8 *dest, size_t dest_sz)
166+
{
167+
if (!dest || dest_sz < debug_log_sz)
168+
return debug_log_sz;
169+
170+
ZeroMem(dest, debug_log_sz);
171+
CopyMem(dest, debug_log, debug_log_sz);
172+
return debug_log_sz;
173+
}
174+
175+
void
176+
save_logs(void)
177+
{
178+
struct mok_variable_config_entry *cfg_table = NULL;
179+
struct mok_variable_config_entry *new_table = NULL;
180+
struct mok_variable_config_entry *entry = NULL;
181+
size_t new_table_sz;
182+
UINTN pos = 0;
183+
EFI_STATUS efi_status;
184+
EFI_CONFIGURATION_TABLE *CT;
185+
EFI_GUID bogus_guid = { 0x29f2f0db, 0xd025, 0x4aa6, { 0x99, 0x58, 0xa0, 0x21, 0x8b, 0x1d, 0xec, 0x0e }};
186+
size_t errlog_sz, dbglog_sz;
187+
188+
errlog_sz = format_error_log(NULL, 0);
189+
dbglog_sz = format_debug_log(NULL, 0);
190+
191+
if (errlog_sz == 0 && dbglog_sz == 0) {
192+
console_print(L"No console or debug log?!?!?\n");
193+
return;
194+
}
195+
196+
for (UINTN i = 0; i < ST->NumberOfTableEntries; i++) {
197+
CT = &ST->ConfigurationTable[i];
198+
199+
if (CompareGuid(&MOK_VARIABLE_STORE, &CT->VendorGuid) == 0) {
200+
cfg_table = CT->VendorTable;
201+
break;
202+
}
203+
CT = NULL;
204+
}
205+
206+
entry = cfg_table;
207+
while (entry && entry->name[0] != 0) {
208+
size_t entry_sz;
209+
entry = (struct mok_variable_config_entry *)((uintptr_t)cfg_table + pos);
210+
211+
entry_sz = sizeof(*entry);
212+
entry_sz += entry->data_size;
213+
214+
if (entry->name[0] != 0)
215+
pos += entry_sz;
216+
}
217+
218+
new_table_sz = pos + 3 * sizeof(*entry) + errlog_sz + dbglog_sz;
219+
new_table = AllocateZeroPool(new_table_sz);
220+
if (!new_table)
221+
return;
222+
223+
CopyMem(new_table, cfg_table, pos);
224+
225+
entry = (struct mok_variable_config_entry *)((uintptr_t)new_table + pos);
226+
if (errlog_sz) {
227+
strcpy(entry->name, "shim-err.txt");
228+
entry->data_size = errlog_sz;
229+
format_error_log(&entry->data[0], errlog_sz);
230+
231+
pos += sizeof(*entry) + errlog_sz;
232+
entry = (struct mok_variable_config_entry *)((uintptr_t)new_table + pos);
233+
}
234+
if (dbglog_sz) {
235+
strcpy(entry->name, "shim-dbg.txt");
236+
entry->data_size = dbglog_sz;
237+
format_debug_log(&entry->data[0], dbglog_sz);
238+
239+
pos += sizeof(*entry) + dbglog_sz;
240+
// entry = (struct mok_variable_config_entry *)((uintptr_t)new_table + pos);
241+
}
242+
243+
if (CT) {
244+
CopyMem(&CT->VendorGuid, &bogus_guid, sizeof(bogus_guid));
245+
}
246+
efi_status = BS->InstallConfigurationTable(&MOK_VARIABLE_STORE, new_table);
247+
if (EFI_ERROR(efi_status))
248+
console_print(L"Could not re-install MoK configuration table: %r\n", efi_status);
249+
}
250+
102251
// vim:fenc=utf-8:tw=75

include/console.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ extern UINT32 verbose;
9898
#ifndef SHIM_UNIT_TEST
9999
#define dprint_(fmt, ...) ({ \
100100
UINTN __dprint_ret = 0; \
101+
log_debug_print((fmt), ##__VA_ARGS__); \
101102
if (verbose) \
102103
__dprint_ret = console_print((fmt), ##__VA_ARGS__); \
103104
__dprint_ret; \

include/errlog.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ extern VOID LogHexdump_(const char *file, int line, const char *func,
1515
const void *data, size_t sz);
1616
extern VOID PrintErrors(VOID);
1717
extern VOID ClearErrors(VOID);
18+
extern void save_logs(void);
19+
extern UINTN EFIAPI log_debug_print(const CHAR16 *fmt, ...);
1820

1921
#endif /* !ERRLOG_H_ */
2022
// vim:fenc=utf-8:tw=75:noet

shim.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2090,6 +2090,8 @@ efi_main (EFI_HANDLE passed_image_handle, EFI_SYSTEM_TABLE *passed_systab)
20902090
usleep(2000000);
20912091
}
20922092

2093+
save_logs();
2094+
20932095
/*
20942096
* Hand over control to the second stage bootloader
20952097
*/

0 commit comments

Comments
 (0)