+/* Supply register REGNUM from the buffer specified by GREGS and LEN
+ in the general-purpose register set REGSET to register cache
+ REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
+
+static void
+alpha_linux_supply_gregset (const struct regset *regset,
+ struct regcache *regcache,
+ int regnum, const void *gregs, size_t len)
+{
+ const gdb_byte *regs = gregs;
+ int i;
+ gdb_assert (len >= 32 * 8);
+
+ for (i = 0; i < ALPHA_ZERO_REGNUM; i++)
+ {
+ if (regnum == i || regnum == -1)
+ regcache_raw_supply (regcache, i, regs + i * 8);
+ }
+
+ if (regnum == ALPHA_PC_REGNUM || regnum == -1)
+ regcache_raw_supply (regcache, ALPHA_PC_REGNUM, regs + 31 * 8);
+
+ if (regnum == ALPHA_UNIQUE_REGNUM || regnum == -1)
+ regcache_raw_supply (regcache, ALPHA_UNIQUE_REGNUM,
+ len >= 33 * 8 ? regs + 32 * 8 : NULL);
+}
+
+/* Supply register REGNUM from the buffer specified by FPREGS and LEN
+ in the floating-point register set REGSET to register cache
+ REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
+
+static void
+alpha_linux_supply_fpregset (const struct regset *regset,
+ struct regcache *regcache,
+ int regnum, const void *fpregs, size_t len)
+{
+ const gdb_byte *regs = fpregs;
+ int i;
+ gdb_assert (len >= 32 * 8);
+
+ for (i = ALPHA_FP0_REGNUM; i < ALPHA_FP0_REGNUM + 31; i++)
+ {
+ if (regnum == i || regnum == -1)
+ regcache_raw_supply (regcache, i, regs + (i - ALPHA_FP0_REGNUM) * 8);
+ }
+
+ if (regnum == ALPHA_FPCR_REGNUM || regnum == -1)
+ regcache_raw_supply (regcache, ALPHA_FPCR_REGNUM, regs + 31 * 8);
+}
+
+static struct regset alpha_linux_gregset =
+{
+ NULL,
+ alpha_linux_supply_gregset
+};
+
+static struct regset alpha_linux_fpregset =
+{
+ NULL,
+ alpha_linux_supply_fpregset
+};
+
+/* Return the appropriate register set for the core section identified
+ by SECT_NAME and SECT_SIZE. */
+
+static const struct regset *
+alpha_linux_regset_from_core_section (struct gdbarch *gdbarch,
+ const char *sect_name, size_t sect_size)
+{
+ if (strcmp (sect_name, ".reg") == 0 && sect_size >= 32 * 8)
+ return &alpha_linux_gregset;
+
+ if (strcmp (sect_name, ".reg2") == 0 && sect_size >= 32 * 8)
+ return &alpha_linux_fpregset;
+
+ return NULL;
+}
+
+/* Implementation of `gdbarch_gdb_signal_from_target', as defined in
+ gdbarch.h. */
+
+static enum gdb_signal
+alpha_linux_gdb_signal_from_target (struct gdbarch *gdbarch,
+ int signal)
+{
+ switch (signal)
+ {
+ case ALPHA_LINUX_SIGEMT:
+ return GDB_SIGNAL_EMT;
+
+ case ALPHA_LINUX_SIGBUS:
+ return GDB_SIGNAL_BUS;
+
+ case ALPHA_LINUX_SIGSYS:
+ return GDB_SIGNAL_SYS;
+
+ case ALPHA_LINUX_SIGURG:
+ return GDB_SIGNAL_URG;
+
+ case ALPHA_LINUX_SIGSTOP:
+ return GDB_SIGNAL_STOP;
+
+ case ALPHA_LINUX_SIGTSTP:
+ return GDB_SIGNAL_TSTP;
+
+ case ALPHA_LINUX_SIGCONT:
+ return GDB_SIGNAL_CONT;
+
+ case ALPHA_LINUX_SIGCHLD:
+ return GDB_SIGNAL_CHLD;
+
+ /* No way to differentiate between SIGIO and SIGPOLL.
+ Therefore, we just handle the first one. */
+ case ALPHA_LINUX_SIGIO:
+ return GDB_SIGNAL_IO;
+
+ /* No way to differentiate between SIGINFO and SIGPWR.
+ Therefore, we just handle the first one. */
+ case ALPHA_LINUX_SIGINFO:
+ return GDB_SIGNAL_INFO;
+
+ case ALPHA_LINUX_SIGUSR1:
+ return GDB_SIGNAL_USR1;
+
+ case ALPHA_LINUX_SIGUSR2:
+ return GDB_SIGNAL_USR2;
+ }
+
+ return linux_gdb_signal_from_target (gdbarch, signal);
+}
+
+/* Implementation of `gdbarch_gdb_signal_to_target', as defined in
+ gdbarch.h. */
+
+static int
+alpha_linux_gdb_signal_to_target (struct gdbarch *gdbarch,
+ enum gdb_signal signal)
+{
+ switch (signal)
+ {
+ case GDB_SIGNAL_EMT:
+ return ALPHA_LINUX_SIGEMT;
+
+ case GDB_SIGNAL_BUS:
+ return ALPHA_LINUX_SIGBUS;
+
+ case GDB_SIGNAL_SYS:
+ return ALPHA_LINUX_SIGSYS;
+
+ case GDB_SIGNAL_URG:
+ return ALPHA_LINUX_SIGURG;
+
+ case GDB_SIGNAL_STOP:
+ return ALPHA_LINUX_SIGSTOP;
+
+ case GDB_SIGNAL_TSTP:
+ return ALPHA_LINUX_SIGTSTP;
+
+ case GDB_SIGNAL_CONT:
+ return ALPHA_LINUX_SIGCONT;
+
+ case GDB_SIGNAL_CHLD:
+ return ALPHA_LINUX_SIGCHLD;
+
+ case GDB_SIGNAL_IO:
+ return ALPHA_LINUX_SIGIO;
+
+ case GDB_SIGNAL_INFO:
+ return ALPHA_LINUX_SIGINFO;
+
+ case GDB_SIGNAL_USR1:
+ return ALPHA_LINUX_SIGUSR1;
+
+ case GDB_SIGNAL_USR2:
+ return ALPHA_LINUX_SIGUSR2;
+
+ case GDB_SIGNAL_POLL:
+ return ALPHA_LINUX_SIGPOLL;
+
+ case GDB_SIGNAL_PWR:
+ return ALPHA_LINUX_SIGPWR;
+ }
+
+ return linux_gdb_signal_to_target (gdbarch, signal);
+}
+