summaryrefslogtreecommitdiff
path: root/overlay/mgdb/gdb/amd64-winnt-tdep.c
blob: f6636770eb29408a67e7ef065949b07ca7acd5ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/***************************************************************/
/*  mgdb: midipix-specific bits for gdb                        */
/*  Copyright (C) 2019  Z. Gilboa                              */
/*  Released under GPLv2 and GPLv3; see COPYING.MGDB.          */
/***************************************************************/

#include "defs.h"
#include "osabi.h"
#include "regcache.h"
#include "frame-unwind.h"
#include "windows-tdep.h"
#include "amd64-windows-tdep.c"

#include <signal.h>
#include <sys/debug.h>

#define amd64_winnt_push_dummy_call		amd64_windows_push_dummy_call
#define amd64_winnt_return_value		amd64_windows_return_value
#define amd64_winnt_skip_trampoline_code	amd64_windows_skip_trampoline_code

#define amd64_winnt_skip_prologue               amd64_windows_skip_prologue
#define amd64_winnt_skip_main_prologue		amd64_skip_main_prologue
#define amd64_winnt_frame_unwind                amd64_windows_frame_unwind

struct regcache;

static void amd64_winnt_supply_reg(
	struct regcache * rcache,
	int regnum, uintptr_t regval)
{
	regcache_raw_supply(rcache,regnum,&regval);
}

static void amd64_winnt_supply_pc_regs(
	struct regcache * rcache,
	mcontext_t * regctx)
{
	amd64_winnt_supply_reg(rcache,AMD64_RIP_REGNUM,regctx->uc_rip);
}

int amd64_winnt_fetch_registers(
	int pfd, struct regcache * rcache,
	int regnum, pid_t tid)
{
	int ret;
	mcontext_t regctx;

	if ((ret = __dbg_regs_fetch(pfd,tid,&regctx)) < 0)
		return ret;

	if (regnum == AMD64_RIP_REGNUM)
		amd64_winnt_supply_pc_regs(rcache,&regctx);

	return 0;
}

static void amd64_winnt_init_abi (struct gdbarch_info info, struct gdbarch * gdbarch)
{
	/* abi */
	amd64_init_abi                    (info, gdbarch);
	windows_init_abi                  (info, gdbarch);

	/* out-of-band function calls */
	set_gdbarch_push_dummy_call       (gdbarch, amd64_winnt_push_dummy_call);
	set_gdbarch_return_value          (gdbarch, amd64_winnt_return_value);
	set_gdbarch_skip_trampoline_code  (gdbarch, amd64_winnt_skip_trampoline_code);

	/* skip prologue methods */
	set_gdbarch_skip_prologue         (gdbarch, amd64_windows_skip_prologue);
	set_gdbarch_skip_main_prologue    (gdbarch, amd64_skip_main_prologue);

	/* todo: SEH unwinder */
	frame_unwind_append_unwinder      (gdbarch, &amd64_winnt_frame_unwind);

	/* todo: inferior-specific, dynamically detected size of long */
	set_gdbarch_long_bit              (gdbarch, 64);
}

extern initialize_file_ftype _initialize_amd64_winnt_tdep;

void
_initialize_amd64_winnt_tdep (void)
{
	gdbarch_register_osabi(
		bfd_arch_i386,
		bfd_mach_x86_64,
		GDB_OSABI_WINNT,
		amd64_winnt_init_abi);
}