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