Source code for crash.target.ppc64

# -*- coding: utf-8 -*-
# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:

from typing import Optional

import gdb

import crash.target
from crash.target import register_target
from crash.target import KernelFrameFilter

class _FetchRegistersBase(crash.target.TargetFetchRegistersBase):
    def __init__(self) -> None:
        super().__init__()
        self.filter: KernelFrameFilter

    def fetch_active(self, thread: gdb.InferiorThread,
                     register: Optional[gdb.RegisterDescriptor]) -> gdb.RegisterCollectionType:
        registers = {}
        task = thread.info
        for reg in task.regs:
            if (reg == "pc" and register is not None and
                    register.name != "pc"):
                continue
            try:
                registers[reg] = task.regs[reg]
            except KeyError:
                pass

        return registers

    def fetch_scheduled(self, thread: gdb.InferiorThread,
                        register: Optional[gdb.RegisterDescriptor]) -> gdb.RegisterCollectionType:
        registers: gdb.RegisterCollectionType = {}
        return registers

# pylint: disable=abstract-method
[docs] class PPC64TargetBase(crash.target.TargetBase): ident = "powerpc:common64" aliases = ["ppc64", "elf64-powerpc"] def __init__(self) -> None: super().__init__() # Stop stack traces with addresses below this self.filter = KernelFrameFilter(0xffff000000000000)
[docs] def arch_setup_thread(self, thread: gdb.InferiorThread) -> None: task = thread.info.task_struct thread.info.set_thread_info(task['thread_info'].address) thread.info.set_thread_struct(task['thread'])
[docs] def get_stack_pointer(self, thread: gdb.InferiorThread) -> int: return int(thread.info.thread_struct['ksp'])
[docs] class PPC64Target(_FetchRegistersBase, PPC64TargetBase): pass
register_target(PPC64Target)