154737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata/* 254737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * This file is part of ltrace. 3693dfad9c1b121cf079a3082866daa2225df1797Petr Machata * Copyright (C) 2010,2012,2013 Petr Machata, Red Hat Inc. 454737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * Copyright (C) 2011 Andreas Schwab 554737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * Copyright (C) 2002,2004,2008,2009 Juan Cespedes 654737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * Copyright (C) 2008 Luis Machado, IBM Corporation 754737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * Copyright (C) 2006 Ian Wienand 854737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * 954737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * This program is free software; you can redistribute it and/or 1054737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * modify it under the terms of the GNU General Public License as 1154737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * published by the Free Software Foundation; either version 2 of the 1254737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * License, or (at your option) any later version. 1354737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * 1454737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * This program is distributed in the hope that it will be useful, but 1554737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of 1654737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1754737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * General Public License for more details. 1854737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * 1954737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * You should have received a copy of the GNU General Public License 2054737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * along with this program; if not, write to the Free Software 2154737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 2254737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata * 02110-1301 USA 2354737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata */ 2454737daf1c51ec826fcabc8189a7ff891f29d59bPetr Machata 25f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#include "config.h" 26f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes 27d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata#include <assert.h> 289a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#include <elf.h> 2955c5feba87bbb8d9190a71ec5ddc38380a384bf7Luis Machado#include <errno.h> 30d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata#include <signal.h> 31fac99be277bd370852faadc7fdd8754e2efa26f6Petr Machata#include <string.h> 32c1990eb670b2786ffabe712fdb9bf3512dd1501cGustavo Zacarias#include <sys/types.h> 33c1990eb670b2786ffabe712fdb9bf3512dd1501cGustavo Zacarias#include <sys/wait.h> 34f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes 35d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata#include "backend.h" 36d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata#include "breakpoint.h" 37f728123bd75a65a6a1536e198c3c30719e494e71Juan Cespedes#include "common.h" 38305945b2523ea87907952eefd7300cfb9f1a0235Petr Machata#include "insn.h" 39d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata#include "proc.h" 40fac99be277bd370852faadc7fdd8754e2efa26f6Petr Machata#include "ptrace.h" 41000e31195ad4ad30a0c80c93ab57a424e7d8d918Petr Machata#include "type.h" 42f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes 43f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#if (!defined(PTRACE_PEEKUSER) && defined(PTRACE_PEEKUSR)) 44f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes# define PTRACE_PEEKUSER PTRACE_PEEKUSR 45f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#endif 46f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes 47f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#if (!defined(PTRACE_POKEUSER) && defined(PTRACE_POKEUSR)) 48f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes# define PTRACE_POKEUSER PTRACE_POKEUSR 49f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#endif 50f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes 51f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesvoid 52929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataget_arch_dep(struct process *proc) 53929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata{ 549a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#ifdef __powerpc64__ 55d0a4cf7dc388729bce29fc8b1459e0a0007478f6Petr Machata proc->mask_32bit = (proc->e_machine == EM_PPC); 569a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#endif 575c3fe0697b202cc7d95e90459de0fb312b297b27Juan Cespedes} 585c3fe0697b202cc7d95e90459de0fb312b297b27Juan Cespedes 59f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes#define SYSCALL_INSN 0x44000002 6055c5feba87bbb8d9190a71ec5ddc38380a384bf7Luis Machado 61fac99be277bd370852faadc7fdd8754e2efa26f6Petr Machata/* Returns 1 if syscall, 2 if sysret, 0 otherwise. */ 62f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesint 63929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatasyscall_p(struct process *proc, int status, int *sysnum) 64929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata{ 652d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand if (WIFSTOPPED(status) 662d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) { 679a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand long pc = (long)get_instruction_pointer(proc); 682d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand int insn = 692d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand (int)ptrace(PTRACE_PEEKTEXT, proc->pid, pc - sizeof(long), 702d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand 0); 71f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes 72f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes if (insn == SYSCALL_INSN) { 732d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand *sysnum = 742d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand (int)ptrace(PTRACE_PEEKUSER, proc->pid, 752d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand sizeof(long) * PT_R0, 0); 763e94cbf0d388a5b5b49f8dbc60f4b24900de89aeJuan Cespedes if (proc->callstack_depth > 0 && 773e94cbf0d388a5b5b49f8dbc60f4b24900de89aeJuan Cespedes proc->callstack[proc->callstack_depth - 1].is_syscall && 783e94cbf0d388a5b5b49f8dbc60f4b24900de89aeJuan Cespedes proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) { 79f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes return 2; 80f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes } 815bfb061c4c7cfac6e1882a586cf36c849d95fceaJuan Cespedes return 1; 82f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes } 83f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes } 84f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes return 0; 85f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes} 86f1bfe203f5f1c0e11a614f9d593a68406f5cb47eJuan Cespedes 87a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata/* The atomic skip code is mostly taken from GDB. */ 88a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata 89693dfad9c1b121cf079a3082866daa2225df1797Petr Machataenum sw_singlestep_status 90693dfad9c1b121cf079a3082866daa2225df1797Petr Machataarch_sw_singlestep(struct process *proc, struct breakpoint *sbp, 91693dfad9c1b121cf079a3082866daa2225df1797Petr Machata int (*add_cb)(arch_addr_t, struct sw_singlestep_data *), 92693dfad9c1b121cf079a3082866daa2225df1797Petr Machata struct sw_singlestep_data *add_cb_data) 93a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata{ 94bac2da505ee174b7fb984b975c5938f88f0dbab2Petr Machata arch_addr_t ip = get_instruction_pointer(proc); 9542748aca73359c83881556c8b28f6cda4f1c143bPetr Machata struct breakpoint *other = address2bpstruct(proc->leader, ip); 9642748aca73359c83881556c8b28f6cda4f1c143bPetr Machata 97693dfad9c1b121cf079a3082866daa2225df1797Petr Machata debug(1, "arch_sw_singlestep pid=%d addr=%p %s(%p)", 9842748aca73359c83881556c8b28f6cda4f1c143bPetr Machata proc->pid, ip, breakpoint_name(sbp), sbp->addr); 99a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata 100a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata /* If the original instruction was lwarx/ldarx, we can't 101a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata * single-step over it, instead we have to execute the whole 102a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata * atomic block at once. */ 103a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata union { 104a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata uint32_t insn; 10542748aca73359c83881556c8b28f6cda4f1c143bPetr Machata char buf[BREAKPOINT_LENGTH]; 106a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata } u; 10742748aca73359c83881556c8b28f6cda4f1c143bPetr Machata if (other != NULL) { 10842748aca73359c83881556c8b28f6cda4f1c143bPetr Machata memcpy(u.buf, sbp->orig_value, BREAKPOINT_LENGTH); 109653085a32cdc89f5215c2d70249b58c9fe6aebb7Petr Machata } else if (proc_read_32(proc, ip, &u.insn) < 0) { 11042748aca73359c83881556c8b28f6cda4f1c143bPetr Machata fprintf(stderr, "couldn't read instruction at IP %p\n", ip); 11142748aca73359c83881556c8b28f6cda4f1c143bPetr Machata /* Do the normal singlestep. */ 112693dfad9c1b121cf079a3082866daa2225df1797Petr Machata return SWS_HW; 11342748aca73359c83881556c8b28f6cda4f1c143bPetr Machata } 114a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata 115a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata if ((u.insn & LWARX_MASK) != LWARX_INSTRUCTION 116a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata && (u.insn & LWARX_MASK) != LDARX_INSTRUCTION) 117693dfad9c1b121cf079a3082866daa2225df1797Petr Machata return SWS_HW; 118a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata 11942748aca73359c83881556c8b28f6cda4f1c143bPetr Machata debug(1, "singlestep over atomic block at %p", ip); 12042748aca73359c83881556c8b28f6cda4f1c143bPetr Machata 121a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata int insn_count; 122bac2da505ee174b7fb984b975c5938f88f0dbab2Petr Machata arch_addr_t addr = ip; 123a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata for (insn_count = 0; ; ++insn_count) { 124a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata addr += 4; 125a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata unsigned long l = ptrace(PTRACE_PEEKTEXT, proc->pid, addr, 0); 126a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata if (l == (unsigned long)-1 && errno) 127693dfad9c1b121cf079a3082866daa2225df1797Petr Machata return SWS_FAIL; 128a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata uint32_t insn; 129a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata#ifdef __powerpc64__ 130a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata insn = l >> 32; 131a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata#else 132a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata insn = l; 133a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata#endif 134a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata 13542748aca73359c83881556c8b28f6cda4f1c143bPetr Machata /* If a conditional branch is found, put a breakpoint 13642748aca73359c83881556c8b28f6cda4f1c143bPetr Machata * in its destination address. */ 13742748aca73359c83881556c8b28f6cda4f1c143bPetr Machata if ((insn & BRANCH_MASK) == BC_INSN) { 138305945b2523ea87907952eefd7300cfb9f1a0235Petr Machata arch_addr_t branch_addr = ppc_branch_dest(addr, insn); 13942748aca73359c83881556c8b28f6cda4f1c143bPetr Machata debug(1, "pid=%d, branch in atomic block from %p to %p", 14042748aca73359c83881556c8b28f6cda4f1c143bPetr Machata proc->pid, addr, branch_addr); 14142748aca73359c83881556c8b28f6cda4f1c143bPetr Machata if (add_cb(branch_addr, add_cb_data) < 0) 142693dfad9c1b121cf079a3082866daa2225df1797Petr Machata return SWS_FAIL; 143a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata } 144a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata 14542748aca73359c83881556c8b28f6cda4f1c143bPetr Machata /* Assume that the atomic sequence ends with a 14642748aca73359c83881556c8b28f6cda4f1c143bPetr Machata * stwcx/stdcx instruction. */ 147a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata if ((insn & STWCX_MASK) == STWCX_INSTRUCTION 148a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata || (insn & STWCX_MASK) == STDCX_INSTRUCTION) { 14942748aca73359c83881556c8b28f6cda4f1c143bPetr Machata debug(1, "pid=%d, found end of atomic block %p at %p", 15042748aca73359c83881556c8b28f6cda4f1c143bPetr Machata proc->pid, ip, addr); 151a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata break; 152a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata } 153a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata 154a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata /* Arbitrary cut-off. If we didn't find the 155a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata * terminating instruction by now, just give up. */ 156a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata if (insn_count > 16) { 15742748aca73359c83881556c8b28f6cda4f1c143bPetr Machata fprintf(stderr, "[%d] couldn't find end of atomic block" 15842748aca73359c83881556c8b28f6cda4f1c143bPetr Machata " at %p\n", proc->pid, ip); 159693dfad9c1b121cf079a3082866daa2225df1797Petr Machata return SWS_FAIL; 160a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata } 161a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata } 162a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata 163a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata /* Put the breakpoint to the next instruction. */ 164a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata addr += 4; 165a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata if (add_cb(addr, add_cb_data) < 0) 166693dfad9c1b121cf079a3082866daa2225df1797Petr Machata return SWS_FAIL; 167a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata 168a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata debug(1, "PTRACE_CONT"); 169a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata ptrace(PTRACE_CONT, proc->pid, 0, 0); 170693dfad9c1b121cf079a3082866daa2225df1797Petr Machata return SWS_OK; 171a266acb9c3bbde884a32268f164de62d03aa04d0Petr Machata} 172af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 173af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machatasize_t 174929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataarch_type_sizeof(struct process *proc, struct arg_type_info *info) 175af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata{ 176af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata if (proc == NULL) 177af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return (size_t)-2; 178af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 179af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata switch (info->type) { 180af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_VOID: 181af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return 0; 182af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 183af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_CHAR: 184af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return 1; 185af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 186af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_SHORT: 187af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_USHORT: 188af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return 2; 189af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 190af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_INT: 191af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_UINT: 192af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return 4; 193af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 194af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_LONG: 195af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_ULONG: 196af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_POINTER: 197af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return proc->e_machine == EM_PPC64 ? 8 : 4; 198af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 199af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_FLOAT: 200af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return 4; 201af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_DOUBLE: 202af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return 8; 203af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 204af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_ARRAY: 205af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_STRUCT: 206af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata /* Use default value. */ 207af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return (size_t)-2; 2085b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias 2095b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias default: 2105b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias assert(info->type != info->type); 2115b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias abort(); 2125b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias break; 213af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata } 214af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata} 215af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 216af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machatasize_t 217929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataarch_type_alignof(struct process *proc, struct arg_type_info *info) 218af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata{ 219af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata if (proc == NULL) 220af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return (size_t)-2; 221af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 222af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata switch (info->type) { 2235b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias default: 2245b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias assert(info->type != info->type); 2255b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias abort(); 226af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata break; 227af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 228af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_CHAR: 229af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_SHORT: 230af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_USHORT: 231af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_INT: 232af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_UINT: 233af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_LONG: 234af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_ULONG: 235af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_POINTER: 236af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_FLOAT: 237af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_DOUBLE: 238af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata /* On both PPC and PPC64, fundamental types have the 239af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata * same alignment as size. */ 240af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return arch_type_sizeof(proc, info); 241af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata 242af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_ARRAY: 243af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata case ARGTYPE_STRUCT: 244af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata /* Use default value. */ 245af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata return (size_t)-2; 246af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata } 247af9e30ec852a24f52a36775154ff79cc4be0193dPetr Machata} 248