//===-- NativeRegisterContextLinux.h ----------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef lldb_NativeRegisterContextLinux_h
#define lldb_NativeRegisterContextLinux_h

#include "lldb/Host/common/NativeRegisterContextRegisterInfo.h"
#include "lldb/Host/common/NativeThreadProtocol.h"

#include "Plugins/Process/Linux/NativeProcessLinux.h"

namespace lldb_private {
namespace process_linux {

class NativeRegisterContextLinux : public NativeRegisterContextRegisterInfo
{
public:
    NativeRegisterContextLinux(NativeThreadProtocol &native_thread,
                               uint32_t concrete_frame_idx,
                               RegisterInfoInterface *reg_info_interface_p);

    // This function is implemented in the NativeRegisterContextLinux_* subclasses to create a new
    // instance of the host specific NativeRegisterContextLinux. The implementations can't collide
    // as only one NativeRegisterContextLinux_* variant should be compiled into the final
    // executable.
    static NativeRegisterContextLinux*
    CreateHostNativeRegisterContextLinux(const ArchSpec& target_arch,
                                         NativeThreadProtocol &native_thread,
                                         uint32_t concrete_frame_idx);

protected:
    lldb::ByteOrder
    GetByteOrder() const;

    virtual Error
    ReadRegisterRaw(uint32_t reg_index, RegisterValue& reg_value);

    virtual Error
    WriteRegisterRaw(uint32_t reg_index, const RegisterValue& reg_value);

    virtual Error
    ReadRegisterSet(void *buf, size_t buf_size, unsigned int regset);

    virtual Error
    WriteRegisterSet(void *buf, size_t buf_size, unsigned int regset);

    virtual Error
    ReadGPR();

    virtual Error
    WriteGPR();

    virtual Error
    ReadFPR();

    virtual Error
    WriteFPR();

    virtual void*
    GetGPRBuffer() { return nullptr; }

    virtual size_t
    GetGPRSize() { return GetRegisterInfoInterface().GetGPRSize(); }

    virtual void*
    GetFPRBuffer() { return nullptr; }

    virtual size_t
    GetFPRSize() { return 0; }


    // The Do*** functions are executed on the privileged thread and can perform ptrace
    // operations directly.
    virtual Error
    DoReadRegisterValue(uint32_t offset,
                        const char* reg_name,
                        uint32_t size,
                        RegisterValue &value);

    virtual Error
    DoWriteRegisterValue(uint32_t offset,
                       const char* reg_name,
                       const RegisterValue &value);

    virtual Error
    DoReadGPR(void *buf, size_t buf_size);

    virtual Error
    DoWriteGPR(void *buf, size_t buf_size);

    virtual Error
    DoReadFPR(void *buf, size_t buf_size);

    virtual Error
    DoWriteFPR(void *buf, size_t buf_size);
};

} // namespace process_linux
} // namespace lldb_private

#endif // #ifndef lldb_NativeRegisterContextLinux_h
