1b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes/*
2917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * This file is part of ltrace.
3917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * Copyright (C) 2012 Petr Machata, Red Hat Inc.
4917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * Copyright (C) 2001,2005 IBM Corp.
5917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata *
6917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * This program is free software; you can redistribute it and/or
7917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * modify it under the terms of the GNU General Public License as
8917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * published by the Free Software Foundation; either version 2 of the
9917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * License, or (at your option) any later version.
10917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata *
11917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * This program is distributed in the hope that it will be useful, but
12917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of
13917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * General Public License for more details.
15917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata *
16917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * You should have received a copy of the GNU General Public License
17917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * along with this program; if not, write to the Free Software
18917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata * 02110-1301 USA
20917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata */
21b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes
22b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#include "config.h"
23b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes
24917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include <asm/ptrace.h>
25917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include <sys/ptrace.h>
26b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#include <sys/types.h>
27b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#include <sys/wait.h>
28917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include <assert.h>
29917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include <errno.h>
30b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#include <signal.h>
31917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include <stdlib.h>
32b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes
33f728123bd75a65a6a1536e198c3c30719e494e71Juan Cespedes#include "common.h"
34917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include "proc.h"
35917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata#include "type.h"
36b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes
37b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#if (!defined(PTRACE_PEEKUSER) && defined(PTRACE_PEEKUSR))
38b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes# define PTRACE_PEEKUSER PTRACE_PEEKUSR
39b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#endif
40b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes
41b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#if (!defined(PTRACE_POKEUSER) && defined(PTRACE_POKEUSR))
42b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes# define PTRACE_POKEUSER PTRACE_POKEUSR
43b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes#endif
44b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes
45f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesvoid
46929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataget_arch_dep(struct process *proc)
47929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata{
489a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#ifdef __s390x__
499a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand	unsigned long psw;
509a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
519a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand	if (proc->arch_ptr)
529a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		return;
539a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
549a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand	psw = ptrace(PTRACE_PEEKUSER, proc->pid, PT_PSWMASK, 0);
559a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
569a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand	if ((psw & 0x000000180000000) == 0x000000080000000) {
579a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		proc->mask_32bit = 1;
589a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		proc->personality = 1;
599a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand	}
609a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
612d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand	proc->arch_ptr = (void *)1;
629a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#endif
635c3fe0697b202cc7d95e90459de0fb312b297b27Juan Cespedes}
645c3fe0697b202cc7d95e90459de0fb312b297b27Juan Cespedes
65b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes/* Returns 1 if syscall, 2 if sysret, 0 otherwise.
66b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes */
67f13505251e6402460f6cc7ec84e0d8ca91607b4fJuan Cespedesint
68929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatasyscall_p(struct process *proc, int status, int *sysnum)
69929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata{
709a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand	long pc, opcode, offset_reg, scno, tmp;
719a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand	void *svc_addr;
722d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand	int gpr_offset[16] = { PT_GPR0, PT_GPR1, PT_ORIGGPR2, PT_GPR3,
732d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand		PT_GPR4, PT_GPR5, PT_GPR6, PT_GPR7,
742d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand		PT_GPR8, PT_GPR9, PT_GPR10, PT_GPR11,
752d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand		PT_GPR12, PT_GPR13, PT_GPR14, PT_GPR15
762d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand	};
77b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes
782d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand	if (WIFSTOPPED(status)
792d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand	    && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
80b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes
819a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		/*
829a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 * If we have PTRACE_O_TRACESYSGOOD and we have the new style
839a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 * of passing the system call number to user space via PT_GPR2
849a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 * then the task is quite easy.
859a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 */
86b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes
879a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		*sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, PT_GPR2, 0);
88b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes
899a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		if (proc->tracesysgood) {
90b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes			/* System call was encountered... */
918f8282f72eaeadc5419cd5470100e8dcaba5b7fdJuan Cespedes			if (proc->callstack_depth > 0 &&
922d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand			    proc->callstack[proc->callstack_depth -
932d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand					    1].is_syscall) {
949a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand				/* syscall exit */
952d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand				*sysnum =
962d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand				    proc->callstack[proc->callstack_depth -
972d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand						    1].c_un.syscall;
98b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes				return 2;
998f8282f72eaeadc5419cd5470100e8dcaba5b7fdJuan Cespedes			} else {
1009a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand				/* syscall enter */
1019a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand				if (*sysnum != -ENOSYS)
1029a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand					return 1;
103b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes			}
1049a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		}
1052d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand
1069a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		/*
1079a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 * At least one of the two requirements mentioned above is not
1089a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 * met. Therefore the fun part starts here:
1099a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 * We try to do some instruction decoding without even knowing
1109a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 * the instruction code length of the last instruction executed.
1119a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 * Needs to be done to get the system call number or to decide
1129a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 * if we reached a breakpoint or even checking for a completely
1139a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 * unrelated instruction.
1149a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 * Just a heuristic that most of the time appears to work...
1159a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		 */
1169a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
1179a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		pc = ptrace(PTRACE_PEEKUSER, proc->pid, PT_PSWADDR, 0);
1189a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		opcode = ptrace(PTRACE_PEEKTEXT, proc->pid,
1192d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand				(char *)(pc - sizeof(long)), 0);
1209a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
1219a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		if ((opcode & 0xffff) == 0x0001) {
1229a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			/* Breakpoint */
123b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes			return 0;
1242d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand		} else if ((opcode & 0xff00) == 0x0a00) {
1259a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			/* SVC opcode */
1269a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			scno = opcode & 0xff;
1272d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand		} else if ((opcode & 0xff000000) == 0x44000000) {
1289a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			/* Instruction decoding of EXECUTE... */
1292d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand			svc_addr = (void *)(opcode & 0xfff);
1309a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
1319a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			offset_reg = (opcode & 0x000f0000) >> 16;
1329a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			if (offset_reg)
1339a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand				svc_addr += ptrace(PTRACE_PEEKUSER, proc->pid,
1349a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand						   gpr_offset[offset_reg], 0);
1359a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
1369a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			offset_reg = (opcode & 0x0000f000) >> 12;
1379a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			if (offset_reg)
1389a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand				svc_addr += ptrace(PTRACE_PEEKUSER, proc->pid,
1399a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand						   gpr_offset[offset_reg], 0);
1409a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
1419a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			scno = ptrace(PTRACE_PEEKTEXT, proc->pid, svc_addr, 0);
1429a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#ifdef __s390x__
1439a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			scno >>= 48;
1449a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#else
1459a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			scno >>= 16;
1469a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand#endif
1479a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			if ((scno & 0xff00) != 0x0a000)
1489a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand				return 0;
1499a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
1509a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			tmp = 0;
1519a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			offset_reg = (opcode & 0x00f00000) >> 20;
1529a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			if (offset_reg)
1539a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand				tmp = ptrace(PTRACE_PEEKUSER, proc->pid,
1549a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand					     gpr_offset[offset_reg], 0);
1559a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
1569a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			scno = (scno | tmp) & 0xff;
1572d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand		} else {
1589a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			/* No opcode related to syscall handling */
1599a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			return 0;
1609a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		}
1619a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
1629a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		if (scno == 0)
1639a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			scno = ptrace(PTRACE_PEEKUSER, proc->pid, PT_GPR1, 0);
1649a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
1659a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		*sysnum = scno;
1669a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand
1679a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		/* System call was encountered... */
1689a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		if (proc->callstack_depth > 0 &&
1692d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand		    proc->callstack[proc->callstack_depth - 1].is_syscall) {
1709a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			return 2;
1719a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		} else {
1729a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand			return 1;
1739a2ad351a1c3215dc596ff3e2e3fd4bc24445a6bIan Wienand		}
174b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes	}
175b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes	/* Unknown status... */
176b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes	return 0;
177b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes}
178b1dd77d66f93eeaa6cbf8b101d3e9cf70981e000Juan Cespedes
179917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machatasize_t
180929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataarch_type_sizeof(struct process *proc, struct arg_type_info *info)
181917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata{
182917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	if (proc == NULL)
183917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return (size_t)-2;
184917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
185917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	switch (info->type) {
186917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_VOID:
187917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return 0;
188917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
189917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_CHAR:
190917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return 1;
191917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
192917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_SHORT:
193917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_USHORT:
194917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return 2;
195917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
196917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_INT:
197917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_UINT:
198917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return 4;
199917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
200917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_LONG:
201917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_ULONG:
202917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_POINTER:
203917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return proc->e_class == ELFCLASS64 ? 8 : 4;
204917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
205917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_FLOAT:
206917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return 4;
207917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_DOUBLE:
208917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return 8;
209917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
210917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_ARRAY:
211917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_STRUCT:
212917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		/* Use default value.  */
213917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return (size_t)-2;
2145b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias
2155b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias	default:
2165b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias		assert(info->type != info->type);
2175b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias		abort();
218917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	}
219917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata}
220917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
221917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machatasize_t
222929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machataarch_type_alignof(struct process *proc, struct arg_type_info *info)
223917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata{
224917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	if (proc == NULL)
225917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return (size_t)-2;
226917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
227917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	switch (info->type) {
2285b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias	default:
2295b5c256d0e9076e745908a43acc46353265a5608Edgar E. Iglesias		assert(info->type != info->type);
230917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		break;
231917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
232917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_CHAR:
233917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return 1;
234917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
235917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_SHORT:
236917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_USHORT:
237917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return 2;
238917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
239917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_INT:
240917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_UINT:
241917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return 4;
242917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
243917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_LONG:
244917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_ULONG:
245917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_POINTER:
246917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return proc->e_class == ELFCLASS64 ? 8 : 4;
247917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
248917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_FLOAT:
249917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return 4;
250917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_DOUBLE:
251917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return 8;
252917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata
253917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_ARRAY:
254917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	case ARGTYPE_STRUCT:
255917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		/* Use default value.  */
256917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata		return (size_t)-2;
257917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	}
258917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata	abort();
259917ef246757d89b74eac58e0664b3fe2146a6fdbPetr Machata}
260