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