13b3c1694SLeon Alrae /*
23b3c1694SLeon Alrae * Unified Hosting Interface syscalls.
33b3c1694SLeon Alrae *
43b3c1694SLeon Alrae * Copyright (c) 2015 Imagination Technologies
53b3c1694SLeon Alrae *
63b3c1694SLeon Alrae * This library is free software; you can redistribute it and/or
73b3c1694SLeon Alrae * modify it under the terms of the GNU Lesser General Public
83b3c1694SLeon Alrae * License as published by the Free Software Foundation; either
989975214SChetan Pant * version 2.1 of the License, or (at your option) any later version.
103b3c1694SLeon Alrae *
113b3c1694SLeon Alrae * This library is distributed in the hope that it will be useful,
123b3c1694SLeon Alrae * but WITHOUT ANY WARRANTY; without even the implied warranty of
133b3c1694SLeon Alrae * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
143b3c1694SLeon Alrae * Lesser General Public License for more details.
153b3c1694SLeon Alrae *
163b3c1694SLeon Alrae * You should have received a copy of the GNU Lesser General Public
173b3c1694SLeon Alrae * License along with this library; if not, see <http://www.gnu.org/licenses/>.
183b3c1694SLeon Alrae */
193b3c1694SLeon Alrae
20c684822aSPeter Maydell #include "qemu/osdep.h"
213b3c1694SLeon Alrae #include "cpu.h"
2263c91552SPaolo Bonzini #include "qemu/log.h"
23c566080cSAlex Bennée #include "gdbstub/syscalls.h"
244ea5fe99SAlex Bennée #include "gdbstub/helpers.h"
25f14eced5SPhilippe Mathieu-Daudé #include "semihosting/uaccess.h"
266b5fe137SPhilippe Mathieu-Daudé #include "semihosting/semihost.h"
276b5fe137SPhilippe Mathieu-Daudé #include "semihosting/console.h"
2818639a28SRichard Henderson #include "semihosting/syscalls.h"
298ec7e3c5SRichard Henderson #include "internal.h"
303b3c1694SLeon Alrae
313b3c1694SLeon Alrae typedef enum UHIOp {
323b3c1694SLeon Alrae UHI_exit = 1,
333b3c1694SLeon Alrae UHI_open = 2,
343b3c1694SLeon Alrae UHI_close = 3,
353b3c1694SLeon Alrae UHI_read = 4,
363b3c1694SLeon Alrae UHI_write = 5,
373b3c1694SLeon Alrae UHI_lseek = 6,
383b3c1694SLeon Alrae UHI_unlink = 7,
393b3c1694SLeon Alrae UHI_fstat = 8,
403b3c1694SLeon Alrae UHI_argc = 9,
413b3c1694SLeon Alrae UHI_argnlen = 10,
423b3c1694SLeon Alrae UHI_argn = 11,
433b3c1694SLeon Alrae UHI_plog = 13,
443b3c1694SLeon Alrae UHI_assert = 14,
453b3c1694SLeon Alrae UHI_pread = 19,
463b3c1694SLeon Alrae UHI_pwrite = 20,
473b3c1694SLeon Alrae UHI_link = 22
483b3c1694SLeon Alrae } UHIOp;
493b3c1694SLeon Alrae
503b3c1694SLeon Alrae typedef struct UHIStat {
513b3c1694SLeon Alrae int16_t uhi_st_dev;
523b3c1694SLeon Alrae uint16_t uhi_st_ino;
533b3c1694SLeon Alrae uint32_t uhi_st_mode;
543b3c1694SLeon Alrae uint16_t uhi_st_nlink;
553b3c1694SLeon Alrae uint16_t uhi_st_uid;
563b3c1694SLeon Alrae uint16_t uhi_st_gid;
573b3c1694SLeon Alrae int16_t uhi_st_rdev;
583b3c1694SLeon Alrae uint64_t uhi_st_size;
593b3c1694SLeon Alrae uint64_t uhi_st_atime;
603b3c1694SLeon Alrae uint64_t uhi_st_spare1;
613b3c1694SLeon Alrae uint64_t uhi_st_mtime;
623b3c1694SLeon Alrae uint64_t uhi_st_spare2;
633b3c1694SLeon Alrae uint64_t uhi_st_ctime;
643b3c1694SLeon Alrae uint64_t uhi_st_spare3;
653b3c1694SLeon Alrae uint64_t uhi_st_blksize;
663b3c1694SLeon Alrae uint64_t uhi_st_blocks;
673b3c1694SLeon Alrae uint64_t uhi_st_spare4[2];
683b3c1694SLeon Alrae } UHIStat;
693b3c1694SLeon Alrae
703b3c1694SLeon Alrae enum UHIOpenFlags {
713b3c1694SLeon Alrae UHIOpen_RDONLY = 0x0,
723b3c1694SLeon Alrae UHIOpen_WRONLY = 0x1,
733b3c1694SLeon Alrae UHIOpen_RDWR = 0x2,
743b3c1694SLeon Alrae UHIOpen_APPEND = 0x8,
753b3c1694SLeon Alrae UHIOpen_CREAT = 0x200,
763b3c1694SLeon Alrae UHIOpen_TRUNC = 0x400,
773b3c1694SLeon Alrae UHIOpen_EXCL = 0x800
783b3c1694SLeon Alrae };
793b3c1694SLeon Alrae
807ba6e53aSRichard Henderson enum UHIErrno {
817ba6e53aSRichard Henderson UHI_EACCESS = 13,
827ba6e53aSRichard Henderson UHI_EAGAIN = 11,
837ba6e53aSRichard Henderson UHI_EBADF = 9,
847ba6e53aSRichard Henderson UHI_EBADMSG = 77,
857ba6e53aSRichard Henderson UHI_EBUSY = 16,
867ba6e53aSRichard Henderson UHI_ECONNRESET = 104,
877ba6e53aSRichard Henderson UHI_EEXIST = 17,
887ba6e53aSRichard Henderson UHI_EFBIG = 27,
897ba6e53aSRichard Henderson UHI_EINTR = 4,
907ba6e53aSRichard Henderson UHI_EINVAL = 22,
917ba6e53aSRichard Henderson UHI_EIO = 5,
927ba6e53aSRichard Henderson UHI_EISDIR = 21,
937ba6e53aSRichard Henderson UHI_ELOOP = 92,
947ba6e53aSRichard Henderson UHI_EMFILE = 24,
957ba6e53aSRichard Henderson UHI_EMLINK = 31,
967ba6e53aSRichard Henderson UHI_ENAMETOOLONG = 91,
977ba6e53aSRichard Henderson UHI_ENETDOWN = 115,
987ba6e53aSRichard Henderson UHI_ENETUNREACH = 114,
997ba6e53aSRichard Henderson UHI_ENFILE = 23,
1007ba6e53aSRichard Henderson UHI_ENOBUFS = 105,
1017ba6e53aSRichard Henderson UHI_ENOENT = 2,
1027ba6e53aSRichard Henderson UHI_ENOMEM = 12,
1037ba6e53aSRichard Henderson UHI_ENOSPC = 28,
1047ba6e53aSRichard Henderson UHI_ENOSR = 63,
1057ba6e53aSRichard Henderson UHI_ENOTCONN = 128,
1067ba6e53aSRichard Henderson UHI_ENOTDIR = 20,
1077ba6e53aSRichard Henderson UHI_ENXIO = 6,
1087ba6e53aSRichard Henderson UHI_EOVERFLOW = 139,
1097ba6e53aSRichard Henderson UHI_EPERM = 1,
1107ba6e53aSRichard Henderson UHI_EPIPE = 32,
1117ba6e53aSRichard Henderson UHI_ERANGE = 34,
1127ba6e53aSRichard Henderson UHI_EROFS = 30,
1137ba6e53aSRichard Henderson UHI_ESPIPE = 29,
1147ba6e53aSRichard Henderson UHI_ETIMEDOUT = 116,
1157ba6e53aSRichard Henderson UHI_ETXTBSY = 26,
1167ba6e53aSRichard Henderson UHI_EWOULDBLOCK = 11,
1177ba6e53aSRichard Henderson UHI_EXDEV = 18,
1187ba6e53aSRichard Henderson };
1197ba6e53aSRichard Henderson
report_fault(CPUMIPSState * env)120d53a3ed4SRichard Henderson static void report_fault(CPUMIPSState *env)
121d53a3ed4SRichard Henderson {
122d53a3ed4SRichard Henderson int op = env->active_tc.gpr[25];
123d53a3ed4SRichard Henderson error_report("Fault during UHI operation %d", op);
124d53a3ed4SRichard Henderson abort();
125d53a3ed4SRichard Henderson }
126d53a3ed4SRichard Henderson
uhi_cb(CPUState * cs,uint64_t ret,int err)12718639a28SRichard Henderson static void uhi_cb(CPUState *cs, uint64_t ret, int err)
128d859a77dSPhilippe Mathieu-Daudé {
129b77af26eSRichard Henderson CPUMIPSState *env = cpu_env(cs);
13018639a28SRichard Henderson
13118639a28SRichard Henderson #define E(N) case E##N: err = UHI_E##N; break
13218639a28SRichard Henderson
13318639a28SRichard Henderson switch (err) {
13418639a28SRichard Henderson case 0:
13518639a28SRichard Henderson break;
13618639a28SRichard Henderson E(PERM);
13718639a28SRichard Henderson E(NOENT);
13818639a28SRichard Henderson E(INTR);
13918639a28SRichard Henderson E(BADF);
14018639a28SRichard Henderson E(BUSY);
14118639a28SRichard Henderson E(EXIST);
14218639a28SRichard Henderson E(NOTDIR);
14318639a28SRichard Henderson E(ISDIR);
14418639a28SRichard Henderson E(INVAL);
14518639a28SRichard Henderson E(NFILE);
14618639a28SRichard Henderson E(MFILE);
14718639a28SRichard Henderson E(FBIG);
14818639a28SRichard Henderson E(NOSPC);
14918639a28SRichard Henderson E(SPIPE);
15018639a28SRichard Henderson E(ROFS);
15118639a28SRichard Henderson E(NAMETOOLONG);
15218639a28SRichard Henderson default:
15318639a28SRichard Henderson err = UHI_EINVAL;
15418639a28SRichard Henderson break;
15518639a28SRichard Henderson case EFAULT:
15618639a28SRichard Henderson report_fault(env);
1572c44b19cSLeon Alrae }
1582c44b19cSLeon Alrae
15918639a28SRichard Henderson #undef E
16018639a28SRichard Henderson
16118639a28SRichard Henderson env->active_tc.gpr[2] = ret;
16218639a28SRichard Henderson env->active_tc.gpr[3] = err;
16318639a28SRichard Henderson }
16418639a28SRichard Henderson
uhi_fstat_cb(CPUState * cs,uint64_t ret,int err)16518639a28SRichard Henderson static void uhi_fstat_cb(CPUState *cs, uint64_t ret, int err)
1663b3c1694SLeon Alrae {
16718639a28SRichard Henderson QEMU_BUILD_BUG_ON(sizeof(UHIStat) < sizeof(struct gdb_stat));
16818639a28SRichard Henderson
16918639a28SRichard Henderson if (!err) {
170b77af26eSRichard Henderson CPUMIPSState *env = cpu_env(cs);
171*6277e181SPhilippe Mathieu-Daudé bool swap_needed = HOST_BIG_ENDIAN != mips_env_is_bigendian(env);
17218639a28SRichard Henderson target_ulong addr = env->active_tc.gpr[5];
17318639a28SRichard Henderson UHIStat *dst = lock_user(VERIFY_WRITE, addr, sizeof(UHIStat), 1);
17418639a28SRichard Henderson struct gdb_stat s;
17518639a28SRichard Henderson
1763b3c1694SLeon Alrae if (!dst) {
177d53a3ed4SRichard Henderson report_fault(env);
1783b3c1694SLeon Alrae }
1793b3c1694SLeon Alrae
18018639a28SRichard Henderson memcpy(&s, dst, sizeof(struct gdb_stat));
18118639a28SRichard Henderson memset(dst, 0, sizeof(UHIStat));
18218639a28SRichard Henderson
183*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_dev = be32_to_cpu(s.gdb_st_dev);
184*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_ino = be32_to_cpu(s.gdb_st_ino);
185*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_mode = be32_to_cpu(s.gdb_st_mode);
186*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_nlink = be32_to_cpu(s.gdb_st_nlink);
187*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_uid = be32_to_cpu(s.gdb_st_uid);
188*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_gid = be32_to_cpu(s.gdb_st_gid);
189*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_rdev = be32_to_cpu(s.gdb_st_rdev);
190*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_size = be64_to_cpu(s.gdb_st_size);
191*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_atime = be32_to_cpu(s.gdb_st_atime);
192*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_mtime = be32_to_cpu(s.gdb_st_mtime);
193*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_ctime = be32_to_cpu(s.gdb_st_ctime);
194*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_blksize = be64_to_cpu(s.gdb_st_blksize);
195*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_blocks = be64_to_cpu(s.gdb_st_blocks);
196*6277e181SPhilippe Mathieu-Daudé
197*6277e181SPhilippe Mathieu-Daudé if (swap_needed) {
198*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_dev = bswap16(dst->uhi_st_dev);
199*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_ino = bswap16(dst->uhi_st_ino);
200*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_mode = bswap32(dst->uhi_st_mode);
201*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_nlink = bswap16(dst->uhi_st_nlink);
202*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_uid = bswap16(dst->uhi_st_uid);
203*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_gid = bswap16(dst->uhi_st_gid);
204*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_rdev = bswap16(dst->uhi_st_rdev);
205*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_size = bswap64(dst->uhi_st_size);
206*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_atime = bswap64(dst->uhi_st_atime);
207*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_mtime = bswap64(dst->uhi_st_mtime);
208*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_ctime = bswap64(dst->uhi_st_ctime);
209*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_blksize = bswap64(dst->uhi_st_blksize);
210*6277e181SPhilippe Mathieu-Daudé dst->uhi_st_blocks = bswap64(dst->uhi_st_blocks);
211*6277e181SPhilippe Mathieu-Daudé }
21218639a28SRichard Henderson
21318639a28SRichard Henderson unlock_user(dst, addr, sizeof(UHIStat));
2143b3c1694SLeon Alrae }
2153b3c1694SLeon Alrae
21618639a28SRichard Henderson uhi_cb(cs, ret, err);
2173b3c1694SLeon Alrae }
2183b3c1694SLeon Alrae
mips_semihosting(CPUMIPSState * env)2198ec7e3c5SRichard Henderson void mips_semihosting(CPUMIPSState *env)
2203b3c1694SLeon Alrae {
22118639a28SRichard Henderson CPUState *cs = env_cpu(env);
2223b3c1694SLeon Alrae target_ulong *gpr = env->active_tc.gpr;
2233b3c1694SLeon Alrae const UHIOp op = gpr[25];
224412411b3SRichard Henderson char *p;
2253b3c1694SLeon Alrae
2263b3c1694SLeon Alrae switch (op) {
2273b3c1694SLeon Alrae case UHI_exit:
22818639a28SRichard Henderson gdb_exit(gpr[4]);
2293b3c1694SLeon Alrae exit(gpr[4]);
23018639a28SRichard Henderson
2313b3c1694SLeon Alrae case UHI_open:
23218639a28SRichard Henderson {
233b10ccec1SRichard Henderson target_ulong fname = gpr[4];
23418639a28SRichard Henderson int ret = -1;
23518639a28SRichard Henderson
236b10ccec1SRichard Henderson p = lock_user_string(fname);
237b10ccec1SRichard Henderson if (!p) {
238b10ccec1SRichard Henderson report_fault(env);
239b10ccec1SRichard Henderson }
2403b3c1694SLeon Alrae if (!strcmp("/dev/stdin", p)) {
24118639a28SRichard Henderson ret = 0;
2423b3c1694SLeon Alrae } else if (!strcmp("/dev/stdout", p)) {
24318639a28SRichard Henderson ret = 1;
2443b3c1694SLeon Alrae } else if (!strcmp("/dev/stderr", p)) {
24518639a28SRichard Henderson ret = 2;
2463b3c1694SLeon Alrae }
247b10ccec1SRichard Henderson unlock_user(p, fname, 0);
24818639a28SRichard Henderson
24918639a28SRichard Henderson /* FIXME: reusing a guest fd doesn't seem correct. */
25018639a28SRichard Henderson if (ret >= 0) {
25118639a28SRichard Henderson gpr[2] = ret;
2523b3c1694SLeon Alrae break;
2533b3c1694SLeon Alrae }
25418639a28SRichard Henderson
255b10ccec1SRichard Henderson semihost_sys_open(cs, uhi_cb, fname, 0, gpr[5], gpr[6]);
25618639a28SRichard Henderson }
25718639a28SRichard Henderson break;
25818639a28SRichard Henderson
25918639a28SRichard Henderson case UHI_close:
26018639a28SRichard Henderson semihost_sys_close(cs, uhi_cb, gpr[4]);
2613b3c1694SLeon Alrae break;
2623b3c1694SLeon Alrae case UHI_read:
26318639a28SRichard Henderson semihost_sys_read(cs, uhi_cb, gpr[4], gpr[5], gpr[6]);
2643b3c1694SLeon Alrae break;
2653b3c1694SLeon Alrae case UHI_write:
26618639a28SRichard Henderson semihost_sys_write(cs, uhi_cb, gpr[4], gpr[5], gpr[6]);
2673b3c1694SLeon Alrae break;
2683b3c1694SLeon Alrae case UHI_lseek:
26918639a28SRichard Henderson semihost_sys_lseek(cs, uhi_cb, gpr[4], gpr[5], gpr[6]);
2703b3c1694SLeon Alrae break;
2713b3c1694SLeon Alrae case UHI_unlink:
27218639a28SRichard Henderson semihost_sys_remove(cs, uhi_cb, gpr[4], 0);
2733b3c1694SLeon Alrae break;
2743b3c1694SLeon Alrae case UHI_fstat:
27518639a28SRichard Henderson semihost_sys_fstat(cs, uhi_fstat_cb, gpr[4], gpr[5]);
2763b3c1694SLeon Alrae break;
27718639a28SRichard Henderson
2783b3c1694SLeon Alrae case UHI_argc:
2793b3c1694SLeon Alrae gpr[2] = semihosting_get_argc();
2803b3c1694SLeon Alrae break;
2813b3c1694SLeon Alrae case UHI_argnlen:
2823bb45bbcSRichard Henderson {
2833bb45bbcSRichard Henderson const char *s = semihosting_get_arg(gpr[4]);
2843bb45bbcSRichard Henderson gpr[2] = s ? strlen(s) : -1;
2853b3c1694SLeon Alrae }
2863b3c1694SLeon Alrae break;
2873b3c1694SLeon Alrae case UHI_argn:
2883bb45bbcSRichard Henderson {
2893bb45bbcSRichard Henderson const char *s = semihosting_get_arg(gpr[4]);
2903bb45bbcSRichard Henderson target_ulong addr;
2913bb45bbcSRichard Henderson size_t len;
2923bb45bbcSRichard Henderson
2933bb45bbcSRichard Henderson if (!s) {
2943b3c1694SLeon Alrae gpr[2] = -1;
2953bb45bbcSRichard Henderson break;
2963b3c1694SLeon Alrae }
2973bb45bbcSRichard Henderson len = strlen(s) + 1;
2983bb45bbcSRichard Henderson addr = gpr[5];
2993bb45bbcSRichard Henderson p = lock_user(VERIFY_WRITE, addr, len, 0);
3003bb45bbcSRichard Henderson if (!p) {
3013bb45bbcSRichard Henderson report_fault(env);
3023bb45bbcSRichard Henderson }
3033bb45bbcSRichard Henderson memcpy(p, s, len);
3043bb45bbcSRichard Henderson unlock_user(p, addr, len);
3053bb45bbcSRichard Henderson gpr[2] = 0;
3063bb45bbcSRichard Henderson }
3073b3c1694SLeon Alrae break;
308ea421060SRichard Henderson
3093b3c1694SLeon Alrae case UHI_plog:
310ea421060SRichard Henderson {
311ea421060SRichard Henderson target_ulong addr = gpr[4];
312ea421060SRichard Henderson ssize_t len = target_strlen(addr);
313ea421060SRichard Henderson GString *str;
314ea421060SRichard Henderson char *pct_d;
315ea421060SRichard Henderson
316ea421060SRichard Henderson if (len < 0) {
317ea421060SRichard Henderson report_fault(env);
3183b3c1694SLeon Alrae }
319ea421060SRichard Henderson p = lock_user(VERIFY_READ, addr, len, 1);
320ea421060SRichard Henderson if (!p) {
321ea421060SRichard Henderson report_fault(env);
322ea421060SRichard Henderson }
323ea421060SRichard Henderson
324ea421060SRichard Henderson pct_d = strstr(p, "%d");
325ea421060SRichard Henderson if (!pct_d) {
326b10ccec1SRichard Henderson unlock_user(p, addr, 0);
327ea421060SRichard Henderson semihost_sys_write(cs, uhi_cb, 2, addr, len);
3283b3c1694SLeon Alrae break;
329ea421060SRichard Henderson }
330ea421060SRichard Henderson
331ea421060SRichard Henderson str = g_string_new_len(p, pct_d - p);
332ea421060SRichard Henderson g_string_append_printf(str, "%d%s", (int)gpr[5], pct_d + 2);
333b10ccec1SRichard Henderson unlock_user(p, addr, 0);
334ea421060SRichard Henderson
335ea421060SRichard Henderson /*
336ea421060SRichard Henderson * When we're using gdb, we need a guest address, so
337ea421060SRichard Henderson * drop the string onto the stack below the stack pointer.
338ea421060SRichard Henderson */
339ea421060SRichard Henderson if (use_gdb_syscalls()) {
340ea421060SRichard Henderson addr = gpr[29] - str->len;
341ea421060SRichard Henderson p = lock_user(VERIFY_WRITE, addr, str->len, 0);
3428809baf4SPeter Maydell if (!p) {
3438809baf4SPeter Maydell report_fault(env);
3448809baf4SPeter Maydell }
345ea421060SRichard Henderson memcpy(p, str->str, str->len);
346ea421060SRichard Henderson unlock_user(p, addr, str->len);
347ea421060SRichard Henderson semihost_sys_write(cs, uhi_cb, 2, addr, str->len);
348ea421060SRichard Henderson } else {
349ea421060SRichard Henderson gpr[2] = qemu_semihosting_console_write(str->str, str->len);
350ea421060SRichard Henderson }
351ea421060SRichard Henderson g_string_free(str, true);
352ea421060SRichard Henderson }
353ea421060SRichard Henderson break;
354ea421060SRichard Henderson
3553b3c1694SLeon Alrae case UHI_assert:
356412411b3SRichard Henderson {
357412411b3SRichard Henderson const char *msg, *file;
358412411b3SRichard Henderson
359412411b3SRichard Henderson msg = lock_user_string(gpr[4]);
360412411b3SRichard Henderson if (!msg) {
361412411b3SRichard Henderson msg = "<EFAULT>";
362412411b3SRichard Henderson }
363412411b3SRichard Henderson file = lock_user_string(gpr[5]);
364412411b3SRichard Henderson if (!file) {
365412411b3SRichard Henderson file = "<EFAULT>";
366412411b3SRichard Henderson }
367412411b3SRichard Henderson
368412411b3SRichard Henderson error_report("UHI assertion \"%s\": file \"%s\", line %d",
369412411b3SRichard Henderson msg, file, (int)gpr[6]);
3703b3c1694SLeon Alrae abort();
371412411b3SRichard Henderson }
372412411b3SRichard Henderson
3733b3c1694SLeon Alrae default:
374d53a3ed4SRichard Henderson error_report("Unknown UHI operation %d", op);
3753b3c1694SLeon Alrae abort();
3763b3c1694SLeon Alrae }
3773b3c1694SLeon Alrae }
378