diff options
author | jdike <jdike> | 2004-04-07 20:43:01 +0000 |
---|---|---|
committer | jdike <jdike> | 2004-04-07 20:43:01 +0000 |
commit | 25788faf7a8fc5f50a44a354ade7ce77c909caa4 (patch) | |
tree | be6428e27d3684c2c343e18b1d08b7e68113c8e9 | |
parent | eb3725cfd1642c60c4462c9b819e1a8ebf8ee683 (diff) | |
download | uml-history-25788faf7a8fc5f50a44a354ade7ce77c909caa4.tar.gz |
On reboot, all possible pending signal sources are disabled.
-rw-r--r-- | arch/um/include/irq_user.h | 1 | ||||
-rw-r--r-- | arch/um/include/time_user.h | 1 | ||||
-rw-r--r-- | arch/um/kernel/irq_user.c | 14 | ||||
-rw-r--r-- | arch/um/main.c | 14 |
4 files changed, 30 insertions, 0 deletions
diff --git a/arch/um/include/irq_user.h b/arch/um/include/irq_user.h index 087bd39..0df4076 100644 --- a/arch/um/include/irq_user.h +++ b/arch/um/include/irq_user.h @@ -14,6 +14,7 @@ extern void free_irq_by_irq_and_dev(int irq, void *dev_id); extern void free_irq_by_fd(int fd); extern void reactivate_fd(int fd, int irqnum); extern void deactivate_fd(int fd, int irqnum); +extern int deactivate_all_fds(void); extern void forward_interrupts(int pid); extern void init_irq_signals(int on_sigstack); extern void forward_ipi(int fd, int pid); diff --git a/arch/um/include/time_user.h b/arch/um/include/time_user.h index 9ddb749..6793a2f 100644 --- a/arch/um/include/time_user.h +++ b/arch/um/include/time_user.h @@ -11,6 +11,7 @@ extern void switch_timers(int to_real); extern void set_interval(int timer_type); extern void idle_sleep(int secs); extern void enable_timer(void); +extern void disable_timer(void); extern unsigned long time_lock(void); extern void time_unlock(unsigned long); diff --git a/arch/um/kernel/irq_user.c b/arch/um/kernel/irq_user.c index 87ac2b0..38e66ac 100644 --- a/arch/um/kernel/irq_user.c +++ b/arch/um/kernel/irq_user.c @@ -364,6 +364,20 @@ void deactivate_fd(int fd, int irqnum) irq_unlock(flags); } +int deactivate_all_fds(void) +{ + struct irq_fd *irq; + int err; + + for(irq=active_fds;irq != NULL;irq = irq->next){ + err = os_clear_fd_async(irq->fd); + if(err) + return(err); + } + + return(0); +} + void forward_ipi(int fd, int pid) { int err; diff --git a/arch/um/main.c b/arch/um/main.c index 2fe4c64..0aaae84 100644 --- a/arch/um/main.c +++ b/arch/um/main.c @@ -17,6 +17,8 @@ #include "kern_util.h" #include "mem_user.h" #include "signal_user.h" +#include "time_user.h" +#include "irq_user.h" #include "user.h" #include "init.h" #include "mode.h" @@ -147,8 +149,20 @@ int main(int argc, char **argv, char **envp) /* Reboot */ if(ret){ + int err; + printf("\n"); + /* Let any pending signals fire, then disable them. This + * ensures that they won't be delivered after the exec, when + * they are definitely not expected. + */ + unblock_signals(); + disable_timer(); + err = deactivate_all_fds(); + if(err) + printf("deactivate_all_fds failed, errno = %d\n", -err); + execvp(new_argv[0], new_argv); perror("Failed to exec kernel"); ret = 1; |