mirror of
https://github.com/X11Libre/xserver.git
synced 2026-10-21 01:13:38 +00:00
Allow callers to arm a sigjmp_buf on a registered mapping so the
SIGBUS handler can siglongjmp instead of remapping and retrying the
faulting instruction.
Needed when the mapping contains objects that are unsafe to resume
on after a replace.
This is preparation work for the next commit where that mechanism is
used.
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Assisted-by: AI
Part-of: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/2270>
(cherry picked from commit 7a0b3e2197)
80 lines
2.3 KiB
C
80 lines
2.3 KiB
C
/*
|
|
* Copyright © 2013 Keith Packard
|
|
*
|
|
* Permission to use, copy, modify, distribute, and sell this software and its
|
|
* documentation for any purpose is hereby granted without fee, provided that
|
|
* the above copyright notice appear in all copies and that both that copyright
|
|
* notice and this permission notice appear in supporting documentation, and
|
|
* that the name of the copyright holders not be used in advertising or
|
|
* publicity pertaining to distribution of the software without specific,
|
|
* written prior permission. The copyright holders make no representations
|
|
* about the suitability of this software for any purpose. It is provided "as
|
|
* is" without express or implied warranty.
|
|
*
|
|
* THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
|
|
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
|
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
|
|
* OF THIS SOFTWARE.
|
|
*/
|
|
|
|
#ifndef _BUSFAULT_H_
|
|
#define _BUSFAULT_H_
|
|
|
|
#include <dix-config.h>
|
|
|
|
typedef void (*busfault_notify_ptr) (void *context);
|
|
|
|
#ifdef HAVE_SIGACTION
|
|
|
|
#include <sys/types.h>
|
|
#include <setjmp.h>
|
|
|
|
struct busfault *
|
|
busfault_register_mmap(void *addr, size_t size, busfault_notify_ptr notify, void *context);
|
|
|
|
void
|
|
busfault_unregister(struct busfault *busfault);
|
|
|
|
/*
|
|
* If jmp is non-NULL when a SIGBUS hits this mapping, the handler
|
|
* siglongjmps there instead of remapping and retrying the faulting
|
|
* instruction. Callers must use sigsetjmp(..., 1).
|
|
* Pass NULL to clear.
|
|
*/
|
|
void
|
|
busfault_set_jmp(struct busfault *busfault, sigjmp_buf *jmp);
|
|
|
|
void
|
|
busfault_check(void);
|
|
|
|
void busfault_init(void);
|
|
|
|
#else
|
|
|
|
struct busfault;
|
|
|
|
static inline struct busfault *
|
|
busfault_register_mmap(void *addr, size_t size, busfault_notify_ptr notify, void *context)
|
|
{
|
|
(void) addr;
|
|
(void) size;
|
|
(void) notify;
|
|
(void) context;
|
|
return NULL;
|
|
}
|
|
|
|
static inline void
|
|
busfault_unregister(struct busfault *busfault)
|
|
{
|
|
(void) busfault;
|
|
}
|
|
|
|
static inline void busfault_check(void) {}
|
|
static inline void busfault_init(void) {}
|
|
|
|
#endif
|
|
|
|
#endif /* _BUSFAULT_H_ */
|