xref: /openbmc/qemu/linux-user/include/host/sparc64/host-signal.h (revision 50a75ff680ec8999baa0bffc49af8c6ad5c0035a)
1238b32deSRichard Henderson /*
2238b32deSRichard Henderson  * host-signal.h: signal info dependent on the host architecture
3238b32deSRichard Henderson  *
4238b32deSRichard Henderson  * Copyright (c) 2003-2005 Fabrice Bellard
5238b32deSRichard Henderson  * Copyright (c) 2021 Linaro Limited
6238b32deSRichard Henderson  *
7238b32deSRichard Henderson  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
8238b32deSRichard Henderson  * See the COPYING file in the top-level directory.
9238b32deSRichard Henderson  */
10238b32deSRichard Henderson 
11238b32deSRichard Henderson #ifndef SPARC64_HOST_SIGNAL_H
12238b32deSRichard Henderson #define SPARC64_HOST_SIGNAL_H
13238b32deSRichard Henderson 
14*4f152ef2SRichard Henderson /* The third argument to a SA_SIGINFO handler is struct sigcontext.  */
15*4f152ef2SRichard Henderson typedef struct sigcontext host_sigcontext;
16238b32deSRichard Henderson 
host_signal_pc(host_sigcontext * sc)17*4f152ef2SRichard Henderson static inline uintptr_t host_signal_pc(host_sigcontext *sc)
18238b32deSRichard Henderson {
19*4f152ef2SRichard Henderson     return sc->sigc_regs.tpc;
20238b32deSRichard Henderson }
21238b32deSRichard Henderson 
host_signal_set_pc(host_sigcontext * sc,uintptr_t pc)22*4f152ef2SRichard Henderson static inline void host_signal_set_pc(host_sigcontext *sc, uintptr_t pc)
23238b32deSRichard Henderson {
24*4f152ef2SRichard Henderson     sc->sigc_regs.tpc = pc;
25*4f152ef2SRichard Henderson     sc->sigc_regs.tnpc = pc + 4;
26238b32deSRichard Henderson }
27238b32deSRichard Henderson 
host_signal_mask(host_sigcontext * sc)28*4f152ef2SRichard Henderson static inline void *host_signal_mask(host_sigcontext *sc)
29238b32deSRichard Henderson {
30*4f152ef2SRichard Henderson     return &sc->sigc_mask;
31238b32deSRichard Henderson }
32238b32deSRichard Henderson 
host_signal_write(siginfo_t * info,host_sigcontext * uc)33238b32deSRichard Henderson static inline bool host_signal_write(siginfo_t *info, host_sigcontext *uc)
34238b32deSRichard Henderson {
35238b32deSRichard Henderson     uint32_t insn = *(uint32_t *)host_signal_pc(uc);
36238b32deSRichard Henderson 
37238b32deSRichard Henderson     if ((insn >> 30) == 3) {
38238b32deSRichard Henderson         switch ((insn >> 19) & 0x3f) {
39238b32deSRichard Henderson         case 0x05: /* stb */
40238b32deSRichard Henderson         case 0x15: /* stba */
41238b32deSRichard Henderson         case 0x06: /* sth */
42238b32deSRichard Henderson         case 0x16: /* stha */
43238b32deSRichard Henderson         case 0x04: /* st */
44238b32deSRichard Henderson         case 0x14: /* sta */
45238b32deSRichard Henderson         case 0x07: /* std */
46238b32deSRichard Henderson         case 0x17: /* stda */
47238b32deSRichard Henderson         case 0x0e: /* stx */
48238b32deSRichard Henderson         case 0x1e: /* stxa */
49238b32deSRichard Henderson         case 0x24: /* stf */
50238b32deSRichard Henderson         case 0x34: /* stfa */
51238b32deSRichard Henderson         case 0x27: /* stdf */
52238b32deSRichard Henderson         case 0x37: /* stdfa */
53238b32deSRichard Henderson         case 0x26: /* stqf */
54238b32deSRichard Henderson         case 0x36: /* stqfa */
55238b32deSRichard Henderson         case 0x25: /* stfsr */
56238b32deSRichard Henderson         case 0x3c: /* casa */
57238b32deSRichard Henderson         case 0x3e: /* casxa */
58238b32deSRichard Henderson             return true;
59238b32deSRichard Henderson         }
60238b32deSRichard Henderson     }
61238b32deSRichard Henderson     return false;
62238b32deSRichard Henderson }
63238b32deSRichard Henderson 
64238b32deSRichard Henderson #endif
65