1
+ // ===-- DynamicLoaderFreeBSDKernel.cpp
2
+ // ------------------------------------------===//
3
+ //
4
+ // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5
+ // See https://llvm.org/LICENSE.txt for license information.
6
+ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7
+ //
8
+ // ===----------------------------------------------------------------------===//
9
+
1
10
#include " lldb/Breakpoint/StoppointCallbackContext.h"
2
11
#include " lldb/Core/Debugger.h"
3
12
#include " lldb/Core/Module.h"
@@ -55,7 +64,7 @@ static bool is_kernel(Module *module) {
55
64
if (objfile->GetType () != ObjectFile::eTypeExecutable)
56
65
return false ;
57
66
if (objfile->GetStrata () != ObjectFile::eStrataUnknown &&
58
- objfile->GetStrata () != ObjectFile::eStrataUser )
67
+ objfile->GetStrata () != ObjectFile::eStrataKernel )
59
68
return false ;
60
69
61
70
return true ;
@@ -92,16 +101,12 @@ DynamicLoader *
92
101
DynamicLoaderFreeBSDKernel::CreateInstance (lldb_private::Process *process,
93
102
bool force) {
94
103
// Check the environment when the plugin is not force loaded
95
- Log *log = GetLog (LLDBLog::DynamicLoader);
96
- LLDB_LOGF (log, " DynamicLoaderFreeBSDKernel::CreateInstance: "
97
- " Try to create instance" );
104
+ Module *exec = process->GetTarget ().GetExecutableModulePointer ();
105
+ if (exec && !is_kernel (exec)) {
106
+ return nullptr ;
107
+ }
98
108
if (!force) {
99
- Module *exec = process->GetTarget ().GetExecutableModulePointer ();
100
109
// Check if the target is kernel
101
- if (exec && !is_kernel (exec)) {
102
- return nullptr ;
103
- }
104
-
105
110
const llvm::Triple &triple_ref =
106
111
process->GetTarget ().GetArchitecture ().GetTriple ();
107
112
if (!triple_ref.isOSFreeBSD ()) {
@@ -187,17 +192,22 @@ lldb_private::UUID DynamicLoaderFreeBSDKernel::CheckForKernelImageAtAddress(
187
192
addr);
188
193
189
194
llvm::ELF::Elf32_Ehdr header;
190
- if (!ReadELFHeader (process, addr, header))
195
+ if (!ReadELFHeader (process, addr, header)) {
196
+ *read_error = true ;
191
197
return UUID ();
198
+ }
192
199
193
200
// Check header type
194
201
if (header.e_type != llvm::ELF::ET_EXEC)
195
202
return UUID ();
196
203
197
204
ModuleSP memory_module_sp =
198
205
process->ReadModuleFromMemory (FileSpec (" temp_freebsd_kernel" ), addr);
199
- if (!memory_module_sp.get ())
206
+
207
+ if (!memory_module_sp.get ()) {
208
+ *read_error = true ;
200
209
return UUID ();
210
+ }
201
211
202
212
ObjectFile *exe_objfile = memory_module_sp->GetObjectFile ();
203
213
if (exe_objfile == nullptr ) {
@@ -209,31 +219,27 @@ lldb_private::UUID DynamicLoaderFreeBSDKernel::CheckForKernelImageAtAddress(
209
219
return UUID ();
210
220
}
211
221
212
- if (is_kernel (memory_module_sp.get ())) {
213
- ArchSpec kernel_arch (
214
- llvm::ELF::convertEMachineToArchName (header.e_machine ));
222
+ // In here, I should check is_kernel for memory_module_sp
223
+ // However, the ReadModuleFromMemory reads wrong section so that this check
224
+ // will failed
225
+ ArchSpec kernel_arch (llvm::ELF::convertEMachineToArchName (header.e_machine ));
215
226
216
- if (!process->GetTarget ().GetArchitecture ().IsCompatibleMatch (kernel_arch))
217
- process->GetTarget ().SetArchitecture (kernel_arch);
227
+ if (!process->GetTarget ().GetArchitecture ().IsCompatibleMatch (kernel_arch))
228
+ process->GetTarget ().SetArchitecture (kernel_arch);
218
229
219
- if (log) {
220
- std::string uuid_str;
221
- if (memory_module_sp->GetUUID ().IsValid ()) {
222
- uuid_str = " with UUID " ;
223
- uuid_str += memory_module_sp->GetUUID ().GetAsString ();
224
- } else {
225
- uuid_str = " and no LC_UUID found in load commands " ;
226
- }
227
- LLDB_LOGF (log,
228
- " DynamicLoaderFreeBSDKernel::CheckForKernelImageAtAddress: "
229
- " kernel binary image found at 0x%" PRIx64 " with arch '%s' %s" ,
230
- addr, kernel_arch.GetTriple ().str ().c_str (), uuid_str.c_str ());
231
- }
232
-
233
- return memory_module_sp->GetUUID ();
230
+ std::string uuid_str;
231
+ if (memory_module_sp->GetUUID ().IsValid ()) {
232
+ uuid_str = " with UUID " ;
233
+ uuid_str += memory_module_sp->GetUUID ().GetAsString ();
234
+ } else {
235
+ uuid_str = " and no LC_UUID found in load commands " ;
234
236
}
237
+ LLDB_LOGF (log,
238
+ " DynamicLoaderFreeBSDKernel::CheckForKernelImageAtAddress: "
239
+ " kernel binary image found at 0x%" PRIx64 " with arch '%s' %s" ,
240
+ addr, kernel_arch.GetTriple ().str ().c_str (), uuid_str.c_str ());
235
241
236
- return UUID ();
242
+ return memory_module_sp-> GetUUID ();
237
243
}
238
244
239
245
void DynamicLoaderFreeBSDKernel::DebuggerInit (
@@ -264,7 +270,7 @@ bool DynamicLoaderFreeBSDKernel::KModImageInfo::ReadMemoryModule(
264
270
if (m_load_address == LLDB_INVALID_ADDRESS)
265
271
return false ;
266
272
267
- FileSpec file_spec (m_name. c_str () );
273
+ FileSpec file_spec (m_name);
268
274
269
275
ModuleSP memory_module_sp;
270
276
@@ -302,10 +308,8 @@ bool DynamicLoaderFreeBSDKernel::KModImageInfo::ReadMemoryModule(
302
308
303
309
// The kernel binary is from memory
304
310
if (this_is_kernel) {
305
- if (log)
306
- LLDB_LOGF (log,
307
- " KextImageInfo::ReadMemoryModule read the kernel binary out "
308
- " of memory" );
311
+ LLDB_LOGF (log, " KextImageInfo::ReadMemoryModule read the kernel binary out "
312
+ " of memory" );
309
313
310
314
if (memory_module_sp->GetArchitecture ().IsValid ())
311
315
process->GetTarget ().SetArchitecture (memory_module_sp->GetArchitecture ());
@@ -384,7 +388,7 @@ bool DynamicLoaderFreeBSDKernel::KModImageInfo::LoadImageUsingMemoryModule(
384
388
// relocatable file So what we do is to set the load address only.
385
389
if (is_kmod (m_module_sp.get ()) && is_reloc (m_module_sp.get ())) {
386
390
m_stop_id = process->GetStopID ();
387
- bool changed;
391
+ bool changed = false ;
388
392
m_module_sp->SetLoadAddress (target, m_load_address, true , changed);
389
393
return true ;
390
394
}
@@ -594,6 +598,7 @@ bool DynamicLoaderFreeBSDKernel::ReadAllKmods(
594
598
if (!kld_off_address_symbol || !kld_off_next_symbol ||
595
599
!kld_off_filename_symbol || !kld_off_pathname_symbol)
596
600
return false ;
601
+
597
602
Status error;
598
603
const int32_t kld_off_address = m_process->ReadSignedIntegerFromMemory (
599
604
kld_off_address_symbol->GetAddress ().GetLoadAddress (
@@ -628,20 +633,34 @@ bool DynamicLoaderFreeBSDKernel::ReadAllKmods(
628
633
linker_files_head_addr.GetLoadAddress (&m_process->GetTarget ());
629
634
630
635
while (current_kld != 0 ) {
631
- m_process->ReadCStringFromMemory (
632
- m_process->ReadPointerFromMemory (current_kld + kld_off_filename, error),
633
- kld_filename, sizeof (kld_filename), error);
634
- m_process->ReadCStringFromMemory (
635
- m_process->ReadPointerFromMemory (current_kld + kld_off_pathname, error),
636
- kld_pathname, sizeof (kld_pathname), error);
636
+ addr_t kld_filename_addr =
637
+ m_process->ReadPointerFromMemory (current_kld + kld_off_filename, error);
638
+ if (error.Fail ())
639
+ return false ;
640
+ addr_t kld_pathname_addr =
641
+ m_process->ReadPointerFromMemory (current_kld + kld_off_pathname, error);
642
+ if (error.Fail ())
643
+ return false ;
644
+
645
+ m_process->ReadCStringFromMemory (kld_filename_addr, kld_filename,
646
+ sizeof (kld_filename), error);
647
+ if (error.Fail ())
648
+ return false ;
649
+ m_process->ReadCStringFromMemory (kld_pathname_addr, kld_pathname,
650
+ sizeof (kld_pathname), error);
651
+ if (error.Fail ())
652
+ return false ;
637
653
kld_load_addr =
638
654
m_process->ReadPointerFromMemory (current_kld + kld_off_address, error);
655
+ if (error.Fail ())
656
+ return false ;
639
657
640
658
kmods_list.emplace_back ();
641
659
KModImageInfo &kmod_info = kmods_list.back ();
642
660
kmod_info.SetName (kld_filename);
643
661
kmod_info.SetLoadAddress (kld_load_addr);
644
662
kmod_info.SetPath (kld_pathname);
663
+
645
664
current_kld =
646
665
m_process->ReadPointerFromMemory (current_kld + kld_off_next, error);
647
666
if (kmod_info.GetName () == " kernel" )
@@ -654,19 +673,15 @@ bool DynamicLoaderFreeBSDKernel::ReadAllKmods(
654
673
}
655
674
656
675
// Read all kmods
657
- bool DynamicLoaderFreeBSDKernel::ReadAllKmods () {
676
+ void DynamicLoaderFreeBSDKernel::ReadAllKmods () {
658
677
std::lock_guard<decltype (m_mutex)> guard (m_mutex);
659
678
660
679
if (ReadKmodsListHeader ()) {
661
-
662
680
if (m_linker_file_head_addr.IsValid ()) {
663
681
if (!ParseKmods (m_linker_file_head_addr))
664
682
m_linker_files_list.clear ();
665
- return true ;
666
683
}
667
684
}
668
-
669
- return false ;
670
685
}
671
686
672
687
// Load all Kernel Modules
@@ -684,12 +699,15 @@ void DynamicLoaderFreeBSDKernel::LoadKernelModules() {
684
699
}
685
700
686
701
// Set name for kernel
687
- ConstString kernel_name (" freebsd_kernel" );
702
+ llvm::StringRef kernel_name (" freebsd_kernel" );
688
703
module_sp = m_kernel_image_info.GetModule ();
689
704
if (module_sp.get () && module_sp->GetObjectFile () &&
690
705
!module_sp->GetObjectFile ()->GetFileSpec ().GetFilename ().IsEmpty ())
691
- kernel_name = module_sp->GetObjectFile ()->GetFileSpec ().GetFilename ();
692
- m_kernel_image_info.SetName (kernel_name.AsCString ());
706
+ kernel_name = module_sp->GetObjectFile ()
707
+ ->GetFileSpec ()
708
+ .GetFilename ()
709
+ .GetStringRef ();
710
+ m_kernel_image_info.SetName (kernel_name.data ());
693
711
694
712
if (m_kernel_image_info.GetLoadAddress () == LLDB_INVALID_ADDRESS) {
695
713
m_kernel_image_info.SetLoadAddress (m_kernel_load_address);
@@ -760,7 +778,8 @@ void DynamicLoaderFreeBSDKernel::PrivateInitialize(Process *process) {
760
778
ThreadPlanSP DynamicLoaderFreeBSDKernel::GetStepThroughTrampolinePlan (
761
779
lldb_private::Thread &thread, bool stop_others) {
762
780
Log *log = GetLog (LLDBLog::Step);
763
- LLDB_LOGF (log, " Could not find symbol for step through." );
781
+ LLDB_LOGF (log, " DynamicLoaderFreeBSDKernel::GetStepThroughTrampolinePlan is "
782
+ " not yet implemented." );
764
783
return {};
765
784
}
766
785
0 commit comments