Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d3c1cfcd authored by Martin Pärtel's avatar Martin Pärtel Committed by Richard Weinberger
Browse files

um: pass siginfo to guest process



UML guest processes now get correct siginfo_t for SIGTRAP, SIGFPE,
SIGILL and SIGBUS. Specifically, si_addr and si_code are now correct
where previously they were si_addr = NULL and si_code = 128.

Signed-off-by: default avatarMartin Pärtel <martin.partel@gmail.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent d4afcba9
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -60,7 +60,8 @@ extern unsigned long host_task_size;

extern int linux_main(int argc, char **argv);

extern void (*sig_info[])(int, struct uml_pt_regs *);
struct siginfo;
extern void (*sig_info[])(int, struct siginfo *si, struct uml_pt_regs *);

#endif

+2 −1
Original line number Diff line number Diff line
@@ -20,7 +20,8 @@ struct irq_fd {

enum { IRQ_READ, IRQ_WRITE };

extern void sigio_handler(int sig, struct uml_pt_regs *regs);
struct siginfo;
extern void sigio_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
extern void free_irq_by_fd(int fd);
extern void reactivate_fd(int fd, int irqnum);
extern void deactivate_fd(int fd, int irqnum);
+7 −6
Original line number Diff line number Diff line
@@ -9,6 +9,8 @@
#include "sysdep/ptrace.h"
#include "sysdep/faultinfo.h"

struct siginfo;

extern int uml_exitcode;

extern int ncpus;
@@ -22,7 +24,7 @@ extern void free_stack(unsigned long stack, int order);

extern int do_signal(void);
extern void interrupt_end(void);
extern void relay_signal(int sig, struct uml_pt_regs *regs);
extern void relay_signal(int sig, struct siginfo *si, struct uml_pt_regs *regs);

extern unsigned long segv(struct faultinfo fi, unsigned long ip,
			  int is_user, struct uml_pt_regs *regs);
@@ -33,9 +35,8 @@ extern unsigned int do_IRQ(int irq, struct uml_pt_regs *regs);
extern int smp_sigio_handler(void);
extern void initial_thread_cb(void (*proc)(void *), void *arg);
extern int is_syscall(unsigned long addr);
extern void timer_handler(int sig, struct uml_pt_regs *regs);

extern void timer_handler(int sig, struct uml_pt_regs *regs);
extern void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);

extern int start_uml(void);
extern void paging_init(void);
@@ -59,9 +60,9 @@ extern unsigned long from_irq_stack(int nested);
extern void syscall_trace(struct uml_pt_regs *regs, int entryexit);
extern int singlestepping(void *t);

extern void segv_handler(int sig, struct uml_pt_regs *regs);
extern void bus_handler(int sig, struct uml_pt_regs *regs);
extern void winch(int sig, struct uml_pt_regs *regs);
extern void segv_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
extern void bus_handler(int sig, struct siginfo *si, struct uml_pt_regs *regs);
extern void winch(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs);
extern void fatal_sigsegv(void) __attribute__ ((noreturn));


+1 −1
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ static struct irq_fd **last_irq_ptr = &active_fds;

extern void free_irqs(void);

void sigio_handler(int sig, struct uml_pt_regs *regs)
void sigio_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs)
{
	struct irq_fd *irq_fd;
	int n;
+1 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@
#include "kern_util.h"
#include "os.h"

void timer_handler(int sig, struct uml_pt_regs *regs)
void timer_handler(int sig, struct siginfo *unused_si, struct uml_pt_regs *regs)
{
	unsigned long flags;

Loading