#ifndef _KERNEL_H_
#define _KERNEL_H_
-extern unsigned int do_shutdown;
-extern unsigned int shutdown_reason;
-extern struct wait_queue_head shutdown_queue;
extern void do_exit(void) __attribute__((noreturn));
extern void stop_kernel(void);
uint8_t xen_features[XENFEAT_NR_SUBMAPS * 32];
-#ifdef CONFIG_XENBUS
-unsigned int do_shutdown = 0;
-unsigned int shutdown_reason;
-DECLARE_WAIT_QUEUE_HEAD(shutdown_queue);
-#endif
-
void setup_xen_features(void)
{
xen_feature_info_t fi;
}
#ifdef CONFIG_XENBUS
+/* This should be overridden by the application we are linked against. */
+__attribute__((weak)) void app_shutdown(unsigned reason)
+{
+ printk("Shutdown requested: %d\n", reason);
+}
+
static void shutdown_thread(void *p)
{
const char *path = "control/shutdown";
const char *token = path;
xenbus_event_queue events = NULL;
char *shutdown, *err;
+ unsigned int shutdown_reason;
xenbus_watch_path_token(XBT_NIL, path, token, &events);
while ((err = xenbus_read(XBT_NIL, path, &shutdown)) != NULL)
{
else
/* Unknown */
shutdown_reason = SHUTDOWN_crash;
- wmb();
- do_shutdown = 1;
- wmb();
- wake_up(&shutdown_queue);
+ app_shutdown(shutdown_reason);
}
#endif
#include <xen/features.h>
#include <xen/version.h>
+static unsigned int do_shutdown = 0;
+static unsigned int shutdown_reason;
+static DECLARE_WAIT_QUEUE_HEAD(shutdown_queue);
+
static struct netfront_dev *net_dev;
static struct semaphore net_sem = __SEMAPHORE_INITIALIZER(net_sem, 0);
#endif
}
+void app_shutdown(unsigned reason)
+{
+ shutdown_reason = reason;
+ wmb();
+ do_shutdown = 1;
+ wmb();
+ wake_up(&shutdown_queue);
+}
+
static void shutdown_thread(void *p)
{
DEFINE_WAIT(w);