@@ -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
0 commit comments