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