Home | History | Annotate | Line # | Download | only in gdb
      1   1.1  christos /* GNU/Linux on ARM target support.
      2   1.1  christos 
      3  1.11  christos    Copyright (C) 1999-2024 Free Software Foundation, Inc.
      4   1.1  christos 
      5   1.1  christos    This file is part of GDB.
      6   1.1  christos 
      7   1.1  christos    This program is free software; you can redistribute it and/or modify
      8   1.1  christos    it under the terms of the GNU General Public License as published by
      9   1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10   1.1  christos    (at your option) any later version.
     11   1.1  christos 
     12   1.1  christos    This program is distributed in the hope that it will be useful,
     13   1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14   1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15   1.1  christos    GNU General Public License for more details.
     16   1.1  christos 
     17   1.1  christos    You should have received a copy of the GNU General Public License
     18   1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19   1.1  christos 
     20  1.11  christos #include "extract-store-integer.h"
     21   1.1  christos #include "target.h"
     22   1.1  christos #include "value.h"
     23   1.1  christos #include "gdbtypes.h"
     24   1.1  christos #include "gdbcore.h"
     25   1.1  christos #include "frame.h"
     26   1.1  christos #include "regcache.h"
     27   1.1  christos #include "solib-svr4.h"
     28   1.1  christos #include "osabi.h"
     29   1.1  christos #include "regset.h"
     30   1.1  christos #include "trad-frame.h"
     31   1.1  christos #include "tramp-frame.h"
     32   1.1  christos #include "breakpoint.h"
     33   1.1  christos #include "auxv.h"
     34   1.1  christos #include "xml-syscall.h"
     35  1.10  christos #include "expop.h"
     36   1.1  christos 
     37   1.9  christos #include "aarch32-tdep.h"
     38   1.6  christos #include "arch/arm.h"
     39   1.6  christos #include "arch/arm-get-next-pcs.h"
     40   1.6  christos #include "arch/arm-linux.h"
     41   1.1  christos #include "arm-tdep.h"
     42   1.1  christos #include "arm-linux-tdep.h"
     43   1.1  christos #include "linux-tdep.h"
     44   1.1  christos #include "glibc-tdep.h"
     45   1.1  christos #include "arch-utils.h"
     46   1.1  christos #include "inferior.h"
     47   1.3  christos #include "infrun.h"
     48   1.1  christos #include "gdbthread.h"
     49   1.1  christos #include "symfile.h"
     50   1.1  christos 
     51   1.3  christos #include "record-full.h"
     52   1.3  christos #include "linux-record.h"
     53   1.3  christos 
     54   1.1  christos #include "cli/cli-utils.h"
     55   1.1  christos #include "stap-probe.h"
     56   1.1  christos #include "parser-defs.h"
     57   1.1  christos #include "user-regs.h"
     58   1.1  christos #include <ctype.h>
     59   1.1  christos #include "elf/common.h"
     60   1.1  christos 
     61   1.1  christos /* Under ARM GNU/Linux the traditional way of performing a breakpoint
     62   1.1  christos    is to execute a particular software interrupt, rather than use a
     63  1.11  christos    particular undefined instruction to provoke a trap.  Upon execution
     64   1.1  christos    of the software interrupt the kernel stops the inferior with a
     65   1.1  christos    SIGTRAP, and wakes the debugger.  */
     66   1.1  christos 
     67   1.1  christos static const gdb_byte arm_linux_arm_le_breakpoint[] = { 0x01, 0x00, 0x9f, 0xef };
     68   1.1  christos 
     69   1.1  christos static const gdb_byte arm_linux_arm_be_breakpoint[] = { 0xef, 0x9f, 0x00, 0x01 };
     70   1.1  christos 
     71   1.1  christos /* However, the EABI syscall interface (new in Nov. 2005) does not look at
     72   1.1  christos    the operand of the swi if old-ABI compatibility is disabled.  Therefore,
     73   1.1  christos    use an undefined instruction instead.  This is supported as of kernel
     74   1.1  christos    version 2.5.70 (May 2003), so should be a safe assumption for EABI
     75   1.1  christos    binaries.  */
     76   1.1  christos 
     77   1.1  christos static const gdb_byte eabi_linux_arm_le_breakpoint[] = { 0xf0, 0x01, 0xf0, 0xe7 };
     78   1.1  christos 
     79   1.1  christos static const gdb_byte eabi_linux_arm_be_breakpoint[] = { 0xe7, 0xf0, 0x01, 0xf0 };
     80   1.1  christos 
     81   1.1  christos /* All the kernels which support Thumb support using a specific undefined
     82   1.1  christos    instruction for the Thumb breakpoint.  */
     83   1.1  christos 
     84   1.1  christos static const gdb_byte arm_linux_thumb_be_breakpoint[] = {0xde, 0x01};
     85   1.1  christos 
     86   1.1  christos static const gdb_byte arm_linux_thumb_le_breakpoint[] = {0x01, 0xde};
     87   1.1  christos 
     88   1.1  christos /* Because the 16-bit Thumb breakpoint is affected by Thumb-2 IT blocks,
     89   1.1  christos    we must use a length-appropriate breakpoint for 32-bit Thumb
     90   1.1  christos    instructions.  See also thumb_get_next_pc.  */
     91   1.1  christos 
     92   1.1  christos static const gdb_byte arm_linux_thumb2_be_breakpoint[] = { 0xf7, 0xf0, 0xa0, 0x00 };
     93   1.1  christos 
     94   1.1  christos static const gdb_byte arm_linux_thumb2_le_breakpoint[] = { 0xf0, 0xf7, 0x00, 0xa0 };
     95   1.1  christos 
     96   1.1  christos /* Description of the longjmp buffer.  The buffer is treated as an array of
     97   1.1  christos    elements of size ARM_LINUX_JB_ELEMENT_SIZE.
     98   1.1  christos 
     99   1.1  christos    The location of saved registers in this buffer (in particular the PC
    100   1.1  christos    to use after longjmp is called) varies depending on the ABI (in
    101  1.12  christos    particular the FP model) and also (possibly) the C Library.  */
    102   1.9  christos #define ARM_LINUX_JB_ELEMENT_SIZE	ARM_INT_REGISTER_SIZE
    103  1.12  christos /* For the FPA model the PC is at offset 21 in the buffer.  */
    104   1.1  christos #define ARM_LINUX_JB_PC_FPA		21
    105  1.12  christos /* For glibc 2.20 and later the PC is at offset 1, see glibc commit 80a56cc3ee
    106  1.12  christos    ("ARM: Add SystemTap probes to longjmp and setjmp.").
    107  1.12  christos    For newlib and uclibc, this is not correct, we need osabi settings to deal
    108  1.12  christos    with those, see PR31854 and PR31856.  Likewise for older versions of
    109  1.12  christos    glibc.  */
    110  1.12  christos #define ARM_LINUX_JB_PC_EABI		1
    111   1.1  christos 
    112   1.1  christos /*
    113   1.1  christos    Dynamic Linking on ARM GNU/Linux
    114   1.1  christos    --------------------------------
    115   1.1  christos 
    116   1.1  christos    Note: PLT = procedure linkage table
    117   1.1  christos    GOT = global offset table
    118   1.1  christos 
    119   1.1  christos    As much as possible, ELF dynamic linking defers the resolution of
    120   1.1  christos    jump/call addresses until the last minute.  The technique used is
    121   1.1  christos    inspired by the i386 ELF design, and is based on the following
    122   1.1  christos    constraints.
    123   1.1  christos 
    124   1.1  christos    1) The calling technique should not force a change in the assembly
    125   1.1  christos    code produced for apps; it MAY cause changes in the way assembly
    126   1.1  christos    code is produced for position independent code (i.e. shared
    127   1.1  christos    libraries).
    128   1.1  christos 
    129   1.1  christos    2) The technique must be such that all executable areas must not be
    130   1.1  christos    modified; and any modified areas must not be executed.
    131   1.1  christos 
    132   1.1  christos    To do this, there are three steps involved in a typical jump:
    133   1.1  christos 
    134   1.1  christos    1) in the code
    135   1.1  christos    2) through the PLT
    136   1.1  christos    3) using a pointer from the GOT
    137   1.1  christos 
    138   1.1  christos    When the executable or library is first loaded, each GOT entry is
    139   1.1  christos    initialized to point to the code which implements dynamic name
    140   1.1  christos    resolution and code finding.  This is normally a function in the
    141   1.1  christos    program interpreter (on ARM GNU/Linux this is usually
    142   1.1  christos    ld-linux.so.2, but it does not have to be).  On the first
    143   1.1  christos    invocation, the function is located and the GOT entry is replaced
    144   1.1  christos    with the real function address.  Subsequent calls go through steps
    145   1.1  christos    1, 2 and 3 and end up calling the real code.
    146   1.1  christos 
    147   1.1  christos    1) In the code:
    148   1.1  christos 
    149   1.1  christos    b    function_call
    150   1.1  christos    bl   function_call
    151   1.1  christos 
    152   1.1  christos    This is typical ARM code using the 26 bit relative branch or branch
    153   1.1  christos    and link instructions.  The target of the instruction
    154   1.1  christos    (function_call is usually the address of the function to be called.
    155   1.1  christos    In position independent code, the target of the instruction is
    156   1.1  christos    actually an entry in the PLT when calling functions in a shared
    157   1.1  christos    library.  Note that this call is identical to a normal function
    158   1.1  christos    call, only the target differs.
    159   1.1  christos 
    160   1.1  christos    2) In the PLT:
    161   1.1  christos 
    162   1.1  christos    The PLT is a synthetic area, created by the linker.  It exists in
    163   1.1  christos    both executables and libraries.  It is an array of stubs, one per
    164   1.1  christos    imported function call.  It looks like this:
    165   1.1  christos 
    166   1.1  christos    PLT[0]:
    167   1.1  christos    str     lr, [sp, #-4]!       @push the return address (lr)
    168   1.1  christos    ldr     lr, [pc, #16]   @load from 6 words ahead
    169   1.1  christos    add     lr, pc, lr      @form an address for GOT[0]
    170   1.1  christos    ldr     pc, [lr, #8]!   @jump to the contents of that addr
    171   1.1  christos 
    172   1.1  christos    The return address (lr) is pushed on the stack and used for
    173   1.1  christos    calculations.  The load on the second line loads the lr with
    174   1.1  christos    &GOT[3] - . - 20.  The addition on the third leaves:
    175   1.1  christos 
    176   1.1  christos    lr = (&GOT[3] - . - 20) + (. + 8)
    177   1.1  christos    lr = (&GOT[3] - 12)
    178   1.1  christos    lr = &GOT[0]
    179   1.1  christos 
    180   1.1  christos    On the fourth line, the pc and lr are both updated, so that:
    181   1.1  christos 
    182   1.1  christos    pc = GOT[2]
    183   1.1  christos    lr = &GOT[0] + 8
    184   1.1  christos    = &GOT[2]
    185   1.1  christos 
    186   1.1  christos    NOTE: PLT[0] borrows an offset .word from PLT[1].  This is a little
    187   1.1  christos    "tight", but allows us to keep all the PLT entries the same size.
    188   1.1  christos 
    189   1.1  christos    PLT[n+1]:
    190   1.1  christos    ldr     ip, [pc, #4]    @load offset from gotoff
    191   1.1  christos    add     ip, pc, ip      @add the offset to the pc
    192   1.1  christos    ldr     pc, [ip]        @jump to that address
    193   1.1  christos    gotoff: .word   GOT[n+3] - .
    194   1.1  christos 
    195   1.1  christos    The load on the first line, gets an offset from the fourth word of
    196   1.1  christos    the PLT entry.  The add on the second line makes ip = &GOT[n+3],
    197   1.1  christos    which contains either a pointer to PLT[0] (the fixup trampoline) or
    198   1.1  christos    a pointer to the actual code.
    199   1.1  christos 
    200   1.1  christos    3) In the GOT:
    201   1.1  christos 
    202   1.1  christos    The GOT contains helper pointers for both code (PLT) fixups and
    203   1.1  christos    data fixups.  The first 3 entries of the GOT are special.  The next
    204   1.1  christos    M entries (where M is the number of entries in the PLT) belong to
    205   1.1  christos    the PLT fixups.  The next D (all remaining) entries belong to
    206   1.1  christos    various data fixups.  The actual size of the GOT is 3 + M + D.
    207   1.1  christos 
    208   1.1  christos    The GOT is also a synthetic area, created by the linker.  It exists
    209   1.1  christos    in both executables and libraries.  When the GOT is first
    210   1.1  christos    initialized , all the GOT entries relating to PLT fixups are
    211   1.1  christos    pointing to code back at PLT[0].
    212   1.1  christos 
    213   1.1  christos    The special entries in the GOT are:
    214   1.1  christos 
    215   1.1  christos    GOT[0] = linked list pointer used by the dynamic loader
    216   1.1  christos    GOT[1] = pointer to the reloc table for this module
    217   1.1  christos    GOT[2] = pointer to the fixup/resolver code
    218   1.1  christos 
    219   1.1  christos    The first invocation of function call comes through and uses the
    220   1.1  christos    fixup/resolver code.  On the entry to the fixup/resolver code:
    221   1.1  christos 
    222   1.1  christos    ip = &GOT[n+3]
    223   1.1  christos    lr = &GOT[2]
    224   1.1  christos    stack[0] = return address (lr) of the function call
    225   1.1  christos    [r0, r1, r2, r3] are still the arguments to the function call
    226   1.1  christos 
    227   1.1  christos    This is enough information for the fixup/resolver code to work
    228   1.1  christos    with.  Before the fixup/resolver code returns, it actually calls
    229   1.1  christos    the requested function and repairs &GOT[n+3].  */
    230   1.1  christos 
    231   1.1  christos /* The constants below were determined by examining the following files
    232   1.1  christos    in the linux kernel sources:
    233   1.1  christos 
    234   1.1  christos       arch/arm/kernel/signal.c
    235   1.1  christos 	  - see SWI_SYS_SIGRETURN and SWI_SYS_RT_SIGRETURN
    236   1.1  christos       include/asm-arm/unistd.h
    237   1.1  christos 	  - see __NR_sigreturn, __NR_rt_sigreturn, and __NR_SYSCALL_BASE */
    238   1.1  christos 
    239   1.1  christos #define ARM_LINUX_SIGRETURN_INSTR	0xef900077
    240   1.1  christos #define ARM_LINUX_RT_SIGRETURN_INSTR	0xef9000ad
    241   1.1  christos 
    242   1.1  christos /* For ARM EABI, the syscall number is not in the SWI instruction
    243   1.1  christos    (instead it is loaded into r7).  We recognize the pattern that
    244   1.1  christos    glibc uses...  alternatively, we could arrange to do this by
    245   1.1  christos    function name, but they are not always exported.  */
    246   1.1  christos #define ARM_SET_R7_SIGRETURN		0xe3a07077
    247   1.1  christos #define ARM_SET_R7_RT_SIGRETURN		0xe3a070ad
    248   1.1  christos #define ARM_EABI_SYSCALL		0xef000000
    249   1.1  christos 
    250   1.3  christos /* Equivalent patterns for Thumb2.  */
    251   1.3  christos #define THUMB2_SET_R7_SIGRETURN1	0xf04f
    252   1.3  christos #define THUMB2_SET_R7_SIGRETURN2	0x0777
    253   1.3  christos #define THUMB2_SET_R7_RT_SIGRETURN1	0xf04f
    254   1.3  christos #define THUMB2_SET_R7_RT_SIGRETURN2	0x07ad
    255   1.3  christos #define THUMB2_EABI_SYSCALL		0xdf00
    256   1.3  christos 
    257   1.1  christos /* OABI syscall restart trampoline, used for EABI executables too
    258   1.1  christos    whenever OABI support has been enabled in the kernel.  */
    259   1.1  christos #define ARM_OABI_SYSCALL_RESTART_SYSCALL 0xef900000
    260   1.1  christos #define ARM_LDR_PC_SP_12		0xe49df00c
    261   1.1  christos #define ARM_LDR_PC_SP_4			0xe49df004
    262   1.1  christos 
    263   1.6  christos /* Syscall number for sigreturn.  */
    264   1.6  christos #define ARM_SIGRETURN 119
    265   1.6  christos /* Syscall number for rt_sigreturn.  */
    266   1.6  christos #define ARM_RT_SIGRETURN 173
    267   1.6  christos 
    268   1.6  christos static CORE_ADDR
    269   1.6  christos   arm_linux_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self);
    270   1.6  christos 
    271   1.6  christos /* Operation function pointers for get_next_pcs.  */
    272   1.6  christos static struct arm_get_next_pcs_ops arm_linux_get_next_pcs_ops = {
    273   1.6  christos   arm_get_next_pcs_read_memory_unsigned_integer,
    274   1.6  christos   arm_linux_get_next_pcs_syscall_next_pc,
    275   1.6  christos   arm_get_next_pcs_addr_bits_remove,
    276   1.6  christos   arm_get_next_pcs_is_thumb,
    277   1.6  christos   arm_linux_get_next_pcs_fixup,
    278   1.6  christos };
    279   1.6  christos 
    280   1.1  christos static void
    281  1.11  christos arm_linux_sigtramp_cache (const frame_info_ptr &this_frame,
    282   1.1  christos 			  struct trad_frame_cache *this_cache,
    283   1.1  christos 			  CORE_ADDR func, int regs_offset)
    284   1.1  christos {
    285   1.1  christos   CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
    286   1.1  christos   CORE_ADDR base = sp + regs_offset;
    287   1.1  christos   int i;
    288   1.1  christos 
    289   1.1  christos   for (i = 0; i < 16; i++)
    290   1.1  christos     trad_frame_set_reg_addr (this_cache, i, base + i * 4);
    291   1.1  christos 
    292   1.1  christos   trad_frame_set_reg_addr (this_cache, ARM_PS_REGNUM, base + 16 * 4);
    293   1.1  christos 
    294   1.1  christos   /* The VFP or iWMMXt registers may be saved on the stack, but there's
    295   1.1  christos      no reliable way to restore them (yet).  */
    296   1.1  christos 
    297   1.1  christos   /* Save a frame ID.  */
    298   1.1  christos   trad_frame_set_id (this_cache, frame_id_build (sp, func));
    299   1.1  christos }
    300   1.1  christos 
    301   1.6  christos /* See arm-linux.h for stack layout details.  */
    302   1.1  christos static void
    303   1.1  christos arm_linux_sigreturn_init (const struct tramp_frame *self,
    304  1.11  christos 			  const frame_info_ptr &this_frame,
    305   1.1  christos 			  struct trad_frame_cache *this_cache,
    306   1.1  christos 			  CORE_ADDR func)
    307   1.1  christos {
    308   1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
    309   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    310   1.1  christos   CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
    311   1.1  christos   ULONGEST uc_flags = read_memory_unsigned_integer (sp, 4, byte_order);
    312   1.1  christos 
    313   1.1  christos   if (uc_flags == ARM_NEW_SIGFRAME_MAGIC)
    314   1.1  christos     arm_linux_sigtramp_cache (this_frame, this_cache, func,
    315   1.1  christos 			      ARM_UCONTEXT_SIGCONTEXT
    316   1.1  christos 			      + ARM_SIGCONTEXT_R0);
    317   1.1  christos   else
    318   1.1  christos     arm_linux_sigtramp_cache (this_frame, this_cache, func,
    319   1.1  christos 			      ARM_SIGCONTEXT_R0);
    320   1.1  christos }
    321   1.1  christos 
    322   1.1  christos static void
    323   1.1  christos arm_linux_rt_sigreturn_init (const struct tramp_frame *self,
    324  1.11  christos 			  const frame_info_ptr &this_frame,
    325   1.1  christos 			  struct trad_frame_cache *this_cache,
    326   1.1  christos 			  CORE_ADDR func)
    327   1.1  christos {
    328   1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
    329   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    330   1.1  christos   CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
    331   1.1  christos   ULONGEST pinfo = read_memory_unsigned_integer (sp, 4, byte_order);
    332   1.1  christos 
    333   1.1  christos   if (pinfo == sp + ARM_OLD_RT_SIGFRAME_SIGINFO)
    334   1.1  christos     arm_linux_sigtramp_cache (this_frame, this_cache, func,
    335   1.1  christos 			      ARM_OLD_RT_SIGFRAME_UCONTEXT
    336   1.1  christos 			      + ARM_UCONTEXT_SIGCONTEXT
    337   1.1  christos 			      + ARM_SIGCONTEXT_R0);
    338   1.1  christos   else
    339   1.1  christos     arm_linux_sigtramp_cache (this_frame, this_cache, func,
    340   1.1  christos 			      ARM_NEW_RT_SIGFRAME_UCONTEXT
    341   1.1  christos 			      + ARM_UCONTEXT_SIGCONTEXT
    342   1.1  christos 			      + ARM_SIGCONTEXT_R0);
    343   1.1  christos }
    344   1.1  christos 
    345   1.1  christos static void
    346   1.1  christos arm_linux_restart_syscall_init (const struct tramp_frame *self,
    347  1.11  christos 				const frame_info_ptr &this_frame,
    348   1.1  christos 				struct trad_frame_cache *this_cache,
    349   1.1  christos 				CORE_ADDR func)
    350   1.1  christos {
    351   1.1  christos   struct gdbarch *gdbarch = get_frame_arch (this_frame);
    352   1.1  christos   CORE_ADDR sp = get_frame_register_unsigned (this_frame, ARM_SP_REGNUM);
    353   1.1  christos   CORE_ADDR pc = get_frame_memory_unsigned (this_frame, sp, 4);
    354   1.1  christos   CORE_ADDR cpsr = get_frame_register_unsigned (this_frame, ARM_PS_REGNUM);
    355   1.1  christos   ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
    356   1.1  christos   int sp_offset;
    357   1.1  christos 
    358   1.1  christos   /* There are two variants of this trampoline; with older kernels, the
    359   1.1  christos      stub is placed on the stack, while newer kernels use the stub from
    360   1.1  christos      the vector page.  They are identical except that the older version
    361   1.1  christos      increments SP by 12 (to skip stored PC and the stub itself), while
    362   1.1  christos      the newer version increments SP only by 4 (just the stored PC).  */
    363   1.1  christos   if (self->insn[1].bytes == ARM_LDR_PC_SP_4)
    364   1.1  christos     sp_offset = 4;
    365   1.1  christos   else
    366   1.1  christos     sp_offset = 12;
    367   1.1  christos 
    368   1.1  christos   /* Update Thumb bit in CPSR.  */
    369   1.1  christos   if (pc & 1)
    370   1.1  christos     cpsr |= t_bit;
    371   1.1  christos   else
    372   1.1  christos     cpsr &= ~t_bit;
    373   1.1  christos 
    374   1.1  christos   /* Remove Thumb bit from PC.  */
    375   1.1  christos   pc = gdbarch_addr_bits_remove (gdbarch, pc);
    376   1.1  christos 
    377   1.1  christos   /* Save previous register values.  */
    378   1.1  christos   trad_frame_set_reg_value (this_cache, ARM_SP_REGNUM, sp + sp_offset);
    379   1.1  christos   trad_frame_set_reg_value (this_cache, ARM_PC_REGNUM, pc);
    380   1.1  christos   trad_frame_set_reg_value (this_cache, ARM_PS_REGNUM, cpsr);
    381   1.1  christos 
    382   1.1  christos   /* Save a frame ID.  */
    383   1.1  christos   trad_frame_set_id (this_cache, frame_id_build (sp, func));
    384   1.1  christos }
    385   1.1  christos 
    386   1.1  christos static struct tramp_frame arm_linux_sigreturn_tramp_frame = {
    387   1.1  christos   SIGTRAMP_FRAME,
    388   1.1  christos   4,
    389   1.1  christos   {
    390   1.8  christos     { ARM_LINUX_SIGRETURN_INSTR, ULONGEST_MAX },
    391   1.1  christos     { TRAMP_SENTINEL_INSN }
    392   1.1  christos   },
    393   1.1  christos   arm_linux_sigreturn_init
    394   1.1  christos };
    395   1.1  christos 
    396   1.1  christos static struct tramp_frame arm_linux_rt_sigreturn_tramp_frame = {
    397   1.1  christos   SIGTRAMP_FRAME,
    398   1.1  christos   4,
    399   1.1  christos   {
    400   1.8  christos     { ARM_LINUX_RT_SIGRETURN_INSTR, ULONGEST_MAX },
    401   1.1  christos     { TRAMP_SENTINEL_INSN }
    402   1.1  christos   },
    403   1.1  christos   arm_linux_rt_sigreturn_init
    404   1.1  christos };
    405   1.1  christos 
    406   1.1  christos static struct tramp_frame arm_eabi_linux_sigreturn_tramp_frame = {
    407   1.1  christos   SIGTRAMP_FRAME,
    408   1.1  christos   4,
    409   1.1  christos   {
    410   1.8  christos     { ARM_SET_R7_SIGRETURN, ULONGEST_MAX },
    411   1.8  christos     { ARM_EABI_SYSCALL, ULONGEST_MAX },
    412   1.1  christos     { TRAMP_SENTINEL_INSN }
    413   1.1  christos   },
    414   1.1  christos   arm_linux_sigreturn_init
    415   1.1  christos };
    416   1.1  christos 
    417   1.1  christos static struct tramp_frame arm_eabi_linux_rt_sigreturn_tramp_frame = {
    418   1.1  christos   SIGTRAMP_FRAME,
    419   1.1  christos   4,
    420   1.1  christos   {
    421   1.8  christos     { ARM_SET_R7_RT_SIGRETURN, ULONGEST_MAX },
    422   1.8  christos     { ARM_EABI_SYSCALL, ULONGEST_MAX },
    423   1.1  christos     { TRAMP_SENTINEL_INSN }
    424   1.1  christos   },
    425   1.1  christos   arm_linux_rt_sigreturn_init
    426   1.1  christos };
    427   1.1  christos 
    428   1.3  christos static struct tramp_frame thumb2_eabi_linux_sigreturn_tramp_frame = {
    429   1.3  christos   SIGTRAMP_FRAME,
    430   1.3  christos   2,
    431   1.3  christos   {
    432   1.8  christos     { THUMB2_SET_R7_SIGRETURN1, ULONGEST_MAX },
    433   1.8  christos     { THUMB2_SET_R7_SIGRETURN2, ULONGEST_MAX },
    434   1.8  christos     { THUMB2_EABI_SYSCALL, ULONGEST_MAX },
    435   1.3  christos     { TRAMP_SENTINEL_INSN }
    436   1.3  christos   },
    437   1.3  christos   arm_linux_sigreturn_init
    438   1.3  christos };
    439   1.3  christos 
    440   1.3  christos static struct tramp_frame thumb2_eabi_linux_rt_sigreturn_tramp_frame = {
    441   1.3  christos   SIGTRAMP_FRAME,
    442   1.3  christos   2,
    443   1.3  christos   {
    444   1.8  christos     { THUMB2_SET_R7_RT_SIGRETURN1, ULONGEST_MAX },
    445   1.8  christos     { THUMB2_SET_R7_RT_SIGRETURN2, ULONGEST_MAX },
    446   1.8  christos     { THUMB2_EABI_SYSCALL, ULONGEST_MAX },
    447   1.3  christos     { TRAMP_SENTINEL_INSN }
    448   1.3  christos   },
    449   1.3  christos   arm_linux_rt_sigreturn_init
    450   1.3  christos };
    451   1.3  christos 
    452   1.1  christos static struct tramp_frame arm_linux_restart_syscall_tramp_frame = {
    453   1.1  christos   NORMAL_FRAME,
    454   1.1  christos   4,
    455   1.1  christos   {
    456   1.8  christos     { ARM_OABI_SYSCALL_RESTART_SYSCALL, ULONGEST_MAX },
    457   1.8  christos     { ARM_LDR_PC_SP_12, ULONGEST_MAX },
    458   1.1  christos     { TRAMP_SENTINEL_INSN }
    459   1.1  christos   },
    460   1.1  christos   arm_linux_restart_syscall_init
    461   1.1  christos };
    462   1.1  christos 
    463   1.1  christos static struct tramp_frame arm_kernel_linux_restart_syscall_tramp_frame = {
    464   1.1  christos   NORMAL_FRAME,
    465   1.1  christos   4,
    466   1.1  christos   {
    467   1.8  christos     { ARM_OABI_SYSCALL_RESTART_SYSCALL, ULONGEST_MAX },
    468   1.8  christos     { ARM_LDR_PC_SP_4, ULONGEST_MAX },
    469   1.1  christos     { TRAMP_SENTINEL_INSN }
    470   1.1  christos   },
    471   1.1  christos   arm_linux_restart_syscall_init
    472   1.1  christos };
    473   1.1  christos 
    474   1.1  christos /* Core file and register set support.  */
    475   1.1  christos 
    476   1.9  christos #define ARM_LINUX_SIZEOF_GREGSET (18 * ARM_INT_REGISTER_SIZE)
    477   1.1  christos 
    478   1.1  christos void
    479   1.1  christos arm_linux_supply_gregset (const struct regset *regset,
    480   1.1  christos 			  struct regcache *regcache,
    481   1.1  christos 			  int regnum, const void *gregs_buf, size_t len)
    482   1.1  christos {
    483   1.8  christos   struct gdbarch *gdbarch = regcache->arch ();
    484   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    485   1.6  christos   const gdb_byte *gregs = (const gdb_byte *) gregs_buf;
    486   1.1  christos   int regno;
    487   1.1  christos   CORE_ADDR reg_pc;
    488   1.9  christos   gdb_byte pc_buf[ARM_INT_REGISTER_SIZE];
    489   1.1  christos 
    490   1.1  christos   for (regno = ARM_A1_REGNUM; regno < ARM_PC_REGNUM; regno++)
    491   1.1  christos     if (regnum == -1 || regnum == regno)
    492   1.9  christos       regcache->raw_supply (regno, gregs + ARM_INT_REGISTER_SIZE * regno);
    493   1.1  christos 
    494   1.1  christos   if (regnum == ARM_PS_REGNUM || regnum == -1)
    495   1.1  christos     {
    496   1.1  christos       if (arm_apcs_32)
    497   1.8  christos 	regcache->raw_supply (ARM_PS_REGNUM,
    498   1.9  christos 			      gregs + ARM_INT_REGISTER_SIZE * ARM_CPSR_GREGNUM);
    499   1.1  christos       else
    500   1.8  christos 	regcache->raw_supply (ARM_PS_REGNUM,
    501   1.9  christos 			     gregs + ARM_INT_REGISTER_SIZE * ARM_PC_REGNUM);
    502   1.1  christos     }
    503   1.1  christos 
    504   1.1  christos   if (regnum == ARM_PC_REGNUM || regnum == -1)
    505   1.1  christos     {
    506   1.9  christos       reg_pc = extract_unsigned_integer (
    507   1.9  christos 		 gregs + ARM_INT_REGISTER_SIZE * ARM_PC_REGNUM,
    508   1.9  christos 		 ARM_INT_REGISTER_SIZE, byte_order);
    509   1.1  christos       reg_pc = gdbarch_addr_bits_remove (gdbarch, reg_pc);
    510   1.9  christos       store_unsigned_integer (pc_buf, ARM_INT_REGISTER_SIZE, byte_order,
    511   1.9  christos 			      reg_pc);
    512   1.8  christos       regcache->raw_supply (ARM_PC_REGNUM, pc_buf);
    513   1.1  christos     }
    514   1.1  christos }
    515   1.1  christos 
    516   1.1  christos void
    517   1.1  christos arm_linux_collect_gregset (const struct regset *regset,
    518   1.1  christos 			   const struct regcache *regcache,
    519   1.1  christos 			   int regnum, void *gregs_buf, size_t len)
    520   1.1  christos {
    521   1.6  christos   gdb_byte *gregs = (gdb_byte *) gregs_buf;
    522   1.1  christos   int regno;
    523   1.1  christos 
    524   1.1  christos   for (regno = ARM_A1_REGNUM; regno < ARM_PC_REGNUM; regno++)
    525   1.1  christos     if (regnum == -1 || regnum == regno)
    526   1.8  christos       regcache->raw_collect (regno,
    527   1.9  christos 			    gregs + ARM_INT_REGISTER_SIZE * regno);
    528   1.1  christos 
    529   1.1  christos   if (regnum == ARM_PS_REGNUM || regnum == -1)
    530   1.1  christos     {
    531   1.1  christos       if (arm_apcs_32)
    532   1.8  christos 	regcache->raw_collect (ARM_PS_REGNUM,
    533   1.9  christos 			      gregs + ARM_INT_REGISTER_SIZE * ARM_CPSR_GREGNUM);
    534   1.1  christos       else
    535   1.8  christos 	regcache->raw_collect (ARM_PS_REGNUM,
    536   1.9  christos 			      gregs + ARM_INT_REGISTER_SIZE * ARM_PC_REGNUM);
    537   1.1  christos     }
    538   1.1  christos 
    539   1.1  christos   if (regnum == ARM_PC_REGNUM || regnum == -1)
    540   1.8  christos     regcache->raw_collect (ARM_PC_REGNUM,
    541   1.9  christos 			   gregs + ARM_INT_REGISTER_SIZE * ARM_PC_REGNUM);
    542   1.1  christos }
    543   1.1  christos 
    544   1.1  christos /* Support for register format used by the NWFPE FPA emulator.  */
    545   1.1  christos 
    546   1.1  christos #define typeNone		0x00
    547   1.1  christos #define typeSingle		0x01
    548   1.1  christos #define typeDouble		0x02
    549   1.1  christos #define typeExtended		0x03
    550   1.1  christos 
    551   1.1  christos void
    552   1.1  christos supply_nwfpe_register (struct regcache *regcache, int regno,
    553   1.1  christos 		       const gdb_byte *regs)
    554   1.1  christos {
    555   1.1  christos   const gdb_byte *reg_data;
    556   1.1  christos   gdb_byte reg_tag;
    557   1.9  christos   gdb_byte buf[ARM_FP_REGISTER_SIZE];
    558   1.1  christos 
    559   1.9  christos   reg_data = regs + (regno - ARM_F0_REGNUM) * ARM_FP_REGISTER_SIZE;
    560   1.1  christos   reg_tag = regs[(regno - ARM_F0_REGNUM) + NWFPE_TAGS_OFFSET];
    561   1.9  christos   memset (buf, 0, ARM_FP_REGISTER_SIZE);
    562   1.1  christos 
    563   1.1  christos   switch (reg_tag)
    564   1.1  christos     {
    565   1.1  christos     case typeSingle:
    566   1.1  christos       memcpy (buf, reg_data, 4);
    567   1.1  christos       break;
    568   1.1  christos     case typeDouble:
    569   1.1  christos       memcpy (buf, reg_data + 4, 4);
    570   1.1  christos       memcpy (buf + 4, reg_data, 4);
    571   1.1  christos       break;
    572   1.1  christos     case typeExtended:
    573   1.1  christos       /* We want sign and exponent, then least significant bits,
    574   1.1  christos 	 then most significant.  NWFPE does sign, most, least.  */
    575   1.1  christos       memcpy (buf, reg_data, 4);
    576   1.1  christos       memcpy (buf + 4, reg_data + 8, 4);
    577   1.1  christos       memcpy (buf + 8, reg_data + 4, 4);
    578   1.1  christos       break;
    579   1.1  christos     default:
    580   1.1  christos       break;
    581   1.1  christos     }
    582   1.1  christos 
    583   1.8  christos   regcache->raw_supply (regno, buf);
    584   1.1  christos }
    585   1.1  christos 
    586   1.1  christos void
    587   1.1  christos collect_nwfpe_register (const struct regcache *regcache, int regno,
    588   1.1  christos 			gdb_byte *regs)
    589   1.1  christos {
    590   1.1  christos   gdb_byte *reg_data;
    591   1.1  christos   gdb_byte reg_tag;
    592   1.9  christos   gdb_byte buf[ARM_FP_REGISTER_SIZE];
    593   1.1  christos 
    594   1.8  christos   regcache->raw_collect (regno, buf);
    595   1.1  christos 
    596   1.1  christos   /* NOTE drow/2006-06-07: This code uses the tag already in the
    597   1.1  christos      register buffer.  I've preserved that when moving the code
    598   1.1  christos      from the native file to the target file.  But this doesn't
    599   1.1  christos      always make sense.  */
    600   1.1  christos 
    601   1.9  christos   reg_data = regs + (regno - ARM_F0_REGNUM) * ARM_FP_REGISTER_SIZE;
    602   1.1  christos   reg_tag = regs[(regno - ARM_F0_REGNUM) + NWFPE_TAGS_OFFSET];
    603   1.1  christos 
    604   1.1  christos   switch (reg_tag)
    605   1.1  christos     {
    606   1.1  christos     case typeSingle:
    607   1.1  christos       memcpy (reg_data, buf, 4);
    608   1.1  christos       break;
    609   1.1  christos     case typeDouble:
    610   1.1  christos       memcpy (reg_data, buf + 4, 4);
    611   1.1  christos       memcpy (reg_data + 4, buf, 4);
    612   1.1  christos       break;
    613   1.1  christos     case typeExtended:
    614   1.1  christos       memcpy (reg_data, buf, 4);
    615   1.1  christos       memcpy (reg_data + 4, buf + 8, 4);
    616   1.1  christos       memcpy (reg_data + 8, buf + 4, 4);
    617   1.1  christos       break;
    618   1.1  christos     default:
    619   1.1  christos       break;
    620   1.1  christos     }
    621   1.1  christos }
    622   1.1  christos 
    623   1.1  christos void
    624   1.1  christos arm_linux_supply_nwfpe (const struct regset *regset,
    625   1.1  christos 			struct regcache *regcache,
    626   1.1  christos 			int regnum, const void *regs_buf, size_t len)
    627   1.1  christos {
    628   1.6  christos   const gdb_byte *regs = (const gdb_byte *) regs_buf;
    629   1.1  christos   int regno;
    630   1.1  christos 
    631   1.1  christos   if (regnum == ARM_FPS_REGNUM || regnum == -1)
    632   1.8  christos     regcache->raw_supply (ARM_FPS_REGNUM,
    633   1.1  christos 			 regs + NWFPE_FPSR_OFFSET);
    634   1.1  christos 
    635   1.1  christos   for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
    636   1.1  christos     if (regnum == -1 || regnum == regno)
    637   1.1  christos       supply_nwfpe_register (regcache, regno, regs);
    638   1.1  christos }
    639   1.1  christos 
    640   1.1  christos void
    641   1.1  christos arm_linux_collect_nwfpe (const struct regset *regset,
    642   1.1  christos 			 const struct regcache *regcache,
    643   1.1  christos 			 int regnum, void *regs_buf, size_t len)
    644   1.1  christos {
    645   1.6  christos   gdb_byte *regs = (gdb_byte *) regs_buf;
    646   1.1  christos   int regno;
    647   1.1  christos 
    648   1.1  christos   for (regno = ARM_F0_REGNUM; regno <= ARM_F7_REGNUM; regno++)
    649   1.1  christos     if (regnum == -1 || regnum == regno)
    650   1.1  christos       collect_nwfpe_register (regcache, regno, regs);
    651   1.1  christos 
    652   1.1  christos   if (regnum == ARM_FPS_REGNUM || regnum == -1)
    653   1.8  christos     regcache->raw_collect (ARM_FPS_REGNUM,
    654   1.9  christos 			   regs + ARM_INT_REGISTER_SIZE * ARM_FPS_REGNUM);
    655   1.1  christos }
    656   1.1  christos 
    657   1.1  christos /* Support VFP register format.  */
    658   1.1  christos 
    659   1.1  christos #define ARM_LINUX_SIZEOF_VFP (32 * 8 + 4)
    660   1.1  christos 
    661   1.1  christos static void
    662   1.1  christos arm_linux_supply_vfp (const struct regset *regset,
    663   1.1  christos 		      struct regcache *regcache,
    664   1.1  christos 		      int regnum, const void *regs_buf, size_t len)
    665   1.1  christos {
    666   1.6  christos   const gdb_byte *regs = (const gdb_byte *) regs_buf;
    667   1.1  christos   int regno;
    668   1.1  christos 
    669   1.1  christos   if (regnum == ARM_FPSCR_REGNUM || regnum == -1)
    670   1.8  christos     regcache->raw_supply (ARM_FPSCR_REGNUM, regs + 32 * 8);
    671   1.1  christos 
    672   1.1  christos   for (regno = ARM_D0_REGNUM; regno <= ARM_D31_REGNUM; regno++)
    673   1.1  christos     if (regnum == -1 || regnum == regno)
    674   1.8  christos       regcache->raw_supply (regno, regs + (regno - ARM_D0_REGNUM) * 8);
    675   1.1  christos }
    676   1.1  christos 
    677   1.1  christos static void
    678   1.1  christos arm_linux_collect_vfp (const struct regset *regset,
    679   1.1  christos 			 const struct regcache *regcache,
    680   1.1  christos 			 int regnum, void *regs_buf, size_t len)
    681   1.1  christos {
    682   1.6  christos   gdb_byte *regs = (gdb_byte *) regs_buf;
    683   1.1  christos   int regno;
    684   1.1  christos 
    685   1.1  christos   if (regnum == ARM_FPSCR_REGNUM || regnum == -1)
    686   1.8  christos     regcache->raw_collect (ARM_FPSCR_REGNUM, regs + 32 * 8);
    687   1.1  christos 
    688   1.1  christos   for (regno = ARM_D0_REGNUM; regno <= ARM_D31_REGNUM; regno++)
    689   1.1  christos     if (regnum == -1 || regnum == regno)
    690   1.8  christos       regcache->raw_collect (regno, regs + (regno - ARM_D0_REGNUM) * 8);
    691   1.1  christos }
    692   1.1  christos 
    693   1.3  christos static const struct regset arm_linux_gregset =
    694   1.3  christos   {
    695   1.3  christos     NULL, arm_linux_supply_gregset, arm_linux_collect_gregset
    696   1.3  christos   };
    697   1.3  christos 
    698   1.3  christos static const struct regset arm_linux_fpregset =
    699   1.3  christos   {
    700   1.3  christos     NULL, arm_linux_supply_nwfpe, arm_linux_collect_nwfpe
    701   1.3  christos   };
    702   1.3  christos 
    703   1.3  christos static const struct regset arm_linux_vfpregset =
    704   1.3  christos   {
    705   1.3  christos     NULL, arm_linux_supply_vfp, arm_linux_collect_vfp
    706   1.3  christos   };
    707   1.1  christos 
    708   1.3  christos /* Iterate over core file register note sections.  */
    709   1.3  christos 
    710   1.3  christos static void
    711   1.3  christos arm_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
    712   1.3  christos 					iterate_over_regset_sections_cb *cb,
    713   1.3  christos 					void *cb_data,
    714   1.3  christos 					const struct regcache *regcache)
    715   1.1  christos {
    716  1.10  christos   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
    717   1.1  christos 
    718   1.8  christos   cb (".reg", ARM_LINUX_SIZEOF_GREGSET, ARM_LINUX_SIZEOF_GREGSET,
    719   1.8  christos       &arm_linux_gregset, NULL, cb_data);
    720   1.1  christos 
    721   1.5  christos   if (tdep->vfp_register_count > 0)
    722   1.8  christos     cb (".reg-arm-vfp", ARM_LINUX_SIZEOF_VFP, ARM_LINUX_SIZEOF_VFP,
    723   1.8  christos 	&arm_linux_vfpregset, "VFP floating-point", cb_data);
    724   1.3  christos   else if (tdep->have_fpa_registers)
    725   1.8  christos     cb (".reg2", ARM_LINUX_SIZEOF_NWFPE, ARM_LINUX_SIZEOF_NWFPE,
    726   1.8  christos 	&arm_linux_fpregset, "FPA floating-point", cb_data);
    727   1.1  christos }
    728   1.1  christos 
    729   1.1  christos /* Determine target description from core file.  */
    730   1.1  christos 
    731   1.1  christos static const struct target_desc *
    732   1.1  christos arm_linux_core_read_description (struct gdbarch *gdbarch,
    733  1.10  christos 				 struct target_ops *target,
    734  1.10  christos 				 bfd *abfd)
    735   1.1  christos {
    736  1.11  christos   std::optional<gdb::byte_vector> auxv = target_read_auxv_raw (target);
    737  1.10  christos   CORE_ADDR arm_hwcap = linux_get_hwcap (auxv, target, gdbarch);
    738   1.1  christos 
    739   1.1  christos   if (arm_hwcap & HWCAP_VFP)
    740   1.1  christos     {
    741   1.1  christos       /* NEON implies VFPv3-D32 or no-VFP unit.  Say that we only support
    742  1.10  christos 	 Neon with VFPv3-D32.  */
    743   1.1  christos       if (arm_hwcap & HWCAP_NEON)
    744  1.11  christos 	return aarch32_read_description (false);
    745   1.1  christos       else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3)
    746  1.10  christos 	return arm_read_description (ARM_FP_TYPE_VFPV3, false);
    747   1.9  christos 
    748  1.10  christos       return arm_read_description (ARM_FP_TYPE_VFPV2, false);
    749   1.1  christos     }
    750   1.1  christos 
    751   1.9  christos   return nullptr;
    752   1.1  christos }
    753   1.1  christos 
    754   1.1  christos 
    755   1.1  christos /* Copy the value of next pc of sigreturn and rt_sigrturn into PC,
    756   1.1  christos    return 1.  In addition, set IS_THUMB depending on whether we
    757   1.1  christos    will return to ARM or Thumb code.  Return 0 if it is not a
    758   1.1  christos    rt_sigreturn/sigreturn syscall.  */
    759   1.1  christos static int
    760  1.11  christos arm_linux_sigreturn_return_addr (const frame_info_ptr &frame,
    761   1.1  christos 				 unsigned long svc_number,
    762   1.1  christos 				 CORE_ADDR *pc, int *is_thumb)
    763   1.1  christos {
    764   1.1  christos   /* Is this a sigreturn or rt_sigreturn syscall?  */
    765   1.1  christos   if (svc_number == 119 || svc_number == 173)
    766   1.1  christos     {
    767   1.1  christos       if (get_frame_type (frame) == SIGTRAMP_FRAME)
    768   1.1  christos 	{
    769   1.1  christos 	  ULONGEST t_bit = arm_psr_thumb_bit (frame_unwind_arch (frame));
    770   1.1  christos 	  CORE_ADDR cpsr
    771   1.1  christos 	    = frame_unwind_register_unsigned (frame, ARM_PS_REGNUM);
    772   1.1  christos 
    773   1.1  christos 	  *is_thumb = (cpsr & t_bit) != 0;
    774   1.1  christos 	  *pc = frame_unwind_caller_pc (frame);
    775   1.1  christos 	  return 1;
    776   1.1  christos 	}
    777   1.1  christos     }
    778   1.1  christos   return 0;
    779   1.1  christos }
    780   1.1  christos 
    781   1.6  christos /* Find the value of the next PC after a sigreturn or rt_sigreturn syscall
    782   1.6  christos    based on current processor state.  In addition, set IS_THUMB depending
    783   1.6  christos    on whether we will return to ARM or Thumb code.  */
    784   1.6  christos 
    785   1.6  christos static CORE_ADDR
    786   1.6  christos arm_linux_sigreturn_next_pc (struct regcache *regcache,
    787   1.6  christos 			     unsigned long svc_number, int *is_thumb)
    788   1.6  christos {
    789   1.6  christos   ULONGEST sp;
    790   1.6  christos   unsigned long sp_data;
    791   1.6  christos   CORE_ADDR next_pc = 0;
    792   1.8  christos   struct gdbarch *gdbarch = regcache->arch ();
    793   1.6  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
    794   1.6  christos   int pc_offset = 0;
    795   1.6  christos   int is_sigreturn = 0;
    796   1.6  christos   CORE_ADDR cpsr;
    797   1.6  christos 
    798   1.6  christos   gdb_assert (svc_number == ARM_SIGRETURN
    799   1.6  christos 	      || svc_number == ARM_RT_SIGRETURN);
    800   1.6  christos 
    801   1.6  christos   is_sigreturn = (svc_number == ARM_SIGRETURN);
    802   1.6  christos   regcache_cooked_read_unsigned (regcache, ARM_SP_REGNUM, &sp);
    803   1.6  christos   sp_data = read_memory_unsigned_integer (sp, 4, byte_order);
    804   1.6  christos 
    805   1.6  christos   pc_offset = arm_linux_sigreturn_next_pc_offset (sp, sp_data, svc_number,
    806   1.6  christos 						  is_sigreturn);
    807   1.6  christos 
    808   1.6  christos   next_pc = read_memory_unsigned_integer (sp + pc_offset, 4, byte_order);
    809   1.6  christos 
    810   1.6  christos   /* Set IS_THUMB according the CPSR saved on the stack.  */
    811   1.6  christos   cpsr = read_memory_unsigned_integer (sp + pc_offset + 4, 4, byte_order);
    812   1.6  christos   *is_thumb = ((cpsr & arm_psr_thumb_bit (gdbarch)) != 0);
    813   1.6  christos 
    814   1.6  christos   return next_pc;
    815   1.6  christos }
    816   1.6  christos 
    817  1.11  christos /* Return true if we're at execve syscall-exit-stop.  */
    818  1.11  christos 
    819  1.11  christos static bool
    820  1.11  christos is_execve_syscall_exit (struct regcache *regs)
    821  1.11  christos {
    822  1.11  christos   ULONGEST reg = -1;
    823  1.11  christos 
    824  1.11  christos   /* Check that lr is 0.  */
    825  1.11  christos   regcache_cooked_read_unsigned (regs, ARM_LR_REGNUM, &reg);
    826  1.11  christos   if (reg != 0)
    827  1.11  christos     return false;
    828  1.11  christos 
    829  1.11  christos   /* Check that r0-r8 is 0.  */
    830  1.11  christos   for (int i = 0; i <= 8; ++i)
    831  1.11  christos     {
    832  1.11  christos       reg = -1;
    833  1.11  christos       regcache_cooked_read_unsigned (regs, ARM_A1_REGNUM + i, &reg);
    834  1.11  christos       if (reg != 0)
    835  1.11  christos 	return false;
    836  1.11  christos     }
    837  1.11  christos 
    838  1.11  christos   return true;
    839  1.11  christos }
    840  1.11  christos 
    841  1.11  christos #define arm_sys_execve 11
    842  1.11  christos 
    843   1.1  christos /* At a ptrace syscall-stop, return the syscall number.  This either
    844   1.1  christos    comes from the SWI instruction (OABI) or from r7 (EABI).
    845   1.1  christos 
    846   1.1  christos    When the function fails, it should return -1.  */
    847   1.1  christos 
    848   1.1  christos static LONGEST
    849   1.1  christos arm_linux_get_syscall_number (struct gdbarch *gdbarch,
    850   1.8  christos 			      thread_info *thread)
    851   1.1  christos {
    852   1.8  christos   struct regcache *regs = get_thread_regcache (thread);
    853   1.1  christos 
    854   1.1  christos   ULONGEST pc;
    855   1.1  christos   ULONGEST cpsr;
    856   1.1  christos   ULONGEST t_bit = arm_psr_thumb_bit (gdbarch);
    857   1.1  christos   int is_thumb;
    858   1.1  christos   ULONGEST svc_number = -1;
    859   1.1  christos 
    860  1.11  christos   if (is_execve_syscall_exit (regs))
    861  1.11  christos     return arm_sys_execve;
    862  1.11  christos 
    863   1.1  christos   regcache_cooked_read_unsigned (regs, ARM_PC_REGNUM, &pc);
    864   1.1  christos   regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &cpsr);
    865   1.1  christos   is_thumb = (cpsr & t_bit) != 0;
    866   1.1  christos 
    867   1.1  christos   if (is_thumb)
    868   1.1  christos     {
    869   1.1  christos       regcache_cooked_read_unsigned (regs, 7, &svc_number);
    870   1.1  christos     }
    871   1.1  christos   else
    872   1.1  christos     {
    873   1.1  christos       enum bfd_endian byte_order_for_code =
    874   1.1  christos 	gdbarch_byte_order_for_code (gdbarch);
    875   1.1  christos 
    876   1.1  christos       /* PC gets incremented before the syscall-stop, so read the
    877   1.1  christos 	 previous instruction.  */
    878  1.11  christos       unsigned long this_instr;
    879  1.11  christos       {
    880  1.11  christos 	ULONGEST val;
    881  1.11  christos 	if (!safe_read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code,
    882  1.11  christos 						&val))
    883  1.11  christos 	  return -1;
    884  1.11  christos 	this_instr = val;
    885  1.11  christos       }
    886   1.1  christos       unsigned long svc_operand = (0x00ffffff & this_instr);
    887   1.1  christos 
    888   1.1  christos       if (svc_operand)
    889   1.1  christos 	{
    890  1.10  christos 	  /* OABI */
    891   1.1  christos 	  svc_number = svc_operand - 0x900000;
    892   1.1  christos 	}
    893   1.1  christos       else
    894   1.1  christos 	{
    895  1.10  christos 	  /* EABI */
    896   1.1  christos 	  regcache_cooked_read_unsigned (regs, 7, &svc_number);
    897   1.1  christos 	}
    898   1.1  christos     }
    899   1.1  christos 
    900   1.1  christos   return svc_number;
    901   1.1  christos }
    902   1.1  christos 
    903   1.1  christos static CORE_ADDR
    904   1.6  christos arm_linux_get_next_pcs_syscall_next_pc (struct arm_get_next_pcs *self)
    905   1.1  christos {
    906   1.6  christos   CORE_ADDR next_pc = 0;
    907  1.11  christos   regcache *regcache
    908  1.11  christos     = gdb::checked_static_cast<struct regcache *> (self->regcache);
    909  1.11  christos   CORE_ADDR pc = regcache_read_pc (regcache);
    910  1.11  christos   int is_thumb = arm_is_thumb (regcache);
    911   1.1  christos   ULONGEST svc_number = 0;
    912   1.1  christos 
    913   1.1  christos   if (is_thumb)
    914   1.1  christos     {
    915   1.6  christos       svc_number = regcache_raw_get_unsigned (self->regcache, 7);
    916   1.6  christos       next_pc = pc + 2;
    917   1.1  christos     }
    918   1.1  christos   else
    919   1.1  christos     {
    920  1.11  christos       struct gdbarch *gdbarch = regcache->arch ();
    921   1.1  christos       enum bfd_endian byte_order_for_code =
    922   1.1  christos 	gdbarch_byte_order_for_code (gdbarch);
    923   1.1  christos       unsigned long this_instr =
    924   1.1  christos 	read_memory_unsigned_integer (pc, 4, byte_order_for_code);
    925   1.1  christos 
    926   1.1  christos       unsigned long svc_operand = (0x00ffffff & this_instr);
    927   1.1  christos       if (svc_operand)  /* OABI.  */
    928   1.1  christos 	{
    929   1.1  christos 	  svc_number = svc_operand - 0x900000;
    930   1.1  christos 	}
    931   1.1  christos       else /* EABI.  */
    932   1.1  christos 	{
    933   1.6  christos 	  svc_number = regcache_raw_get_unsigned (self->regcache, 7);
    934   1.1  christos 	}
    935   1.1  christos 
    936   1.6  christos       next_pc = pc + 4;
    937   1.1  christos     }
    938   1.1  christos 
    939   1.6  christos   if (svc_number == ARM_SIGRETURN || svc_number == ARM_RT_SIGRETURN)
    940   1.6  christos     {
    941   1.6  christos       /* SIGRETURN or RT_SIGRETURN may affect the arm thumb mode, so
    942   1.6  christos 	 update IS_THUMB.   */
    943  1.11  christos       next_pc = arm_linux_sigreturn_next_pc (regcache, svc_number, &is_thumb);
    944   1.6  christos     }
    945   1.1  christos 
    946   1.1  christos   /* Addresses for calling Thumb functions have the bit 0 set.  */
    947   1.1  christos   if (is_thumb)
    948   1.6  christos     next_pc = MAKE_THUMB_ADDR (next_pc);
    949   1.1  christos 
    950   1.6  christos   return next_pc;
    951   1.1  christos }
    952   1.1  christos 
    953   1.1  christos 
    954   1.1  christos /* Insert a single step breakpoint at the next executed instruction.  */
    955   1.1  christos 
    956   1.8  christos static std::vector<CORE_ADDR>
    957   1.7  christos arm_linux_software_single_step (struct regcache *regcache)
    958   1.1  christos {
    959   1.8  christos   struct gdbarch *gdbarch = regcache->arch ();
    960   1.6  christos   struct arm_get_next_pcs next_pcs_ctx;
    961   1.6  christos 
    962   1.6  christos   /* If the target does have hardware single step, GDB doesn't have
    963   1.6  christos      to bother software single step.  */
    964   1.6  christos   if (target_can_do_single_step () == 1)
    965   1.8  christos     return {};
    966   1.6  christos 
    967   1.6  christos   arm_get_next_pcs_ctor (&next_pcs_ctx,
    968   1.6  christos 			 &arm_linux_get_next_pcs_ops,
    969   1.6  christos 			 gdbarch_byte_order (gdbarch),
    970   1.6  christos 			 gdbarch_byte_order_for_code (gdbarch),
    971   1.6  christos 			 1,
    972   1.6  christos 			 regcache);
    973   1.6  christos 
    974   1.8  christos   std::vector<CORE_ADDR> next_pcs = arm_get_next_pcs (&next_pcs_ctx);
    975   1.1  christos 
    976   1.8  christos   for (CORE_ADDR &pc_ref : next_pcs)
    977   1.8  christos     pc_ref = gdbarch_addr_bits_remove (gdbarch, pc_ref);
    978   1.1  christos 
    979   1.7  christos   return next_pcs;
    980   1.1  christos }
    981   1.1  christos 
    982   1.1  christos /* Support for displaced stepping of Linux SVC instructions.  */
    983   1.1  christos 
    984   1.1  christos static void
    985   1.1  christos arm_linux_cleanup_svc (struct gdbarch *gdbarch,
    986   1.1  christos 		       struct regcache *regs,
    987  1.10  christos 		       arm_displaced_step_copy_insn_closure *dsc)
    988   1.1  christos {
    989   1.1  christos   ULONGEST apparent_pc;
    990   1.1  christos   int within_scratch;
    991   1.1  christos 
    992   1.1  christos   regcache_cooked_read_unsigned (regs, ARM_PC_REGNUM, &apparent_pc);
    993   1.1  christos 
    994   1.1  christos   within_scratch = (apparent_pc >= dsc->scratch_base
    995   1.1  christos 		    && apparent_pc < (dsc->scratch_base
    996   1.9  christos 				      + ARM_DISPLACED_MODIFIED_INSNS * 4 + 4));
    997   1.1  christos 
    998  1.10  christos   displaced_debug_printf ("PC is apparently %.8lx after SVC step %s",
    999  1.10  christos 			  (unsigned long) apparent_pc,
   1000  1.10  christos 			  (within_scratch
   1001  1.10  christos 			   ? "(within scratch space)"
   1002  1.10  christos 			   : "(outside scratch space)"));
   1003   1.1  christos 
   1004   1.1  christos   if (within_scratch)
   1005   1.5  christos     displaced_write_reg (regs, dsc, ARM_PC_REGNUM,
   1006   1.5  christos 			 dsc->insn_addr + dsc->insn_size, BRANCH_WRITE_PC);
   1007   1.1  christos }
   1008   1.1  christos 
   1009   1.1  christos static int
   1010   1.1  christos arm_linux_copy_svc (struct gdbarch *gdbarch, struct regcache *regs,
   1011  1.10  christos 		    arm_displaced_step_copy_insn_closure *dsc)
   1012   1.1  christos {
   1013   1.1  christos   CORE_ADDR return_to = 0;
   1014   1.1  christos 
   1015  1.10  christos   frame_info_ptr frame;
   1016   1.1  christos   unsigned int svc_number = displaced_read_reg (regs, dsc, 7);
   1017   1.1  christos   int is_sigreturn = 0;
   1018   1.1  christos   int is_thumb;
   1019   1.1  christos 
   1020   1.1  christos   frame = get_current_frame ();
   1021   1.1  christos 
   1022   1.1  christos   is_sigreturn = arm_linux_sigreturn_return_addr(frame, svc_number,
   1023   1.1  christos 						 &return_to, &is_thumb);
   1024   1.1  christos   if (is_sigreturn)
   1025   1.1  christos     {
   1026   1.5  christos       struct symtab_and_line sal;
   1027   1.1  christos 
   1028  1.10  christos       displaced_debug_printf ("found sigreturn/rt_sigreturn SVC call.  "
   1029  1.10  christos 			      "PC in frame = %lx",
   1030  1.10  christos 			      (unsigned long) get_frame_pc (frame));
   1031  1.10  christos 
   1032  1.10  christos       displaced_debug_printf ("unwind pc = %lx.  Setting momentary breakpoint.",
   1033  1.10  christos 			      (unsigned long) return_to);
   1034   1.5  christos 
   1035   1.5  christos       gdb_assert (inferior_thread ()->control.step_resume_breakpoint
   1036   1.5  christos 		  == NULL);
   1037   1.5  christos 
   1038   1.5  christos       sal = find_pc_line (return_to, 0);
   1039   1.5  christos       sal.pc = return_to;
   1040   1.5  christos       sal.section = find_pc_overlay (return_to);
   1041   1.5  christos       sal.explicit_pc = 1;
   1042   1.5  christos 
   1043   1.5  christos       frame = get_prev_frame (frame);
   1044   1.5  christos 
   1045   1.5  christos       if (frame)
   1046   1.5  christos 	{
   1047   1.5  christos 	  inferior_thread ()->control.step_resume_breakpoint
   1048   1.5  christos 	    = set_momentary_breakpoint (gdbarch, sal, get_frame_id (frame),
   1049   1.8  christos 					bp_step_resume).release ();
   1050   1.5  christos 
   1051   1.5  christos 	  /* We need to make sure we actually insert the momentary
   1052   1.5  christos 	     breakpoint set above.  */
   1053   1.5  christos 	  insert_breakpoints ();
   1054   1.1  christos 	}
   1055  1.10  christos       else
   1056  1.10  christos 	displaced_debug_printf ("couldn't find previous frame to set momentary "
   1057  1.10  christos 				"breakpoint for sigreturn/rt_sigreturn");
   1058   1.5  christos     }
   1059  1.10  christos   else
   1060  1.10  christos     displaced_debug_printf ("found SVC call");
   1061   1.1  christos 
   1062   1.1  christos   /* Preparation: If we detect sigreturn, set momentary breakpoint at resume
   1063   1.1  christos 		  location, else nothing.
   1064   1.1  christos      Insn: unmodified svc.
   1065   1.5  christos      Cleanup: if pc lands in scratch space, pc <- insn_addr + insn_size
   1066  1.10  christos 	      else leave pc alone.  */
   1067   1.1  christos 
   1068   1.1  christos 
   1069   1.1  christos   dsc->cleanup = &arm_linux_cleanup_svc;
   1070   1.1  christos   /* Pretend we wrote to the PC, so cleanup doesn't set PC to the next
   1071   1.1  christos      instruction.  */
   1072   1.1  christos   dsc->wrote_to_pc = 1;
   1073   1.1  christos 
   1074   1.1  christos   return 0;
   1075   1.1  christos }
   1076   1.1  christos 
   1077   1.1  christos 
   1078   1.1  christos /* The following two functions implement single-stepping over calls to Linux
   1079   1.1  christos    kernel helper routines, which perform e.g. atomic operations on architecture
   1080   1.1  christos    variants which don't support them natively.
   1081   1.1  christos 
   1082   1.1  christos    When this function is called, the PC will be pointing at the kernel helper
   1083   1.1  christos    (at an address inaccessible to GDB), and r14 will point to the return
   1084   1.1  christos    address.  Displaced stepping always executes code in the copy area:
   1085   1.1  christos    so, make the copy-area instruction branch back to the kernel helper (the
   1086   1.1  christos    "from" address), and make r14 point to the breakpoint in the copy area.  In
   1087   1.1  christos    that way, we regain control once the kernel helper returns, and can clean
   1088   1.1  christos    up appropriately (as if we had just returned from the kernel helper as it
   1089   1.1  christos    would have been called from the non-displaced location).  */
   1090   1.1  christos 
   1091   1.1  christos static void
   1092   1.1  christos cleanup_kernel_helper_return (struct gdbarch *gdbarch,
   1093   1.1  christos 			      struct regcache *regs,
   1094  1.10  christos 			      arm_displaced_step_copy_insn_closure *dsc)
   1095   1.1  christos {
   1096   1.1  christos   displaced_write_reg (regs, dsc, ARM_LR_REGNUM, dsc->tmp[0], CANNOT_WRITE_PC);
   1097   1.1  christos   displaced_write_reg (regs, dsc, ARM_PC_REGNUM, dsc->tmp[0], BRANCH_WRITE_PC);
   1098   1.1  christos }
   1099   1.1  christos 
   1100   1.1  christos static void
   1101   1.1  christos arm_catch_kernel_helper_return (struct gdbarch *gdbarch, CORE_ADDR from,
   1102   1.1  christos 				CORE_ADDR to, struct regcache *regs,
   1103  1.10  christos 				arm_displaced_step_copy_insn_closure *dsc)
   1104   1.1  christos {
   1105   1.1  christos   enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   1106   1.1  christos 
   1107   1.1  christos   dsc->numinsns = 1;
   1108   1.1  christos   dsc->insn_addr = from;
   1109   1.1  christos   dsc->cleanup = &cleanup_kernel_helper_return;
   1110   1.1  christos   /* Say we wrote to the PC, else cleanup will set PC to the next
   1111   1.1  christos      instruction in the helper, which isn't helpful.  */
   1112   1.1  christos   dsc->wrote_to_pc = 1;
   1113   1.1  christos 
   1114   1.1  christos   /* Preparation: tmp[0] <- r14
   1115  1.10  christos 		  r14 <- <scratch space>+4
   1116   1.1  christos 		  *(<scratch space>+8) <- from
   1117   1.1  christos      Insn: ldr pc, [r14, #4]
   1118   1.1  christos      Cleanup: r14 <- tmp[0], pc <- tmp[0].  */
   1119   1.1  christos 
   1120   1.1  christos   dsc->tmp[0] = displaced_read_reg (regs, dsc, ARM_LR_REGNUM);
   1121   1.1  christos   displaced_write_reg (regs, dsc, ARM_LR_REGNUM, (ULONGEST) to + 4,
   1122   1.1  christos 		       CANNOT_WRITE_PC);
   1123   1.1  christos   write_memory_unsigned_integer (to + 8, 4, byte_order, from);
   1124   1.1  christos 
   1125   1.1  christos   dsc->modinsn[0] = 0xe59ef004;  /* ldr pc, [lr, #4].  */
   1126   1.1  christos }
   1127   1.1  christos 
   1128   1.1  christos /* Linux-specific displaced step instruction copying function.  Detects when
   1129   1.1  christos    the program has stepped into a Linux kernel helper routine (which must be
   1130   1.6  christos    handled as a special case).  */
   1131   1.1  christos 
   1132  1.10  christos static displaced_step_copy_insn_closure_up
   1133   1.1  christos arm_linux_displaced_step_copy_insn (struct gdbarch *gdbarch,
   1134   1.1  christos 				    CORE_ADDR from, CORE_ADDR to,
   1135   1.1  christos 				    struct regcache *regs)
   1136   1.1  christos {
   1137  1.10  christos   std::unique_ptr<arm_displaced_step_copy_insn_closure> dsc
   1138  1.10  christos     (new arm_displaced_step_copy_insn_closure);
   1139   1.1  christos 
   1140   1.1  christos   /* Detect when we enter an (inaccessible by GDB) Linux kernel helper, and
   1141   1.1  christos      stop at the return location.  */
   1142   1.1  christos   if (from > 0xffff0000)
   1143   1.1  christos     {
   1144  1.10  christos       displaced_debug_printf ("detected kernel helper at %.8lx",
   1145  1.10  christos 			      (unsigned long) from);
   1146   1.1  christos 
   1147   1.9  christos       arm_catch_kernel_helper_return (gdbarch, from, to, regs, dsc.get ());
   1148   1.1  christos     }
   1149   1.1  christos   else
   1150   1.1  christos     {
   1151   1.1  christos       /* Override the default handling of SVC instructions.  */
   1152   1.1  christos       dsc->u.svc.copy_svc_os = arm_linux_copy_svc;
   1153   1.1  christos 
   1154   1.9  christos       arm_process_displaced_insn (gdbarch, from, to, regs, dsc.get ());
   1155   1.1  christos     }
   1156   1.1  christos 
   1157   1.9  christos   arm_displaced_init_closure (gdbarch, from, to, dsc.get ());
   1158   1.1  christos 
   1159   1.9  christos   /* This is a work around for a problem with g++ 4.8.  */
   1160  1.10  christos   return displaced_step_copy_insn_closure_up (dsc.release ());
   1161   1.1  christos }
   1162   1.1  christos 
   1163   1.1  christos /* Implementation of `gdbarch_stap_is_single_operand', as defined in
   1164   1.1  christos    gdbarch.h.  */
   1165   1.1  christos 
   1166   1.1  christos static int
   1167   1.1  christos arm_stap_is_single_operand (struct gdbarch *gdbarch, const char *s)
   1168   1.1  christos {
   1169  1.11  christos   return (*s == '#' || *s == '$' || isdigit ((unsigned char)*s) /* Literal number.  */
   1170   1.1  christos 	  || *s == '[' /* Register indirection or
   1171   1.1  christos 			  displacement.  */
   1172  1.11  christos 	  || isalpha ((unsigned char)*s)); /* Register value.  */
   1173   1.1  christos }
   1174   1.1  christos 
   1175   1.1  christos /* This routine is used to parse a special token in ARM's assembly.
   1176   1.1  christos 
   1177   1.1  christos    The special tokens parsed by it are:
   1178   1.1  christos 
   1179   1.1  christos       - Register displacement (e.g, [fp, #-8])
   1180   1.1  christos 
   1181   1.1  christos    It returns one if the special token has been parsed successfully,
   1182   1.1  christos    or zero if the current token is not considered special.  */
   1183   1.1  christos 
   1184  1.10  christos static expr::operation_up
   1185   1.1  christos arm_stap_parse_special_token (struct gdbarch *gdbarch,
   1186   1.1  christos 			      struct stap_parse_info *p)
   1187   1.1  christos {
   1188   1.1  christos   if (*p->arg == '[')
   1189   1.1  christos     {
   1190   1.1  christos       /* Temporary holder for lookahead.  */
   1191   1.1  christos       const char *tmp = p->arg;
   1192   1.1  christos       char *endp;
   1193   1.1  christos       /* Used to save the register name.  */
   1194   1.1  christos       const char *start;
   1195   1.1  christos       char *regname;
   1196   1.1  christos       int len, offset;
   1197   1.1  christos       int got_minus = 0;
   1198   1.1  christos       long displacement;
   1199   1.1  christos 
   1200   1.1  christos       ++tmp;
   1201   1.1  christos       start = tmp;
   1202   1.1  christos 
   1203   1.1  christos       /* Register name.  */
   1204  1.11  christos       while (isalnum ((unsigned char)*tmp))
   1205   1.1  christos 	++tmp;
   1206   1.1  christos 
   1207   1.1  christos       if (*tmp != ',')
   1208  1.10  christos 	return {};
   1209   1.1  christos 
   1210   1.1  christos       len = tmp - start;
   1211   1.6  christos       regname = (char *) alloca (len + 2);
   1212   1.1  christos 
   1213   1.1  christos       offset = 0;
   1214  1.11  christos       if (isdigit ((unsigned char)*start))
   1215   1.1  christos 	{
   1216   1.1  christos 	  /* If we are dealing with a register whose name begins with a
   1217   1.1  christos 	     digit, it means we should prefix the name with the letter
   1218   1.1  christos 	     `r', because GDB expects this name pattern.  Otherwise (e.g.,
   1219   1.1  christos 	     we are dealing with the register `fp'), we don't need to
   1220   1.1  christos 	     add such a prefix.  */
   1221   1.1  christos 	  regname[0] = 'r';
   1222   1.1  christos 	  offset = 1;
   1223   1.1  christos 	}
   1224   1.1  christos 
   1225   1.1  christos       strncpy (regname + offset, start, len);
   1226   1.1  christos       len += offset;
   1227   1.1  christos       regname[len] = '\0';
   1228   1.1  christos 
   1229   1.1  christos       if (user_reg_map_name_to_regnum (gdbarch, regname, len) == -1)
   1230   1.1  christos 	error (_("Invalid register name `%s' on expression `%s'."),
   1231   1.1  christos 	       regname, p->saved_arg);
   1232   1.1  christos 
   1233   1.1  christos       ++tmp;
   1234   1.8  christos       tmp = skip_spaces (tmp);
   1235   1.1  christos       if (*tmp == '#' || *tmp == '$')
   1236   1.1  christos 	++tmp;
   1237   1.1  christos 
   1238   1.1  christos       if (*tmp == '-')
   1239   1.1  christos 	{
   1240   1.1  christos 	  ++tmp;
   1241   1.1  christos 	  got_minus = 1;
   1242   1.1  christos 	}
   1243   1.1  christos 
   1244   1.1  christos       displacement = strtol (tmp, &endp, 10);
   1245   1.1  christos       tmp = endp;
   1246   1.1  christos 
   1247   1.1  christos       /* Skipping last `]'.  */
   1248   1.1  christos       if (*tmp++ != ']')
   1249  1.10  christos 	return {};
   1250  1.10  christos       p->arg = tmp;
   1251  1.10  christos 
   1252  1.10  christos       using namespace expr;
   1253   1.1  christos 
   1254   1.1  christos       /* The displacement.  */
   1255  1.10  christos       struct type *long_type = builtin_type (gdbarch)->builtin_long;
   1256   1.1  christos       if (got_minus)
   1257  1.10  christos 	displacement = -displacement;
   1258  1.10  christos       operation_up disp = make_operation<long_const_operation> (long_type,
   1259  1.10  christos 								displacement);
   1260   1.1  christos 
   1261   1.1  christos       /* The register name.  */
   1262  1.10  christos       operation_up reg
   1263  1.10  christos 	= make_operation<register_operation> (regname);
   1264   1.1  christos 
   1265  1.10  christos       operation_up sum
   1266  1.10  christos 	= make_operation<add_operation> (std::move (reg), std::move (disp));
   1267   1.1  christos 
   1268   1.1  christos       /* Casting to the expected type.  */
   1269  1.10  christos       struct type *arg_ptr_type = lookup_pointer_type (p->arg_type);
   1270  1.10  christos       sum = make_operation<unop_cast_operation> (std::move (sum),
   1271  1.10  christos 						 arg_ptr_type);
   1272  1.10  christos       return make_operation<unop_ind_operation> (std::move (sum));
   1273   1.1  christos     }
   1274   1.1  christos 
   1275  1.10  christos   return {};
   1276   1.1  christos }
   1277   1.1  christos 
   1278   1.3  christos /* ARM process record-replay constructs: syscall, signal etc.  */
   1279   1.3  christos 
   1280  1.10  christos static linux_record_tdep arm_linux_record_tdep;
   1281   1.3  christos 
   1282   1.3  christos /* arm_canonicalize_syscall maps from the native arm Linux set
   1283   1.3  christos    of syscall ids into a canonical set of syscall ids used by
   1284   1.3  christos    process record.  */
   1285   1.3  christos 
   1286   1.3  christos static enum gdb_syscall
   1287   1.3  christos arm_canonicalize_syscall (int syscall)
   1288   1.3  christos {
   1289   1.6  christos   switch (syscall)
   1290   1.6  christos     {
   1291   1.6  christos     case 0: return gdb_sys_restart_syscall;
   1292   1.6  christos     case 1: return gdb_sys_exit;
   1293   1.6  christos     case 2: return gdb_sys_fork;
   1294   1.6  christos     case 3: return gdb_sys_read;
   1295   1.6  christos     case 4: return gdb_sys_write;
   1296   1.6  christos     case 5: return gdb_sys_open;
   1297   1.6  christos     case 6: return gdb_sys_close;
   1298   1.6  christos     case 8: return gdb_sys_creat;
   1299   1.6  christos     case 9: return gdb_sys_link;
   1300   1.6  christos     case 10: return gdb_sys_unlink;
   1301  1.11  christos     case arm_sys_execve: return gdb_sys_execve;
   1302   1.6  christos     case 12: return gdb_sys_chdir;
   1303   1.6  christos     case 13: return gdb_sys_time;
   1304   1.6  christos     case 14: return gdb_sys_mknod;
   1305   1.6  christos     case 15: return gdb_sys_chmod;
   1306   1.6  christos     case 16: return gdb_sys_lchown16;
   1307   1.6  christos     case 19: return gdb_sys_lseek;
   1308   1.6  christos     case 20: return gdb_sys_getpid;
   1309   1.6  christos     case 21: return gdb_sys_mount;
   1310   1.6  christos     case 22: return gdb_sys_oldumount;
   1311   1.6  christos     case 23: return gdb_sys_setuid16;
   1312   1.6  christos     case 24: return gdb_sys_getuid16;
   1313   1.6  christos     case 25: return gdb_sys_stime;
   1314   1.6  christos     case 26: return gdb_sys_ptrace;
   1315   1.6  christos     case 27: return gdb_sys_alarm;
   1316   1.6  christos     case 29: return gdb_sys_pause;
   1317   1.6  christos     case 30: return gdb_sys_utime;
   1318   1.6  christos     case 33: return gdb_sys_access;
   1319   1.6  christos     case 34: return gdb_sys_nice;
   1320   1.6  christos     case 36: return gdb_sys_sync;
   1321   1.6  christos     case 37: return gdb_sys_kill;
   1322   1.6  christos     case 38: return gdb_sys_rename;
   1323   1.6  christos     case 39: return gdb_sys_mkdir;
   1324   1.6  christos     case 40: return gdb_sys_rmdir;
   1325   1.6  christos     case 41: return gdb_sys_dup;
   1326   1.6  christos     case 42: return gdb_sys_pipe;
   1327   1.6  christos     case 43: return gdb_sys_times;
   1328   1.6  christos     case 45: return gdb_sys_brk;
   1329   1.6  christos     case 46: return gdb_sys_setgid16;
   1330   1.6  christos     case 47: return gdb_sys_getgid16;
   1331   1.6  christos     case 49: return gdb_sys_geteuid16;
   1332   1.6  christos     case 50: return gdb_sys_getegid16;
   1333   1.6  christos     case 51: return gdb_sys_acct;
   1334   1.6  christos     case 52: return gdb_sys_umount;
   1335   1.6  christos     case 54: return gdb_sys_ioctl;
   1336   1.6  christos     case 55: return gdb_sys_fcntl;
   1337   1.6  christos     case 57: return gdb_sys_setpgid;
   1338   1.6  christos     case 60: return gdb_sys_umask;
   1339   1.6  christos     case 61: return gdb_sys_chroot;
   1340   1.6  christos     case 62: return gdb_sys_ustat;
   1341   1.6  christos     case 63: return gdb_sys_dup2;
   1342   1.6  christos     case 64: return gdb_sys_getppid;
   1343   1.6  christos     case 65: return gdb_sys_getpgrp;
   1344   1.6  christos     case 66: return gdb_sys_setsid;
   1345   1.6  christos     case 67: return gdb_sys_sigaction;
   1346   1.6  christos     case 70: return gdb_sys_setreuid16;
   1347   1.6  christos     case 71: return gdb_sys_setregid16;
   1348   1.6  christos     case 72: return gdb_sys_sigsuspend;
   1349   1.6  christos     case 73: return gdb_sys_sigpending;
   1350   1.6  christos     case 74: return gdb_sys_sethostname;
   1351   1.6  christos     case 75: return gdb_sys_setrlimit;
   1352   1.6  christos     case 76: return gdb_sys_getrlimit;
   1353   1.6  christos     case 77: return gdb_sys_getrusage;
   1354   1.6  christos     case 78: return gdb_sys_gettimeofday;
   1355   1.6  christos     case 79: return gdb_sys_settimeofday;
   1356   1.6  christos     case 80: return gdb_sys_getgroups16;
   1357   1.6  christos     case 81: return gdb_sys_setgroups16;
   1358   1.6  christos     case 82: return gdb_sys_select;
   1359   1.6  christos     case 83: return gdb_sys_symlink;
   1360   1.6  christos     case 85: return gdb_sys_readlink;
   1361   1.6  christos     case 86: return gdb_sys_uselib;
   1362   1.6  christos     case 87: return gdb_sys_swapon;
   1363   1.6  christos     case 88: return gdb_sys_reboot;
   1364   1.6  christos     case 89: return gdb_old_readdir;
   1365   1.6  christos     case 90: return gdb_old_mmap;
   1366   1.6  christos     case 91: return gdb_sys_munmap;
   1367   1.6  christos     case 92: return gdb_sys_truncate;
   1368   1.6  christos     case 93: return gdb_sys_ftruncate;
   1369   1.6  christos     case 94: return gdb_sys_fchmod;
   1370   1.6  christos     case 95: return gdb_sys_fchown16;
   1371   1.6  christos     case 96: return gdb_sys_getpriority;
   1372   1.6  christos     case 97: return gdb_sys_setpriority;
   1373   1.6  christos     case 99: return gdb_sys_statfs;
   1374   1.6  christos     case 100: return gdb_sys_fstatfs;
   1375   1.6  christos     case 102: return gdb_sys_socketcall;
   1376   1.6  christos     case 103: return gdb_sys_syslog;
   1377   1.6  christos     case 104: return gdb_sys_setitimer;
   1378   1.6  christos     case 105: return gdb_sys_getitimer;
   1379   1.6  christos     case 106: return gdb_sys_stat;
   1380   1.6  christos     case 107: return gdb_sys_lstat;
   1381   1.6  christos     case 108: return gdb_sys_fstat;
   1382   1.6  christos     case 111: return gdb_sys_vhangup;
   1383   1.6  christos     case 113: /* sys_syscall */
   1384   1.6  christos       return gdb_sys_no_syscall;
   1385   1.6  christos     case 114: return gdb_sys_wait4;
   1386   1.6  christos     case 115: return gdb_sys_swapoff;
   1387   1.6  christos     case 116: return gdb_sys_sysinfo;
   1388   1.6  christos     case 117: return gdb_sys_ipc;
   1389   1.6  christos     case 118: return gdb_sys_fsync;
   1390   1.6  christos     case 119: return gdb_sys_sigreturn;
   1391   1.6  christos     case 120: return gdb_sys_clone;
   1392   1.6  christos     case 121: return gdb_sys_setdomainname;
   1393   1.6  christos     case 122: return gdb_sys_uname;
   1394   1.6  christos     case 124: return gdb_sys_adjtimex;
   1395   1.6  christos     case 125: return gdb_sys_mprotect;
   1396   1.6  christos     case 126: return gdb_sys_sigprocmask;
   1397   1.6  christos     case 128: return gdb_sys_init_module;
   1398   1.6  christos     case 129: return gdb_sys_delete_module;
   1399   1.6  christos     case 131: return gdb_sys_quotactl;
   1400   1.6  christos     case 132: return gdb_sys_getpgid;
   1401   1.6  christos     case 133: return gdb_sys_fchdir;
   1402   1.6  christos     case 134: return gdb_sys_bdflush;
   1403   1.6  christos     case 135: return gdb_sys_sysfs;
   1404   1.6  christos     case 136: return gdb_sys_personality;
   1405   1.6  christos     case 138: return gdb_sys_setfsuid16;
   1406   1.6  christos     case 139: return gdb_sys_setfsgid16;
   1407   1.6  christos     case 140: return gdb_sys_llseek;
   1408   1.6  christos     case 141: return gdb_sys_getdents;
   1409   1.6  christos     case 142: return gdb_sys_select;
   1410   1.6  christos     case 143: return gdb_sys_flock;
   1411   1.6  christos     case 144: return gdb_sys_msync;
   1412   1.6  christos     case 145: return gdb_sys_readv;
   1413   1.6  christos     case 146: return gdb_sys_writev;
   1414   1.6  christos     case 147: return gdb_sys_getsid;
   1415   1.6  christos     case 148: return gdb_sys_fdatasync;
   1416   1.6  christos     case 149: return gdb_sys_sysctl;
   1417   1.6  christos     case 150: return gdb_sys_mlock;
   1418   1.6  christos     case 151: return gdb_sys_munlock;
   1419   1.6  christos     case 152: return gdb_sys_mlockall;
   1420   1.6  christos     case 153: return gdb_sys_munlockall;
   1421   1.6  christos     case 154: return gdb_sys_sched_setparam;
   1422   1.6  christos     case 155: return gdb_sys_sched_getparam;
   1423   1.6  christos     case 156: return gdb_sys_sched_setscheduler;
   1424   1.6  christos     case 157: return gdb_sys_sched_getscheduler;
   1425   1.6  christos     case 158: return gdb_sys_sched_yield;
   1426   1.6  christos     case 159: return gdb_sys_sched_get_priority_max;
   1427   1.6  christos     case 160: return gdb_sys_sched_get_priority_min;
   1428   1.6  christos     case 161: return gdb_sys_sched_rr_get_interval;
   1429   1.6  christos     case 162: return gdb_sys_nanosleep;
   1430   1.6  christos     case 163: return gdb_sys_mremap;
   1431   1.6  christos     case 164: return gdb_sys_setresuid16;
   1432   1.6  christos     case 165: return gdb_sys_getresuid16;
   1433   1.6  christos     case 168: return gdb_sys_poll;
   1434   1.6  christos     case 169: return gdb_sys_nfsservctl;
   1435   1.6  christos     case 170: return gdb_sys_setresgid;
   1436   1.6  christos     case 171: return gdb_sys_getresgid;
   1437   1.6  christos     case 172: return gdb_sys_prctl;
   1438   1.6  christos     case 173: return gdb_sys_rt_sigreturn;
   1439   1.6  christos     case 174: return gdb_sys_rt_sigaction;
   1440   1.6  christos     case 175: return gdb_sys_rt_sigprocmask;
   1441   1.6  christos     case 176: return gdb_sys_rt_sigpending;
   1442   1.6  christos     case 177: return gdb_sys_rt_sigtimedwait;
   1443   1.6  christos     case 178: return gdb_sys_rt_sigqueueinfo;
   1444   1.6  christos     case 179: return gdb_sys_rt_sigsuspend;
   1445   1.6  christos     case 180: return gdb_sys_pread64;
   1446   1.6  christos     case 181: return gdb_sys_pwrite64;
   1447   1.6  christos     case 182: return gdb_sys_chown;
   1448   1.6  christos     case 183: return gdb_sys_getcwd;
   1449   1.6  christos     case 184: return gdb_sys_capget;
   1450   1.6  christos     case 185: return gdb_sys_capset;
   1451   1.6  christos     case 186: return gdb_sys_sigaltstack;
   1452   1.6  christos     case 187: return gdb_sys_sendfile;
   1453   1.6  christos     case 190: return gdb_sys_vfork;
   1454   1.6  christos     case 191: return gdb_sys_getrlimit;
   1455   1.6  christos     case 192: return gdb_sys_mmap2;
   1456   1.6  christos     case 193: return gdb_sys_truncate64;
   1457   1.6  christos     case 194: return gdb_sys_ftruncate64;
   1458   1.6  christos     case 195: return gdb_sys_stat64;
   1459   1.6  christos     case 196: return gdb_sys_lstat64;
   1460   1.6  christos     case 197: return gdb_sys_fstat64;
   1461   1.6  christos     case 198: return gdb_sys_lchown;
   1462   1.6  christos     case 199: return gdb_sys_getuid;
   1463   1.6  christos     case 200: return gdb_sys_getgid;
   1464   1.6  christos     case 201: return gdb_sys_geteuid;
   1465   1.6  christos     case 202: return gdb_sys_getegid;
   1466   1.6  christos     case 203: return gdb_sys_setreuid;
   1467   1.6  christos     case 204: return gdb_sys_setregid;
   1468   1.6  christos     case 205: return gdb_sys_getgroups;
   1469   1.6  christos     case 206: return gdb_sys_setgroups;
   1470   1.6  christos     case 207: return gdb_sys_fchown;
   1471   1.6  christos     case 208: return gdb_sys_setresuid;
   1472   1.6  christos     case 209: return gdb_sys_getresuid;
   1473   1.6  christos     case 210: return gdb_sys_setresgid;
   1474   1.6  christos     case 211: return gdb_sys_getresgid;
   1475   1.6  christos     case 212: return gdb_sys_chown;
   1476   1.6  christos     case 213: return gdb_sys_setuid;
   1477   1.6  christos     case 214: return gdb_sys_setgid;
   1478   1.6  christos     case 215: return gdb_sys_setfsuid;
   1479   1.6  christos     case 216: return gdb_sys_setfsgid;
   1480   1.6  christos     case 217: return gdb_sys_getdents64;
   1481   1.6  christos     case 218: return gdb_sys_pivot_root;
   1482   1.6  christos     case 219: return gdb_sys_mincore;
   1483   1.6  christos     case 220: return gdb_sys_madvise;
   1484   1.6  christos     case 221: return gdb_sys_fcntl64;
   1485   1.6  christos     case 224: return gdb_sys_gettid;
   1486   1.6  christos     case 225: return gdb_sys_readahead;
   1487   1.6  christos     case 226: return gdb_sys_setxattr;
   1488   1.6  christos     case 227: return gdb_sys_lsetxattr;
   1489   1.6  christos     case 228: return gdb_sys_fsetxattr;
   1490   1.6  christos     case 229: return gdb_sys_getxattr;
   1491   1.6  christos     case 230: return gdb_sys_lgetxattr;
   1492   1.6  christos     case 231: return gdb_sys_fgetxattr;
   1493   1.6  christos     case 232: return gdb_sys_listxattr;
   1494   1.6  christos     case 233: return gdb_sys_llistxattr;
   1495   1.6  christos     case 234: return gdb_sys_flistxattr;
   1496   1.6  christos     case 235: return gdb_sys_removexattr;
   1497   1.6  christos     case 236: return gdb_sys_lremovexattr;
   1498   1.6  christos     case 237: return gdb_sys_fremovexattr;
   1499   1.6  christos     case 238: return gdb_sys_tkill;
   1500   1.6  christos     case 239: return gdb_sys_sendfile64;
   1501   1.6  christos     case 240: return gdb_sys_futex;
   1502   1.6  christos     case 241: return gdb_sys_sched_setaffinity;
   1503   1.6  christos     case 242: return gdb_sys_sched_getaffinity;
   1504   1.6  christos     case 243: return gdb_sys_io_setup;
   1505   1.6  christos     case 244: return gdb_sys_io_destroy;
   1506   1.6  christos     case 245: return gdb_sys_io_getevents;
   1507   1.6  christos     case 246: return gdb_sys_io_submit;
   1508   1.6  christos     case 247: return gdb_sys_io_cancel;
   1509   1.6  christos     case 248: return gdb_sys_exit_group;
   1510   1.6  christos     case 249: return gdb_sys_lookup_dcookie;
   1511   1.6  christos     case 250: return gdb_sys_epoll_create;
   1512   1.6  christos     case 251: return gdb_sys_epoll_ctl;
   1513   1.6  christos     case 252: return gdb_sys_epoll_wait;
   1514   1.6  christos     case 253: return gdb_sys_remap_file_pages;
   1515   1.6  christos     case 256: return gdb_sys_set_tid_address;
   1516   1.6  christos     case 257: return gdb_sys_timer_create;
   1517   1.6  christos     case 258: return gdb_sys_timer_settime;
   1518   1.6  christos     case 259: return gdb_sys_timer_gettime;
   1519   1.6  christos     case 260: return gdb_sys_timer_getoverrun;
   1520   1.6  christos     case 261: return gdb_sys_timer_delete;
   1521   1.6  christos     case 262: return gdb_sys_clock_settime;
   1522   1.6  christos     case 263: return gdb_sys_clock_gettime;
   1523   1.6  christos     case 264: return gdb_sys_clock_getres;
   1524   1.6  christos     case 265: return gdb_sys_clock_nanosleep;
   1525   1.6  christos     case 266: return gdb_sys_statfs64;
   1526   1.6  christos     case 267: return gdb_sys_fstatfs64;
   1527   1.6  christos     case 268: return gdb_sys_tgkill;
   1528   1.6  christos     case 269: return gdb_sys_utimes;
   1529   1.6  christos       /*
   1530   1.6  christos     case 270: return gdb_sys_arm_fadvise64_64;
   1531   1.6  christos     case 271: return gdb_sys_pciconfig_iobase;
   1532   1.6  christos     case 272: return gdb_sys_pciconfig_read;
   1533   1.6  christos     case 273: return gdb_sys_pciconfig_write;
   1534   1.6  christos       */
   1535   1.6  christos     case 274: return gdb_sys_mq_open;
   1536   1.6  christos     case 275: return gdb_sys_mq_unlink;
   1537   1.6  christos     case 276: return gdb_sys_mq_timedsend;
   1538   1.6  christos     case 277: return gdb_sys_mq_timedreceive;
   1539   1.6  christos     case 278: return gdb_sys_mq_notify;
   1540   1.6  christos     case 279: return gdb_sys_mq_getsetattr;
   1541   1.6  christos     case 280: return gdb_sys_waitid;
   1542   1.6  christos     case 281: return gdb_sys_socket;
   1543   1.6  christos     case 282: return gdb_sys_bind;
   1544   1.6  christos     case 283: return gdb_sys_connect;
   1545   1.6  christos     case 284: return gdb_sys_listen;
   1546   1.6  christos     case 285: return gdb_sys_accept;
   1547   1.6  christos     case 286: return gdb_sys_getsockname;
   1548   1.6  christos     case 287: return gdb_sys_getpeername;
   1549   1.6  christos     case 288: return gdb_sys_socketpair;
   1550   1.6  christos     case 289: /* send */ return gdb_sys_no_syscall;
   1551   1.6  christos     case 290: return gdb_sys_sendto;
   1552   1.6  christos     case 291: return gdb_sys_recv;
   1553   1.6  christos     case 292: return gdb_sys_recvfrom;
   1554   1.6  christos     case 293: return gdb_sys_shutdown;
   1555   1.6  christos     case 294: return gdb_sys_setsockopt;
   1556   1.6  christos     case 295: return gdb_sys_getsockopt;
   1557   1.6  christos     case 296: return gdb_sys_sendmsg;
   1558   1.6  christos     case 297: return gdb_sys_recvmsg;
   1559   1.6  christos     case 298: return gdb_sys_semop;
   1560   1.6  christos     case 299: return gdb_sys_semget;
   1561   1.6  christos     case 300: return gdb_sys_semctl;
   1562   1.6  christos     case 301: return gdb_sys_msgsnd;
   1563   1.6  christos     case 302: return gdb_sys_msgrcv;
   1564   1.6  christos     case 303: return gdb_sys_msgget;
   1565   1.6  christos     case 304: return gdb_sys_msgctl;
   1566   1.6  christos     case 305: return gdb_sys_shmat;
   1567   1.6  christos     case 306: return gdb_sys_shmdt;
   1568   1.6  christos     case 307: return gdb_sys_shmget;
   1569   1.6  christos     case 308: return gdb_sys_shmctl;
   1570   1.6  christos     case 309: return gdb_sys_add_key;
   1571   1.6  christos     case 310: return gdb_sys_request_key;
   1572   1.6  christos     case 311: return gdb_sys_keyctl;
   1573   1.6  christos     case 312: return gdb_sys_semtimedop;
   1574   1.6  christos     case 313: /* vserver */ return gdb_sys_no_syscall;
   1575   1.6  christos     case 314: return gdb_sys_ioprio_set;
   1576   1.6  christos     case 315: return gdb_sys_ioprio_get;
   1577   1.6  christos     case 316: return gdb_sys_inotify_init;
   1578   1.6  christos     case 317: return gdb_sys_inotify_add_watch;
   1579   1.6  christos     case 318: return gdb_sys_inotify_rm_watch;
   1580   1.6  christos     case 319: return gdb_sys_mbind;
   1581   1.6  christos     case 320: return gdb_sys_get_mempolicy;
   1582   1.6  christos     case 321: return gdb_sys_set_mempolicy;
   1583   1.6  christos     case 322: return gdb_sys_openat;
   1584   1.6  christos     case 323: return gdb_sys_mkdirat;
   1585   1.6  christos     case 324: return gdb_sys_mknodat;
   1586   1.6  christos     case 325: return gdb_sys_fchownat;
   1587   1.6  christos     case 326: return gdb_sys_futimesat;
   1588   1.6  christos     case 327: return gdb_sys_fstatat64;
   1589   1.6  christos     case 328: return gdb_sys_unlinkat;
   1590   1.6  christos     case 329: return gdb_sys_renameat;
   1591   1.6  christos     case 330: return gdb_sys_linkat;
   1592   1.6  christos     case 331: return gdb_sys_symlinkat;
   1593   1.6  christos     case 332: return gdb_sys_readlinkat;
   1594   1.6  christos     case 333: return gdb_sys_fchmodat;
   1595   1.6  christos     case 334: return gdb_sys_faccessat;
   1596   1.6  christos     case 335: return gdb_sys_pselect6;
   1597   1.6  christos     case 336: return gdb_sys_ppoll;
   1598   1.6  christos     case 337: return gdb_sys_unshare;
   1599   1.6  christos     case 338: return gdb_sys_set_robust_list;
   1600   1.6  christos     case 339: return gdb_sys_get_robust_list;
   1601   1.6  christos     case 340: return gdb_sys_splice;
   1602   1.6  christos     /*case 341: return gdb_sys_arm_sync_file_range;*/
   1603   1.6  christos     case 342: return gdb_sys_tee;
   1604   1.6  christos     case 343: return gdb_sys_vmsplice;
   1605   1.6  christos     case 344: return gdb_sys_move_pages;
   1606   1.6  christos     case 345: return gdb_sys_getcpu;
   1607   1.6  christos     case 346: return gdb_sys_epoll_pwait;
   1608   1.6  christos     case 347: return gdb_sys_kexec_load;
   1609   1.6  christos       /*
   1610   1.6  christos     case 348: return gdb_sys_utimensat;
   1611   1.6  christos     case 349: return gdb_sys_signalfd;
   1612   1.6  christos     case 350: return gdb_sys_timerfd_create;
   1613   1.6  christos     case 351: return gdb_sys_eventfd;
   1614   1.6  christos       */
   1615   1.6  christos     case 352: return gdb_sys_fallocate;
   1616   1.6  christos       /*
   1617   1.6  christos     case 353: return gdb_sys_timerfd_settime;
   1618   1.6  christos     case 354: return gdb_sys_timerfd_gettime;
   1619   1.6  christos     case 355: return gdb_sys_signalfd4;
   1620   1.6  christos       */
   1621   1.6  christos     case 356: return gdb_sys_eventfd2;
   1622   1.6  christos     case 357: return gdb_sys_epoll_create1;
   1623   1.6  christos     case 358: return gdb_sys_dup3;
   1624   1.6  christos     case 359: return gdb_sys_pipe2;
   1625   1.6  christos     case 360: return gdb_sys_inotify_init1;
   1626   1.6  christos       /*
   1627   1.6  christos     case 361: return gdb_sys_preadv;
   1628   1.6  christos     case 362: return gdb_sys_pwritev;
   1629   1.6  christos     case 363: return gdb_sys_rt_tgsigqueueinfo;
   1630   1.6  christos     case 364: return gdb_sys_perf_event_open;
   1631   1.6  christos     case 365: return gdb_sys_recvmmsg;
   1632   1.6  christos     case 366: return gdb_sys_accept4;
   1633   1.6  christos     case 367: return gdb_sys_fanotify_init;
   1634   1.6  christos     case 368: return gdb_sys_fanotify_mark;
   1635   1.6  christos     case 369: return gdb_sys_prlimit64;
   1636   1.6  christos     case 370: return gdb_sys_name_to_handle_at;
   1637   1.6  christos     case 371: return gdb_sys_open_by_handle_at;
   1638   1.6  christos     case 372: return gdb_sys_clock_adjtime;
   1639   1.6  christos     case 373: return gdb_sys_syncfs;
   1640   1.6  christos     case 374: return gdb_sys_sendmmsg;
   1641   1.6  christos     case 375: return gdb_sys_setns;
   1642   1.6  christos     case 376: return gdb_sys_process_vm_readv;
   1643   1.6  christos     case 377: return gdb_sys_process_vm_writev;
   1644   1.6  christos     case 378: return gdb_sys_kcmp;
   1645   1.6  christos     case 379: return gdb_sys_finit_module;
   1646   1.6  christos       */
   1647  1.10  christos     case 384: return gdb_sys_getrandom;
   1648  1.12  christos     case 397: return gdb_sys_statx;
   1649  1.12  christos     case 403: return gdb_sys_clock_gettime64;
   1650   1.6  christos     case 983041: /* ARM_breakpoint */ return gdb_sys_no_syscall;
   1651   1.6  christos     case 983042: /* ARM_cacheflush */ return gdb_sys_no_syscall;
   1652   1.6  christos     case 983043: /* ARM_usr26 */ return gdb_sys_no_syscall;
   1653   1.6  christos     case 983044: /* ARM_usr32 */ return gdb_sys_no_syscall;
   1654   1.6  christos     case 983045: /* ARM_set_tls */ return gdb_sys_no_syscall;
   1655   1.6  christos     default: return gdb_sys_no_syscall;
   1656   1.6  christos     }
   1657   1.3  christos }
   1658   1.3  christos 
   1659   1.3  christos /* Record all registers but PC register for process-record.  */
   1660   1.3  christos 
   1661   1.3  christos static int
   1662   1.3  christos arm_all_but_pc_registers_record (struct regcache *regcache)
   1663   1.3  christos {
   1664   1.3  christos   int i;
   1665   1.3  christos 
   1666   1.3  christos   for (i = 0; i < ARM_PC_REGNUM; i++)
   1667   1.3  christos     {
   1668   1.3  christos       if (record_full_arch_list_add_reg (regcache, ARM_A1_REGNUM + i))
   1669  1.10  christos 	return -1;
   1670   1.3  christos     }
   1671   1.3  christos 
   1672   1.3  christos   if (record_full_arch_list_add_reg (regcache, ARM_PS_REGNUM))
   1673   1.3  christos     return -1;
   1674   1.3  christos 
   1675   1.3  christos   return 0;
   1676   1.3  christos }
   1677   1.3  christos 
   1678   1.3  christos /* Handler for arm system call instruction recording.  */
   1679   1.3  christos 
   1680   1.3  christos static int
   1681   1.3  christos arm_linux_syscall_record (struct regcache *regcache, unsigned long svc_number)
   1682   1.3  christos {
   1683   1.3  christos   int ret = 0;
   1684   1.3  christos   enum gdb_syscall syscall_gdb;
   1685   1.3  christos 
   1686   1.3  christos   syscall_gdb = arm_canonicalize_syscall (svc_number);
   1687   1.3  christos 
   1688   1.6  christos   if (syscall_gdb == gdb_sys_no_syscall)
   1689   1.3  christos     {
   1690  1.10  christos       gdb_printf (gdb_stderr,
   1691  1.10  christos 		  _("Process record and replay target doesn't "
   1692  1.10  christos 		    "support syscall number %s\n"),
   1693  1.10  christos 		  plongest (svc_number));
   1694   1.3  christos       return -1;
   1695   1.3  christos     }
   1696   1.3  christos 
   1697   1.3  christos   if (syscall_gdb == gdb_sys_sigreturn
   1698   1.3  christos       || syscall_gdb == gdb_sys_rt_sigreturn)
   1699   1.3  christos    {
   1700   1.3  christos      if (arm_all_but_pc_registers_record (regcache))
   1701   1.3  christos        return -1;
   1702   1.3  christos      return 0;
   1703   1.3  christos    }
   1704   1.3  christos 
   1705   1.3  christos   ret = record_linux_system_call (syscall_gdb, regcache,
   1706  1.10  christos 				  &arm_linux_record_tdep);
   1707   1.3  christos   if (ret != 0)
   1708   1.3  christos     return ret;
   1709   1.3  christos 
   1710   1.3  christos   /* Record the return value of the system call.  */
   1711   1.3  christos   if (record_full_arch_list_add_reg (regcache, ARM_A1_REGNUM))
   1712   1.3  christos     return -1;
   1713   1.3  christos   /* Record LR.  */
   1714   1.3  christos   if (record_full_arch_list_add_reg (regcache, ARM_LR_REGNUM))
   1715   1.3  christos     return -1;
   1716   1.3  christos   /* Record CPSR.  */
   1717   1.3  christos   if (record_full_arch_list_add_reg (regcache, ARM_PS_REGNUM))
   1718   1.3  christos     return -1;
   1719   1.3  christos 
   1720   1.3  christos   return 0;
   1721   1.3  christos }
   1722   1.3  christos 
   1723   1.3  christos /* Implement the skip_trampoline_code gdbarch method.  */
   1724   1.3  christos 
   1725   1.3  christos static CORE_ADDR
   1726  1.11  christos arm_linux_skip_trampoline_code (const frame_info_ptr &frame, CORE_ADDR pc)
   1727   1.3  christos {
   1728   1.3  christos   CORE_ADDR target_pc = arm_skip_stub (frame, pc);
   1729   1.3  christos 
   1730   1.3  christos   if (target_pc != 0)
   1731   1.3  christos     return target_pc;
   1732   1.3  christos 
   1733   1.3  christos   return find_solib_trampoline_target (frame, pc);
   1734   1.3  christos }
   1735   1.3  christos 
   1736   1.8  christos /* Implement the gcc_target_options gdbarch method.  */
   1737   1.8  christos 
   1738   1.9  christos static std::string
   1739   1.8  christos arm_linux_gcc_target_options (struct gdbarch *gdbarch)
   1740   1.8  christos {
   1741   1.8  christos   /* GCC doesn't know "-m32".  */
   1742   1.9  christos   return {};
   1743   1.8  christos }
   1744   1.8  christos 
   1745   1.1  christos static void
   1746   1.1  christos arm_linux_init_abi (struct gdbarch_info info,
   1747   1.1  christos 		    struct gdbarch *gdbarch)
   1748   1.1  christos {
   1749   1.1  christos   static const char *const stap_integer_prefixes[] = { "#", "$", "", NULL };
   1750   1.1  christos   static const char *const stap_register_prefixes[] = { "r", NULL };
   1751   1.1  christos   static const char *const stap_register_indirection_prefixes[] = { "[",
   1752   1.1  christos 								    NULL };
   1753   1.1  christos   static const char *const stap_register_indirection_suffixes[] = { "]",
   1754   1.1  christos 								    NULL };
   1755  1.10  christos   arm_gdbarch_tdep *tdep = gdbarch_tdep<arm_gdbarch_tdep> (gdbarch);
   1756   1.1  christos 
   1757  1.10  christos   linux_init_abi (info, gdbarch, 1);
   1758   1.1  christos 
   1759   1.1  christos   tdep->lowest_pc = 0x8000;
   1760   1.3  christos   if (info.byte_order_for_code == BFD_ENDIAN_BIG)
   1761   1.1  christos     {
   1762   1.1  christos       if (tdep->arm_abi == ARM_ABI_AAPCS)
   1763   1.1  christos 	tdep->arm_breakpoint = eabi_linux_arm_be_breakpoint;
   1764   1.1  christos       else
   1765   1.1  christos 	tdep->arm_breakpoint = arm_linux_arm_be_breakpoint;
   1766   1.1  christos       tdep->thumb_breakpoint = arm_linux_thumb_be_breakpoint;
   1767   1.1  christos       tdep->thumb2_breakpoint = arm_linux_thumb2_be_breakpoint;
   1768   1.1  christos     }
   1769   1.1  christos   else
   1770   1.1  christos     {
   1771   1.1  christos       if (tdep->arm_abi == ARM_ABI_AAPCS)
   1772   1.1  christos 	tdep->arm_breakpoint = eabi_linux_arm_le_breakpoint;
   1773   1.1  christos       else
   1774   1.1  christos 	tdep->arm_breakpoint = arm_linux_arm_le_breakpoint;
   1775   1.1  christos       tdep->thumb_breakpoint = arm_linux_thumb_le_breakpoint;
   1776   1.1  christos       tdep->thumb2_breakpoint = arm_linux_thumb2_le_breakpoint;
   1777   1.1  christos     }
   1778   1.1  christos   tdep->arm_breakpoint_size = sizeof (arm_linux_arm_le_breakpoint);
   1779   1.1  christos   tdep->thumb_breakpoint_size = sizeof (arm_linux_thumb_le_breakpoint);
   1780   1.1  christos   tdep->thumb2_breakpoint_size = sizeof (arm_linux_thumb2_le_breakpoint);
   1781   1.1  christos 
   1782   1.1  christos   if (tdep->fp_model == ARM_FLOAT_AUTO)
   1783   1.1  christos     tdep->fp_model = ARM_FLOAT_FPA;
   1784   1.1  christos 
   1785   1.1  christos   switch (tdep->fp_model)
   1786   1.1  christos     {
   1787   1.1  christos     case ARM_FLOAT_FPA:
   1788   1.1  christos       tdep->jb_pc = ARM_LINUX_JB_PC_FPA;
   1789   1.1  christos       break;
   1790   1.1  christos     case ARM_FLOAT_SOFT_FPA:
   1791   1.1  christos     case ARM_FLOAT_SOFT_VFP:
   1792   1.1  christos     case ARM_FLOAT_VFP:
   1793   1.1  christos       tdep->jb_pc = ARM_LINUX_JB_PC_EABI;
   1794   1.1  christos       break;
   1795   1.1  christos     default:
   1796   1.1  christos       internal_error
   1797  1.10  christos 	(_("arm_linux_init_abi: Floating point model not supported"));
   1798   1.1  christos       break;
   1799   1.1  christos     }
   1800   1.1  christos   tdep->jb_elt_size = ARM_LINUX_JB_ELEMENT_SIZE;
   1801   1.1  christos 
   1802   1.1  christos   set_solib_svr4_fetch_link_map_offsets
   1803  1.10  christos     (gdbarch, linux_ilp32_fetch_link_map_offsets);
   1804   1.1  christos 
   1805   1.1  christos   /* Single stepping.  */
   1806   1.1  christos   set_gdbarch_software_single_step (gdbarch, arm_linux_software_single_step);
   1807   1.1  christos 
   1808   1.1  christos   /* Shared library handling.  */
   1809   1.3  christos   set_gdbarch_skip_trampoline_code (gdbarch, arm_linux_skip_trampoline_code);
   1810   1.1  christos   set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
   1811   1.1  christos 
   1812   1.1  christos   /* Enable TLS support.  */
   1813   1.1  christos   set_gdbarch_fetch_tls_load_module_address (gdbarch,
   1814  1.10  christos 					     svr4_fetch_objfile_link_map);
   1815   1.1  christos 
   1816   1.1  christos   tramp_frame_prepend_unwinder (gdbarch,
   1817   1.1  christos 				&arm_linux_sigreturn_tramp_frame);
   1818   1.1  christos   tramp_frame_prepend_unwinder (gdbarch,
   1819   1.1  christos 				&arm_linux_rt_sigreturn_tramp_frame);
   1820   1.1  christos   tramp_frame_prepend_unwinder (gdbarch,
   1821   1.1  christos 				&arm_eabi_linux_sigreturn_tramp_frame);
   1822   1.1  christos   tramp_frame_prepend_unwinder (gdbarch,
   1823   1.1  christos 				&arm_eabi_linux_rt_sigreturn_tramp_frame);
   1824   1.1  christos   tramp_frame_prepend_unwinder (gdbarch,
   1825   1.3  christos 				&thumb2_eabi_linux_sigreturn_tramp_frame);
   1826   1.3  christos   tramp_frame_prepend_unwinder (gdbarch,
   1827   1.3  christos 				&thumb2_eabi_linux_rt_sigreturn_tramp_frame);
   1828   1.3  christos   tramp_frame_prepend_unwinder (gdbarch,
   1829   1.1  christos 				&arm_linux_restart_syscall_tramp_frame);
   1830   1.1  christos   tramp_frame_prepend_unwinder (gdbarch,
   1831   1.1  christos 				&arm_kernel_linux_restart_syscall_tramp_frame);
   1832   1.1  christos 
   1833   1.1  christos   /* Core file support.  */
   1834   1.3  christos   set_gdbarch_iterate_over_regset_sections
   1835   1.3  christos     (gdbarch, arm_linux_iterate_over_regset_sections);
   1836   1.1  christos   set_gdbarch_core_read_description (gdbarch, arm_linux_core_read_description);
   1837   1.1  christos 
   1838   1.1  christos   /* Displaced stepping.  */
   1839   1.1  christos   set_gdbarch_displaced_step_copy_insn (gdbarch,
   1840   1.1  christos 					arm_linux_displaced_step_copy_insn);
   1841   1.1  christos   set_gdbarch_displaced_step_fixup (gdbarch, arm_displaced_step_fixup);
   1842   1.1  christos 
   1843   1.1  christos   /* Reversible debugging, process record.  */
   1844   1.1  christos   set_gdbarch_process_record (gdbarch, arm_process_record);
   1845   1.1  christos 
   1846   1.1  christos   /* SystemTap functions.  */
   1847   1.1  christos   set_gdbarch_stap_integer_prefixes (gdbarch, stap_integer_prefixes);
   1848   1.1  christos   set_gdbarch_stap_register_prefixes (gdbarch, stap_register_prefixes);
   1849   1.1  christos   set_gdbarch_stap_register_indirection_prefixes (gdbarch,
   1850   1.1  christos 					  stap_register_indirection_prefixes);
   1851   1.1  christos   set_gdbarch_stap_register_indirection_suffixes (gdbarch,
   1852   1.1  christos 					  stap_register_indirection_suffixes);
   1853   1.1  christos   set_gdbarch_stap_gdb_register_prefix (gdbarch, "r");
   1854   1.1  christos   set_gdbarch_stap_is_single_operand (gdbarch, arm_stap_is_single_operand);
   1855   1.1  christos   set_gdbarch_stap_parse_special_token (gdbarch,
   1856   1.1  christos 					arm_stap_parse_special_token);
   1857   1.1  christos 
   1858   1.1  christos   /* `catch syscall' */
   1859   1.3  christos   set_xml_syscall_file_name (gdbarch, "syscalls/arm-linux.xml");
   1860   1.1  christos   set_gdbarch_get_syscall_number (gdbarch, arm_linux_get_syscall_number);
   1861   1.1  christos 
   1862   1.1  christos   /* Syscall record.  */
   1863   1.3  christos   tdep->arm_syscall_record = arm_linux_syscall_record;
   1864   1.3  christos 
   1865   1.3  christos   /* Initialize the arm_linux_record_tdep.  */
   1866   1.3  christos   /* These values are the size of the type that will be used in a system
   1867   1.3  christos      call.  They are obtained from Linux Kernel source.  */
   1868   1.3  christos   arm_linux_record_tdep.size_pointer
   1869   1.3  christos     = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT;
   1870   1.3  christos   arm_linux_record_tdep.size__old_kernel_stat = 32;
   1871   1.3  christos   arm_linux_record_tdep.size_tms = 16;
   1872   1.3  christos   arm_linux_record_tdep.size_loff_t = 8;
   1873   1.3  christos   arm_linux_record_tdep.size_flock = 16;
   1874   1.3  christos   arm_linux_record_tdep.size_oldold_utsname = 45;
   1875   1.3  christos   arm_linux_record_tdep.size_ustat = 20;
   1876   1.6  christos   arm_linux_record_tdep.size_old_sigaction = 16;
   1877   1.6  christos   arm_linux_record_tdep.size_old_sigset_t = 4;
   1878   1.3  christos   arm_linux_record_tdep.size_rlimit = 8;
   1879   1.3  christos   arm_linux_record_tdep.size_rusage = 72;
   1880   1.3  christos   arm_linux_record_tdep.size_timeval = 8;
   1881   1.3  christos   arm_linux_record_tdep.size_timezone = 8;
   1882   1.3  christos   arm_linux_record_tdep.size_old_gid_t = 2;
   1883   1.3  christos   arm_linux_record_tdep.size_old_uid_t = 2;
   1884   1.3  christos   arm_linux_record_tdep.size_fd_set = 128;
   1885   1.6  christos   arm_linux_record_tdep.size_old_dirent = 268;
   1886   1.3  christos   arm_linux_record_tdep.size_statfs = 64;
   1887   1.3  christos   arm_linux_record_tdep.size_statfs64 = 84;
   1888   1.3  christos   arm_linux_record_tdep.size_sockaddr = 16;
   1889   1.3  christos   arm_linux_record_tdep.size_int
   1890   1.3  christos     = gdbarch_int_bit (gdbarch) / TARGET_CHAR_BIT;
   1891   1.3  christos   arm_linux_record_tdep.size_long
   1892   1.3  christos     = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
   1893   1.3  christos   arm_linux_record_tdep.size_ulong
   1894   1.3  christos     = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT;
   1895   1.3  christos   arm_linux_record_tdep.size_msghdr = 28;
   1896   1.3  christos   arm_linux_record_tdep.size_itimerval = 16;
   1897   1.3  christos   arm_linux_record_tdep.size_stat = 88;
   1898   1.3  christos   arm_linux_record_tdep.size_old_utsname = 325;
   1899   1.3  christos   arm_linux_record_tdep.size_sysinfo = 64;
   1900   1.3  christos   arm_linux_record_tdep.size_msqid_ds = 88;
   1901   1.3  christos   arm_linux_record_tdep.size_shmid_ds = 84;
   1902   1.3  christos   arm_linux_record_tdep.size_new_utsname = 390;
   1903   1.3  christos   arm_linux_record_tdep.size_timex = 128;
   1904   1.3  christos   arm_linux_record_tdep.size_mem_dqinfo = 24;
   1905   1.3  christos   arm_linux_record_tdep.size_if_dqblk = 68;
   1906   1.3  christos   arm_linux_record_tdep.size_fs_quota_stat = 68;
   1907   1.3  christos   arm_linux_record_tdep.size_timespec = 8;
   1908   1.3  christos   arm_linux_record_tdep.size_pollfd = 8;
   1909   1.3  christos   arm_linux_record_tdep.size_NFS_FHSIZE = 32;
   1910   1.3  christos   arm_linux_record_tdep.size_knfsd_fh = 132;
   1911   1.3  christos   arm_linux_record_tdep.size_TASK_COMM_LEN = 16;
   1912   1.6  christos   arm_linux_record_tdep.size_sigaction = 20;
   1913   1.3  christos   arm_linux_record_tdep.size_sigset_t = 8;
   1914   1.3  christos   arm_linux_record_tdep.size_siginfo_t = 128;
   1915   1.3  christos   arm_linux_record_tdep.size_cap_user_data_t = 12;
   1916   1.3  christos   arm_linux_record_tdep.size_stack_t = 12;
   1917   1.3  christos   arm_linux_record_tdep.size_off_t = arm_linux_record_tdep.size_long;
   1918   1.3  christos   arm_linux_record_tdep.size_stat64 = 96;
   1919   1.6  christos   arm_linux_record_tdep.size_gid_t = 4;
   1920   1.6  christos   arm_linux_record_tdep.size_uid_t = 4;
   1921   1.3  christos   arm_linux_record_tdep.size_PAGE_SIZE = 4096;
   1922   1.3  christos   arm_linux_record_tdep.size_flock64 = 24;
   1923   1.3  christos   arm_linux_record_tdep.size_user_desc = 16;
   1924   1.3  christos   arm_linux_record_tdep.size_io_event = 32;
   1925   1.3  christos   arm_linux_record_tdep.size_iocb = 64;
   1926   1.3  christos   arm_linux_record_tdep.size_epoll_event = 12;
   1927   1.3  christos   arm_linux_record_tdep.size_itimerspec
   1928   1.3  christos     = arm_linux_record_tdep.size_timespec * 2;
   1929   1.3  christos   arm_linux_record_tdep.size_mq_attr = 32;
   1930   1.3  christos   arm_linux_record_tdep.size_termios = 36;
   1931   1.3  christos   arm_linux_record_tdep.size_termios2 = 44;
   1932   1.3  christos   arm_linux_record_tdep.size_pid_t = 4;
   1933   1.3  christos   arm_linux_record_tdep.size_winsize = 8;
   1934   1.3  christos   arm_linux_record_tdep.size_serial_struct = 60;
   1935   1.3  christos   arm_linux_record_tdep.size_serial_icounter_struct = 80;
   1936   1.3  christos   arm_linux_record_tdep.size_hayes_esp_config = 12;
   1937   1.3  christos   arm_linux_record_tdep.size_size_t = 4;
   1938   1.3  christos   arm_linux_record_tdep.size_iovec = 8;
   1939   1.6  christos   arm_linux_record_tdep.size_time_t = 4;
   1940   1.3  christos 
   1941   1.3  christos   /* These values are the second argument of system call "sys_ioctl".
   1942   1.3  christos      They are obtained from Linux Kernel source.  */
   1943   1.3  christos   arm_linux_record_tdep.ioctl_TCGETS = 0x5401;
   1944   1.3  christos   arm_linux_record_tdep.ioctl_TCSETS = 0x5402;
   1945   1.3  christos   arm_linux_record_tdep.ioctl_TCSETSW = 0x5403;
   1946   1.3  christos   arm_linux_record_tdep.ioctl_TCSETSF = 0x5404;
   1947   1.3  christos   arm_linux_record_tdep.ioctl_TCGETA = 0x5405;
   1948   1.3  christos   arm_linux_record_tdep.ioctl_TCSETA = 0x5406;
   1949   1.3  christos   arm_linux_record_tdep.ioctl_TCSETAW = 0x5407;
   1950   1.3  christos   arm_linux_record_tdep.ioctl_TCSETAF = 0x5408;
   1951   1.3  christos   arm_linux_record_tdep.ioctl_TCSBRK = 0x5409;
   1952   1.3  christos   arm_linux_record_tdep.ioctl_TCXONC = 0x540a;
   1953   1.3  christos   arm_linux_record_tdep.ioctl_TCFLSH = 0x540b;
   1954   1.3  christos   arm_linux_record_tdep.ioctl_TIOCEXCL = 0x540c;
   1955   1.3  christos   arm_linux_record_tdep.ioctl_TIOCNXCL = 0x540d;
   1956   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSCTTY = 0x540e;
   1957   1.3  christos   arm_linux_record_tdep.ioctl_TIOCGPGRP = 0x540f;
   1958   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSPGRP = 0x5410;
   1959   1.3  christos   arm_linux_record_tdep.ioctl_TIOCOUTQ = 0x5411;
   1960   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSTI = 0x5412;
   1961   1.3  christos   arm_linux_record_tdep.ioctl_TIOCGWINSZ = 0x5413;
   1962   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSWINSZ = 0x5414;
   1963   1.3  christos   arm_linux_record_tdep.ioctl_TIOCMGET = 0x5415;
   1964   1.3  christos   arm_linux_record_tdep.ioctl_TIOCMBIS = 0x5416;
   1965   1.3  christos   arm_linux_record_tdep.ioctl_TIOCMBIC = 0x5417;
   1966   1.3  christos   arm_linux_record_tdep.ioctl_TIOCMSET = 0x5418;
   1967   1.3  christos   arm_linux_record_tdep.ioctl_TIOCGSOFTCAR = 0x5419;
   1968   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSSOFTCAR = 0x541a;
   1969   1.3  christos   arm_linux_record_tdep.ioctl_FIONREAD = 0x541b;
   1970   1.3  christos   arm_linux_record_tdep.ioctl_TIOCINQ = arm_linux_record_tdep.ioctl_FIONREAD;
   1971   1.3  christos   arm_linux_record_tdep.ioctl_TIOCLINUX = 0x541c;
   1972   1.3  christos   arm_linux_record_tdep.ioctl_TIOCCONS = 0x541d;
   1973   1.3  christos   arm_linux_record_tdep.ioctl_TIOCGSERIAL = 0x541e;
   1974   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSSERIAL = 0x541f;
   1975   1.3  christos   arm_linux_record_tdep.ioctl_TIOCPKT = 0x5420;
   1976   1.3  christos   arm_linux_record_tdep.ioctl_FIONBIO = 0x5421;
   1977   1.3  christos   arm_linux_record_tdep.ioctl_TIOCNOTTY = 0x5422;
   1978   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSETD = 0x5423;
   1979   1.3  christos   arm_linux_record_tdep.ioctl_TIOCGETD = 0x5424;
   1980   1.3  christos   arm_linux_record_tdep.ioctl_TCSBRKP = 0x5425;
   1981   1.3  christos   arm_linux_record_tdep.ioctl_TIOCTTYGSTRUCT = 0x5426;
   1982   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSBRK = 0x5427;
   1983   1.3  christos   arm_linux_record_tdep.ioctl_TIOCCBRK = 0x5428;
   1984   1.3  christos   arm_linux_record_tdep.ioctl_TIOCGSID = 0x5429;
   1985   1.3  christos   arm_linux_record_tdep.ioctl_TCGETS2 = 0x802c542a;
   1986   1.3  christos   arm_linux_record_tdep.ioctl_TCSETS2 = 0x402c542b;
   1987   1.3  christos   arm_linux_record_tdep.ioctl_TCSETSW2 = 0x402c542c;
   1988   1.3  christos   arm_linux_record_tdep.ioctl_TCSETSF2 = 0x402c542d;
   1989   1.3  christos   arm_linux_record_tdep.ioctl_TIOCGPTN = 0x80045430;
   1990   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSPTLCK = 0x40045431;
   1991   1.3  christos   arm_linux_record_tdep.ioctl_FIONCLEX = 0x5450;
   1992   1.3  christos   arm_linux_record_tdep.ioctl_FIOCLEX = 0x5451;
   1993   1.3  christos   arm_linux_record_tdep.ioctl_FIOASYNC = 0x5452;
   1994   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSERCONFIG = 0x5453;
   1995   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSERGWILD = 0x5454;
   1996   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSERSWILD = 0x5455;
   1997   1.3  christos   arm_linux_record_tdep.ioctl_TIOCGLCKTRMIOS = 0x5456;
   1998   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSLCKTRMIOS = 0x5457;
   1999   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSERGSTRUCT = 0x5458;
   2000   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSERGETLSR = 0x5459;
   2001   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSERGETMULTI = 0x545a;
   2002   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSERSETMULTI = 0x545b;
   2003   1.3  christos   arm_linux_record_tdep.ioctl_TIOCMIWAIT = 0x545c;
   2004   1.3  christos   arm_linux_record_tdep.ioctl_TIOCGICOUNT = 0x545d;
   2005   1.3  christos   arm_linux_record_tdep.ioctl_TIOCGHAYESESP = 0x545e;
   2006   1.3  christos   arm_linux_record_tdep.ioctl_TIOCSHAYESESP = 0x545f;
   2007   1.3  christos   arm_linux_record_tdep.ioctl_FIOQSIZE = 0x5460;
   2008   1.3  christos 
   2009   1.3  christos   /* These values are the second argument of system call "sys_fcntl"
   2010   1.3  christos      and "sys_fcntl64".  They are obtained from Linux Kernel source.  */
   2011   1.3  christos   arm_linux_record_tdep.fcntl_F_GETLK = 5;
   2012   1.3  christos   arm_linux_record_tdep.fcntl_F_GETLK64 = 12;
   2013   1.3  christos   arm_linux_record_tdep.fcntl_F_SETLK64 = 13;
   2014   1.3  christos   arm_linux_record_tdep.fcntl_F_SETLKW64 = 14;
   2015   1.3  christos 
   2016   1.6  christos   arm_linux_record_tdep.arg1 = ARM_A1_REGNUM;
   2017   1.6  christos   arm_linux_record_tdep.arg2 = ARM_A1_REGNUM + 1;
   2018   1.6  christos   arm_linux_record_tdep.arg3 = ARM_A1_REGNUM + 2;
   2019   1.3  christos   arm_linux_record_tdep.arg4 = ARM_A1_REGNUM + 3;
   2020   1.6  christos   arm_linux_record_tdep.arg5 = ARM_A1_REGNUM + 4;
   2021   1.6  christos   arm_linux_record_tdep.arg6 = ARM_A1_REGNUM + 5;
   2022   1.6  christos   arm_linux_record_tdep.arg7 = ARM_A1_REGNUM + 6;
   2023   1.8  christos 
   2024   1.8  christos   set_gdbarch_gcc_target_options (gdbarch, arm_linux_gcc_target_options);
   2025   1.1  christos }
   2026   1.1  christos 
   2027   1.9  christos void _initialize_arm_linux_tdep ();
   2028   1.1  christos void
   2029   1.9  christos _initialize_arm_linux_tdep ()
   2030   1.1  christos {
   2031   1.1  christos   gdbarch_register_osabi (bfd_arch_arm, 0, GDB_OSABI_LINUX,
   2032   1.1  christos 			  arm_linux_init_abi);
   2033   1.1  christos }
   2034