/* GNU/Linux S/390 specific low level interface, for the remote server
for GDB.
- Copyright (C) 2001-2018 Free Software Foundation, Inc.
+ Copyright (C) 2001-2019 Free Software Foundation, Inc.
This file is part of GDB.
}
}
-/* Get HWCAP from AUXV, using the given WORDSIZE. Return the HWCAP, or
- zero if not found. */
-
-static unsigned long
-s390_get_hwcap (int wordsize)
-{
- gdb_byte *data = (gdb_byte *) alloca (2 * wordsize);
- int offset = 0;
-
- while ((*the_target->read_auxv) (offset, data, 2 * wordsize) == 2 * wordsize)
- {
- if (wordsize == 4)
- {
- unsigned int *data_p = (unsigned int *)data;
- if (data_p[0] == AT_HWCAP)
- return data_p[1];
- }
- else
- {
- unsigned long *data_p = (unsigned long *)data;
- if (data_p[0] == AT_HWCAP)
- return data_p[1];
- }
-
- offset += 2 * wordsize;
- }
-
- return 0;
-}
-
/* Determine the word size for the given PID, in bytes. */
#ifdef __s390x__
PTRACE_XFER_TYPE pswm = ptrace (PTRACE_PEEKUSER, pid,
(PTRACE_TYPE_ARG3) 0,
(PTRACE_TYPE_ARG4) 0);
- if (errno != 0) {
- warning (_("Couldn't determine word size, assuming 64-bit.\n"));
- return 8;
- }
+ if (errno != 0)
+ {
+ warning (_("Couldn't determine word size, assuming 64-bit."));
+ return 8;
+ }
/* Derive word size from extended addressing mode (PSW bit 31). */
return pswm & (1L << 32) ? 8 : 4;
}
/* Determine word size and HWCAP. */
int pid = pid_of (current_thread);
int wordsize = s390_get_wordsize (pid);
- unsigned long hwcap = s390_get_hwcap (wordsize);
+ unsigned long hwcap = linux_get_hwcap (wordsize);
/* Check whether the kernel supports extra register sets. */
int have_regset_last_break
return S390_TDESC_VX;
if (tdesc == tdesc_s390x_tevx_linux64)
return S390_TDESC_TEVX;
+ if (tdesc == tdesc_s390x_gs_linux64)
+ return S390_TDESC_GS;
#endif
if (tdesc == tdesc_s390_linux32)
return S390_TDESC_VX;
if (tdesc == tdesc_s390_tevx_linux64)
return S390_TDESC_TEVX;
+ if (tdesc == tdesc_s390_gs_linux64)
+ return S390_TDESC_GS;
return 0;
}
s390_emit_ext (int arg)
{
unsigned char buf[] = {
- 0x8d, 0x20, 0x00, 64 - arg, /* sldl %r2, <64-arg> */
- 0x8e, 0x20, 0x00, 64 - arg, /* srda %r2, <64-arg> */
+ 0x8d, 0x20, 0x00, (unsigned char) (64 - arg), /* sldl %r2, <64-arg> */
+ 0x8e, 0x20, 0x00, (unsigned char) (64 - arg), /* srda %r2, <64-arg> */
};
add_insns (buf, sizeof buf);
}
0x07, 0x07,
};
unsigned char buf[] = {
- 0xa7, 0x15, 0x00, (size + 4) / 2, /* bras %r1, .Lend+size */
+ 0xa7, 0x15, 0x00,
+ (unsigned char) ((size + 4) / 2), /* bras %r1, .Lend+size */
/* .Lend: */
};
if (size == 4)
{
unsigned long long n = num;
unsigned char buf_s[] = {
- 0xa7, 0x38, num >> 8, num, /* lhi %r3, <num> */
- 0x17, 0x22, /* xr %r2, %r2 */
+ /* lhi %r3, <num> */
+ 0xa7, 0x38,
+ (unsigned char) (num >> 8), (unsigned char) num,
+ /* xr %r2, %r2 */
+ 0x17, 0x22,
};
static const unsigned char buf_l[] = {
0x98, 0x23, 0x10, 0x00, /* lm %r2, %r3, 0(%r1) */
s390_emit_reg (int reg)
{
unsigned char bufpre[] = {
- 0x18, 0x29, /* lr %r2, %r9 */
- 0xa7, 0x38, reg >> 8, reg, /* lhi %r3, <reg> */
+ /* lr %r2, %r9 */
+ 0x18, 0x29,
+ /* lhi %r3, <reg> */
+ 0xa7, 0x38, (unsigned char) (reg >> 8), (unsigned char) reg,
};
add_insns (bufpre, sizeof bufpre);
s390_emit_call (get_raw_reg_func_addr ());
s390_emit_zero_ext (int arg)
{
unsigned char buf[] = {
- 0x8d, 0x20, 0x00, 64 - arg, /* sldl %r2, <64-arg> */
- 0x8c, 0x20, 0x00, 64 - arg, /* srdl %r2, <64-arg> */
+ 0x8d, 0x20, 0x00, (unsigned char) (64 - arg), /* sldl %r2, <64-arg> */
+ 0x8c, 0x20, 0x00, (unsigned char) (64 - arg), /* srdl %r2, <64-arg> */
};
add_insns (buf, sizeof buf);
}
s390_emit_stack_adjust (int n)
{
unsigned char buf[] = {
- 0xa7, 0xfa, n * 8 >> 8, n * 8, /* ahi %r15, 8*n */
+ /* ahi %r15, 8*n */
+ 0xa7, 0xfa,
+ (unsigned char ) (n * 8 >> 8), (unsigned char) (n * 8),
};
add_insns (buf, sizeof buf);
}
s390_emit_set_r2 (int arg1)
{
unsigned char buf_s[] = {
- 0xa7, 0x28, arg1 >> 8, arg1, /* lhi %r2, <arg1> */
+ /* lhi %r2, <arg1> */
+ 0xa7, 0x28, (unsigned char) (arg1 >> 8), (unsigned char) arg1,
};
static const unsigned char buf_l[] = {
0x58, 0x20, 0x10, 0x00, /* l %r2, 0(%r1) */
s390x_emit_ext (int arg)
{
unsigned char buf[] = {
- 0xeb, 0x22, 0x00, 64 - arg, 0x00, 0x0d, /* sllg %r2, %r2, <64-arg> */
- 0xeb, 0x22, 0x00, 64 - arg, 0x00, 0x0a, /* srag %r2, %r2, <64-arg> */
+ /* sllg %r2, %r2, <64-arg> */
+ 0xeb, 0x22, 0x00, (unsigned char) (64 - arg), 0x00, 0x0d,
+ /* srag %r2, %r2, <64-arg> */
+ 0xeb, 0x22, 0x00, (unsigned char) (64 - arg), 0x00, 0x0a,
};
add_insns (buf, sizeof buf);
}
{
unsigned long long n = num;
unsigned char buf_s[] = {
- 0xa7, 0x29, num >> 8, num, /* lghi %r2, <num> */
+ /* lghi %r2, <num> */
+ 0xa7, 0x29, (unsigned char) (num >> 8), (unsigned char) num,
};
static const unsigned char buf_l[] = {
0xe3, 0x20, 0x10, 0x00, 0x00, 0x04, /* lg %r2, 0(%r1) */
s390x_emit_reg (int reg)
{
unsigned char buf[] = {
- 0xb9, 0x04, 0x00, 0x29, /* lgr %r2, %r9 */
- 0xa7, 0x39, reg >> 8, reg, /* lghi %r3, <reg> */
+ /* lgr %r2, %r9 */
+ 0xb9, 0x04, 0x00, 0x29,
+ /* lghi %r3, <reg> */
+ 0xa7, 0x39, (unsigned char) (reg >> 8), (unsigned char) reg,
};
add_insns (buf, sizeof buf);
s390x_emit_call (get_raw_reg_func_addr ());
s390x_emit_zero_ext (int arg)
{
unsigned char buf[] = {
- 0xeb, 0x22, 0x00, 64 - arg, 0x00, 0x0d, /* sllg %r2, %r2, <64-arg> */
- 0xeb, 0x22, 0x00, 64 - arg, 0x00, 0x0c, /* srlg %r2, %r2, <64-arg> */
+ /* sllg %r2, %r2, <64-arg> */
+ 0xeb, 0x22, 0x00, (unsigned char) (64 - arg), 0x00, 0x0d,
+ /* srlg %r2, %r2, <64-arg> */
+ 0xeb, 0x22, 0x00, (unsigned char) (64 - arg), 0x00, 0x0c,
};
add_insns (buf, sizeof buf);
}
s390x_emit_stack_adjust (int n)
{
unsigned char buf[] = {
- 0xa7, 0xfb, n * 8 >> 8, n * 8, /* aghi %r15, 8*n */
+ /* aghi %r15, 8*n */
+ 0xa7, 0xfb,
+ (unsigned char) (n * 8 >> 8), (unsigned char) (n * 8),
};
add_insns (buf, sizeof buf);
}