Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lldb/docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ are welcome:
* iOS, tvOS, and watchOS device debugging on ARM and AArch64
* Linux user-space debugging for i386, x86_64, ARM, AArch64, PPC64le, s390x
* FreeBSD user-space debugging for i386, x86_64, ARM, AArch64, PPC
* FreeBSD kernel debugging for i386, x86_64, ARM, AArch64
* FreeBSD kernel debugging for i386, x86_64, ARM, AArch64, PPC64le
* NetBSD user-space debugging for i386 and x86_64
* Windows user-space debugging for i386, x86_64, ARM and AArch64 (*)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ add_lldb_library(lldbPluginProcessFreeBSDKernelCore PLUGIN
RegisterContextFreeBSDKernelCore_arm.cpp
RegisterContextFreeBSDKernelCore_arm64.cpp
RegisterContextFreeBSDKernelCore_i386.cpp
RegisterContextFreeBSDKernelCore_ppc64le.cpp
RegisterContextFreeBSDKernelCore_x86_64.cpp
ThreadFreeBSDKernelCore.cpp

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "RegisterContextFreeBSDKernelCore_ppc64le.h"

#include "lldb/Target/Process.h"
#include "lldb/Target/Thread.h"
#include "lldb/Utility/RegisterValue.h"
#include "llvm/Support/Endian.h"

using namespace lldb;
using namespace lldb_private;

RegisterContextFreeBSDKernelCore_ppc64le::
RegisterContextFreeBSDKernelCore_ppc64le(
Thread &thread, lldb_private::RegisterInfoInterface *register_info,
lldb::addr_t pcb_addr)
: RegisterContextPOSIX_ppc64le(thread, 0, register_info),
m_pcb_addr(pcb_addr) {}

bool RegisterContextFreeBSDKernelCore_ppc64le::ReadRegister(
const RegisterInfo *reg_info, RegisterValue &value) {
if (m_pcb_addr == LLDB_INVALID_ADDRESS)
return false;

// https://cgit.freebsd.org/src/tree/sys/powerpc/include/pcb.h
struct {
llvm::support::ulittle64_t context[20];
llvm::support::ulittle64_t cr;
llvm::support::ulittle64_t sp;
llvm::support::ulittle64_t toc;
llvm::support::ulittle64_t lr;
} pcb;

Status error;
size_t rd =
m_thread.GetProcess()->ReadMemory(m_pcb_addr, &pcb, sizeof(pcb), error);
if (rd != sizeof(pcb))
return false;

uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
switch (reg) {
case gpr_r1_ppc64le:
// r1 is saved in the sp field
value = pcb.sp;
break;
case gpr_r2_ppc64le:
// r2 is saved in the toc field
value = pcb.toc;
break;
case gpr_r12_ppc64le:
case gpr_r13_ppc64le:
case gpr_r14_ppc64le:
case gpr_r15_ppc64le:
case gpr_r16_ppc64le:
case gpr_r17_ppc64le:
case gpr_r18_ppc64le:
case gpr_r19_ppc64le:
case gpr_r20_ppc64le:
case gpr_r21_ppc64le:
case gpr_r22_ppc64le:
case gpr_r23_ppc64le:
case gpr_r24_ppc64le:
case gpr_r25_ppc64le:
case gpr_r26_ppc64le:
case gpr_r27_ppc64le:
case gpr_r28_ppc64le:
case gpr_r29_ppc64le:
case gpr_r30_ppc64le:
case gpr_r31_ppc64le:
value = pcb.context[reg - gpr_r12_ppc64le];
break;
case gpr_pc_ppc64le:
case gpr_lr_ppc64le:
// The pc of crashing thread is stored in lr.
value = pcb.lr;
break;
case gpr_cr_ppc64le:
value = pcb.cr;
break;
default:
return false;
}
return true;
}

bool RegisterContextFreeBSDKernelCore_ppc64le::WriteRegister(
const RegisterInfo *reg_info, const RegisterValue &value) {
return false;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNELCORE_PPC64LE_H
#define LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNELCORE_PPC64LE_H

#include "Plugins/Process/Utility/RegisterContextPOSIX_ppc64le.h"
#include "Plugins/Process/elf-core/RegisterUtilities.h"

class RegisterContextFreeBSDKernelCore_ppc64le
: public RegisterContextPOSIX_ppc64le {
public:
RegisterContextFreeBSDKernelCore_ppc64le(
lldb_private::Thread &thread,
lldb_private::RegisterInfoInterface *register_info,
lldb::addr_t pcb_addr);

bool ReadRegister(const lldb_private::RegisterInfo *reg_info,
lldb_private::RegisterValue &value) override;

bool WriteRegister(const lldb_private::RegisterInfo *reg_info,
const lldb_private::RegisterValue &value) override;

private:
lldb::addr_t m_pcb_addr;
};

#endif // LLDB_SOURCE_PLUGINS_PROCESS_FREEBSDKERNEL_REGISTERCONTEXTFREEBSDKERNELCORE_PPC64LE_H
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@
#include "Plugins/Process/Utility/RegisterContextFreeBSD_x86_64.h"
#include "Plugins/Process/Utility/RegisterInfoPOSIX_arm.h"
#include "Plugins/Process/Utility/RegisterInfoPOSIX_arm64.h"
#include "Plugins/Process/Utility/RegisterInfoPOSIX_ppc64le.h"
#include "ProcessFreeBSDKernelCore.h"
#include "RegisterContextFreeBSDKernelCore_arm.h"
#include "RegisterContextFreeBSDKernelCore_arm64.h"
#include "RegisterContextFreeBSDKernelCore_i386.h"
#include "RegisterContextFreeBSDKernelCore_ppc64le.h"
#include "RegisterContextFreeBSDKernelCore_x86_64.h"

using namespace lldb;
Expand Down Expand Up @@ -70,6 +72,11 @@ ThreadFreeBSDKernelCore::CreateRegisterContextForFrame(StackFrame *frame) {
std::make_shared<RegisterContextFreeBSDKernelCore_arm>(
*this, std::make_unique<RegisterInfoPOSIX_arm>(arch), m_pcb_addr);
break;
case llvm::Triple::ppc64le:
m_thread_reg_ctx_sp =
std::make_shared<RegisterContextFreeBSDKernelCore_ppc64le>(
*this, new RegisterInfoPOSIX_ppc64le(arch), m_pcb_addr);
break;
case llvm::Triple::x86:
m_thread_reg_ctx_sp =
std::make_shared<RegisterContextFreeBSDKernelCore_i386>(
Expand Down
2 changes: 1 addition & 1 deletion llvm/docs/ReleaseNotes.md
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ Changes to LLDB
* Support for libfbsdvmcore has been removed. As a result, FreeBSD kernel dump debugging is now only
available on FreeBSD hosts. Live kernel debugging through the GDB remote protocol is still available
from any platform.
* Support for ARM has been added.
* Support for ARM and PPC64le has been added.
* The crashed thread is now automatically selected on start.
* Threads are listed in incrmental order by pid then by tid.
* Unread kernel messages saved in msgbufp are now printed when lldb starts. This information is printed only
Expand Down