summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjdike <jdike>2004-04-07 20:43:01 +0000
committerjdike <jdike>2004-04-07 20:43:01 +0000
commit25788faf7a8fc5f50a44a354ade7ce77c909caa4 (patch)
treebe6428e27d3684c2c343e18b1d08b7e68113c8e9
parenteb3725cfd1642c60c4462c9b819e1a8ebf8ee683 (diff)
downloaduml-history-25788faf7a8fc5f50a44a354ade7ce77c909caa4.tar.gz
On reboot, all possible pending signal sources are disabled.
-rw-r--r--arch/um/include/irq_user.h1
-rw-r--r--arch/um/include/time_user.h1
-rw-r--r--arch/um/kernel/irq_user.c14
-rw-r--r--arch/um/main.c14
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;