mirror of
https://github.com/radareorg/radare2.git
synced 2024-11-25 06:09:50 +00:00
176 lines
4.1 KiB
C
176 lines
4.1 KiB
C
// Copyright (c) 2014, The Lemon Man, All rights reserved.
|
|
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// version 3.0 of the License, or (at your option) any later version.
|
|
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Lesser General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library.
|
|
|
|
// Some documentation of the data structures has been kindly ripped off ReactOS project.
|
|
|
|
#ifndef KD_H
|
|
#define KD_H
|
|
|
|
enum {
|
|
KD_E_OK = 0,
|
|
KD_E_BADCHKSUM = -1,
|
|
KD_E_TIMEOUT = -2,
|
|
KD_E_MALFORMED = -3,
|
|
KD_E_IOERR = -4,
|
|
};
|
|
|
|
#define KD_PACKET_DATA 0x30303030
|
|
#define KD_PACKET_CTRL 0x69696969
|
|
|
|
#define KD_MAX_PAYLOAD 0x800
|
|
|
|
#define KD_PACKET_TYPE_MANIP 2
|
|
#define KD_PACKET_TYPE_ACK 4
|
|
#define KD_PACKET_TYPE_RESEND 5
|
|
#define KD_PACKET_TYPE_RESET 6
|
|
#define KD_PACKET_TYPE_STATE_CHANGE 7
|
|
#define KD_PACKET_TYPE_IO 11
|
|
|
|
// http://msdn.microsoft.com/en-us/library/cc704588.aspx
|
|
#define KD_RET_OK 0x00000000
|
|
#define KD_RET_ERR 0xC0000001
|
|
#define KD_RET_ENOENT 0xC000000F
|
|
#define KD_DBG_CONT 0x00010001
|
|
|
|
#define KD_MACH_I386 0x014C
|
|
#define KD_MACH_IA64 0x0200
|
|
#define KD_MACH_AMD64 0x8664
|
|
#define KD_MACH_ARM 0x01c0
|
|
#define KD_MACH_EBC 0x0EBC
|
|
|
|
#define DBGKD_VERS_FLAG_DATA 0x0002
|
|
#define DBGKD_VERS_FLAG_PTR64 0x0004
|
|
|
|
typedef struct kd_req_t {
|
|
uint32_t req;
|
|
uint16_t cpu_level;
|
|
uint16_t cpu;
|
|
uint32_t ret;
|
|
// Pad to 16-byte boundary (?)
|
|
uint32_t pad;
|
|
union {
|
|
struct {
|
|
uint64_t addr;
|
|
uint32_t length;
|
|
uint32_t read;
|
|
} __attribute__((packed)) r_mem;
|
|
struct {
|
|
uint16_t major;
|
|
uint16_t minor;
|
|
uint8_t proto_major;
|
|
uint8_t proto_minor;
|
|
uint16_t flags;
|
|
uint16_t machine;
|
|
uint8_t misc[6];
|
|
uint64_t kernel_base;
|
|
uint64_t mod_addr;
|
|
uint64_t dbg_addr;
|
|
} __attribute__((packed)) r_ver;
|
|
struct {
|
|
uint32_t reason;
|
|
uint32_t tf;
|
|
uint32_t dr7;
|
|
uint32_t css;
|
|
uint32_t cse;
|
|
} r_cont;
|
|
struct {
|
|
uint64_t addr;
|
|
uint32_t handle;
|
|
} r_set_bp;
|
|
struct {
|
|
uint32_t handle;
|
|
} r_del_bp;
|
|
struct {
|
|
uint64_t addr;
|
|
uint32_t flags;
|
|
} r_set_ibp;
|
|
struct {
|
|
uint64_t addr;
|
|
uint32_t flags;
|
|
uint32_t calls;
|
|
} r_get_ibp;
|
|
struct {
|
|
uint32_t flags;
|
|
} r_ctx;
|
|
struct {
|
|
uint64_t addr;
|
|
uint64_t reserved;
|
|
uint32_t address_space;
|
|
uint32_t flags;
|
|
} r_query_mem;
|
|
|
|
// Pad the struct to 56 bytes
|
|
uint8_t raw[40];
|
|
};
|
|
uint8_t data[0];
|
|
} __attribute__((packed)) kd_req_t;
|
|
|
|
#define KD_EXC_BKPT 0x80000003
|
|
|
|
typedef struct kd_stc_64 {
|
|
uint32_t state;
|
|
uint16_t cpu_level;
|
|
uint16_t cpu;
|
|
uint32_t cpu_count;
|
|
uint32_t pad1;
|
|
uint64_t kthread;
|
|
uint64_t pc;
|
|
union {
|
|
struct {
|
|
uint32_t code;
|
|
uint32_t flags;
|
|
uint64_t ex_record;
|
|
uint64_t ex_addr;
|
|
} __attribute__((packed)) exception;
|
|
};
|
|
} __attribute__((packed)) kd_stc_64;
|
|
|
|
typedef struct kd_ioc_t {
|
|
uint32_t req;
|
|
uint32_t ret;
|
|
uint64_t pad[7];
|
|
} kd_ioc_t;
|
|
|
|
typedef struct kd_packet_t {
|
|
uint32_t leader;
|
|
uint16_t type;
|
|
uint16_t length;
|
|
uint32_t id;
|
|
uint32_t checksum;
|
|
uint8_t data[0];
|
|
} __attribute__((packed)) kd_packet_t;
|
|
|
|
// Compile time assertions macros taken from :
|
|
// http://www.pixelbeat.org/programming/gcc/static_assert.html
|
|
#define ASSERT_CONCAT_(a, b) a##b
|
|
#define ASSERT_CONCAT(a, b) ASSERT_CONCAT_(a, b)
|
|
#define ct_assert(e) enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/(!!(e)) }
|
|
|
|
ct_assert(sizeof(kd_packet_t)==16);
|
|
ct_assert(sizeof(kd_req_t)==56);
|
|
ct_assert(sizeof(kd_ioc_t)==64);
|
|
|
|
int kd_send_ctrl_packet (void *fp, const uint32_t type, const uint32_t id);
|
|
int kd_send_data_packet (void *fp, const uint32_t type, const uint32_t id, const uint8_t *req, const int req_len, const uint8_t *buf, const uint32_t buf_len);
|
|
|
|
int kd_read_packet (void *fp, kd_packet_t **p);
|
|
|
|
int kd_packet_is_valid (const kd_packet_t *p);
|
|
int kd_packet_is_ack (const kd_packet_t *p);
|
|
|
|
uint32_t kd_data_checksum (const uint8_t *buf, const uint64_t buf_len);
|
|
|
|
#endif
|