binutils-gdb/gdbserver/lynx-ppc-low.c
Tom Tromey 919adfe840 Move gdbserver to top level
This patch moves gdbserver to the top level.

This patch is as close to a pure move as possible -- gdbserver still
builds its own variant of gnulib and gdbsupport.  Changing this will
be done in a separate patch.

[v2] Note that, per Simon's review comment, this patch changes the
tree so that gdbserver is not built for or1k or score.  This makes
sense, because there is apparently not actually a gdbserver port here.

[v3] This version of the patch also splits out some configury into a
new file, gdbserver/configure.host, so that the top-level configure
script can simply rely on it in order to decide whether gdbserver
should be built.

[v4] This version adds documentation and removes some unnecessary
top-level dependencies.

[v5] Update docs to mention "make all-gdbserver" and change how
top-level configure decides whether to build gdbserver, switching to a
single, shared script.

Tested by the buildbot.

ChangeLog
2020-02-07  Tom Tromey  <tom@tromey.com>
	    Pedro Alves  <palves@redhat.com>

	* src-release.sh (GDB_SUPPORT_DIRS): Add gdbserver.
	* gdbserver: New directory, moved from gdb/gdbserver.
	* configure.ac (host_tools): Add gdbserver.
	Only build gdbserver on certain systems.
	* Makefile.in, configure: Rebuild.
	* Makefile.def (host_modules, dependencies): Add gdbserver.
	* MAINTAINERS: Add gdbserver.

gdb/ChangeLog
2020-02-07  Tom Tromey  <tom@tromey.com>

	* README: Update gdbserver documentation.
	* gdbserver: Move to top level.
	* configure.tgt (build_gdbserver): Remove.
	* configure.ac: Remove --enable-gdbserver.
	* configure: Rebuild.
	* Makefile.in (distclean): Don't mention gdbserver.

Change-Id: I826b7565b54604711dc7a11edea0499cd51ff39e
2020-02-07 08:42:25 -07:00

186 lines
5.8 KiB
C

/* Copyright (C) 2009-2020 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program 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 General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "server.h"
#include "lynx-low.h"
#include <limits.h>
#include <sys/ptrace.h>
/* The following two typedefs are defined in a .h file which is not
in the standard include path (/sys/include/family/ppc/ucontext.h),
so we just duplicate them here. */
/* General register context */
typedef struct usr_econtext_s
{
uint32_t uec_iregs[32];
uint32_t uec_inum;
uint32_t uec_srr0;
uint32_t uec_srr1;
uint32_t uec_lr;
uint32_t uec_ctr;
uint32_t uec_cr;
uint32_t uec_xer;
uint32_t uec_dar;
uint32_t uec_mq;
uint32_t uec_msr;
uint32_t uec_sregs[16];
uint32_t uec_ss_count;
uint32_t uec_ss_addr1;
uint32_t uec_ss_addr2;
uint32_t uec_ss_code1;
uint32_t uec_ss_code2;
} usr_econtext_t;
/* Floating point register context */
typedef struct usr_fcontext_s
{
uint64_t ufc_freg[32];
uint32_t ufc_fpscr[2];
} usr_fcontext_t;
/* Index of for various registers inside the regcache. */
#define R0_REGNUM 0
#define F0_REGNUM 32
#define PC_REGNUM 64
#define MSR_REGNUM 65
#define CR_REGNUM 66
#define LR_REGNUM 67
#define CTR_REGNUM 68
#define XER_REGNUM 69
#define FPSCR_REGNUM 70
/* Defined in auto-generated file powerpc-32.c. */
extern void init_registers_powerpc_32 (void);
extern const struct target_desc *tdesc_powerpc_32;
/* The fill_function for the general-purpose register set. */
static void
lynx_ppc_fill_gregset (struct regcache *regcache, char *buf)
{
int i;
/* r0 - r31 */
for (i = 0; i < 32; i++)
collect_register (regcache, R0_REGNUM + i,
buf + offsetof (usr_econtext_t, uec_iregs[i]));
/* The other registers provided in the GP register context. */
collect_register (regcache, PC_REGNUM,
buf + offsetof (usr_econtext_t, uec_srr0));
collect_register (regcache, MSR_REGNUM,
buf + offsetof (usr_econtext_t, uec_srr1));
collect_register (regcache, CR_REGNUM,
buf + offsetof (usr_econtext_t, uec_cr));
collect_register (regcache, LR_REGNUM,
buf + offsetof (usr_econtext_t, uec_lr));
collect_register (regcache, CTR_REGNUM,
buf + offsetof (usr_econtext_t, uec_ctr));
collect_register (regcache, XER_REGNUM,
buf + offsetof (usr_econtext_t, uec_xer));
}
/* The store_function for the general-purpose register set. */
static void
lynx_ppc_store_gregset (struct regcache *regcache, const char *buf)
{
int i;
/* r0 - r31 */
for (i = 0; i < 32; i++)
supply_register (regcache, R0_REGNUM + i,
buf + offsetof (usr_econtext_t, uec_iregs[i]));
/* The other registers provided in the GP register context. */
supply_register (regcache, PC_REGNUM,
buf + offsetof (usr_econtext_t, uec_srr0));
supply_register (regcache, MSR_REGNUM,
buf + offsetof (usr_econtext_t, uec_srr1));
supply_register (regcache, CR_REGNUM,
buf + offsetof (usr_econtext_t, uec_cr));
supply_register (regcache, LR_REGNUM,
buf + offsetof (usr_econtext_t, uec_lr));
supply_register (regcache, CTR_REGNUM,
buf + offsetof (usr_econtext_t, uec_ctr));
supply_register (regcache, XER_REGNUM,
buf + offsetof (usr_econtext_t, uec_xer));
}
/* The fill_function for the floating-point register set. */
static void
lynx_ppc_fill_fpregset (struct regcache *regcache, char *buf)
{
int i;
/* f0 - f31 */
for (i = 0; i < 32; i++)
collect_register (regcache, F0_REGNUM + i,
buf + offsetof (usr_fcontext_t, ufc_freg[i]));
/* fpscr */
collect_register (regcache, FPSCR_REGNUM,
buf + offsetof (usr_fcontext_t, ufc_fpscr));
}
/* The store_function for the floating-point register set. */
static void
lynx_ppc_store_fpregset (struct regcache *regcache, const char *buf)
{
int i;
/* f0 - f31 */
for (i = 0; i < 32; i++)
supply_register (regcache, F0_REGNUM + i,
buf + offsetof (usr_fcontext_t, ufc_freg[i]));
/* fpscr */
supply_register (regcache, FPSCR_REGNUM,
buf + offsetof (usr_fcontext_t, ufc_fpscr));
}
/* Implements the lynx_target_ops.arch_setup routine. */
static void
lynx_ppc_arch_setup (void)
{
init_registers_powerpc_32 ();
lynx_tdesc = tdesc_powerpc_32;
}
/* Description of all the powerpc-lynx register sets. */
struct lynx_regset_info lynx_target_regsets[] = {
/* General Purpose Registers. */
{PTRACE_GETREGS, PTRACE_SETREGS, sizeof(usr_econtext_t),
lynx_ppc_fill_gregset, lynx_ppc_store_gregset},
/* Floating Point Registers. */
{ PTRACE_GETFPREGS, PTRACE_SETFPREGS, sizeof(usr_fcontext_t),
lynx_ppc_fill_fpregset, lynx_ppc_store_fpregset },
/* End of list marker. */
{0, 0, -1, NULL, NULL }
};
/* The lynx_target_ops vector for powerpc-lynxos. */
struct lynx_target_ops the_low_target = {
lynx_ppc_arch_setup,
};