177c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes#include "negated_errno.h"
277c3ff8e0644f1e120e4b2ebc7222150b0446f3bElliott Hughes
30c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levinstatic void
40c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levinget_error(struct tcb *tcp, const bool check_errno)
50c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin{
60c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin	/*
70c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin	 * In X32, return value is 64-bit (llseek uses one).
80c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin	 * Using merely "long rax" would not work.
90c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin	 */
100c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin	long long rax;
11d70d1c4aa6b9b2f4713d79f442dbf66a3f702c9bDmitry V. Levin
120c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin	if (x86_io.iov_len == sizeof(i386_regs)) {
130c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin		/* Sign extend from 32 bits */
140c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin		rax = (int32_t) i386_regs.eax;
150c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin	} else {
160c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin		rax = x86_64_regs.rax;
170c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin	}
18d70d1c4aa6b9b2f4713d79f442dbf66a3f702c9bDmitry V. Levin
190c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin	if (check_errno && is_negated_errno(rax)) {
200c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin		tcp->u_rval = -1;
210c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin		tcp->u_error = -rax;
220c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin	} else {
23b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes		if (x86_io.iov_len == sizeof(i386_regs))
24b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes			tcp->u_rval = (uint32_t) rax;
25b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes		else
26b755614143ce6aab5265ed32c1bb6c8f748e7898Elliott Hughes			tcp->u_rval = rax;
270c8c5c9f4e2a71e3a34110c47026f577bf483a52Dmitry V. Levin	}
28d70d1c4aa6b9b2f4713d79f442dbf66a3f702c9bDmitry V. Levin}
29