diff --git a/Makefile b/Makefile index 85bbce7..316c2c9 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,7 @@ OBJS += builtin-version.o OBJS += cpuid.o OBJS += disk/core.o OBJS += framebuffer.o +OBJS += guest_compat.o OBJS += hw/rtc.o OBJS += hw/serial.o OBJS += interrupt.o diff --git a/builtin-run.c b/builtin-run.c index 646ba21..501e0bf 100644 --- a/builtin-run.c +++ b/builtin-run.c @@ -27,6 +27,7 @@ #include "kvm/rtc.h" #include "kvm/sdl.h" #include "kvm/vnc.h" +#include "kvm/guest_compat.h" #include @@ -729,6 +730,8 @@ int kvm_cmd_run(int argc, const char **argv, const char *prefix) exit_code = 1; } + compat__print_all_messages(); + fb__stop(); virtio_blk__delete_all(kvm); diff --git a/guest_compat.c b/guest_compat.c new file mode 100644 index 0000000..c5bacb8 --- /dev/null +++ b/guest_compat.c @@ -0,0 +1,104 @@ +#include "kvm/guest_compat.h" + +#include "kvm/mutex.h" + +#include +#include + +struct compat_message { + int id; + char *title; + char *desc; + + struct list_head list; +}; + +static int id; +static DEFINE_MUTEX(compat_mtx); +static LIST_HEAD(messages); + +int compat__add_message(const char *title, const char *desc) +{ + struct compat_message *msg; + + mutex_lock(&compat_mtx); + msg = malloc(sizeof(*msg)); + if (msg == NULL) + goto cleanup; + + *msg = (struct compat_message) { + .id = id, + .title = strdup(title), + .desc = strdup(desc), + }; + + if (msg->title == NULL || msg->desc == NULL) + goto cleanup; + + list_add_tail(&msg->list, &messages); + + mutex_unlock(&compat_mtx); + + return id++; + +cleanup: + if (msg) { + free(msg->title); + free(msg->desc); + free(msg); + } + + mutex_unlock(&compat_mtx); + + return -ENOMEM; +} + +static void compat__free(struct compat_message *msg) +{ + free(msg->title); + free(msg->desc); + free(msg); +} + +int compat__remove_message(int id) +{ + struct compat_message *pos, *n; + + mutex_lock(&compat_mtx); + + list_for_each_entry_safe(pos, n, &messages, list) { + if (pos->id == id) { + list_del(&pos->list); + compat__free(pos); + + mutex_unlock(&compat_mtx); + + return 0; + } + } + + mutex_unlock(&compat_mtx); + + return -ENOENT; +} + +int compat__print_all_messages(void) +{ + mutex_lock(&compat_mtx); + + while (!list_empty(&messages)) { + struct compat_message *msg; + + msg = list_first_entry(&messages, struct compat_message, list); + + printf("\n\n*** Compatability Warning ***\n\n\t%s\n\n%s\n", + msg->title, msg->desc); + + list_del(&msg->list); + compat__free(msg); + } + + mutex_unlock(&compat_mtx); + + return 0; +} \ No newline at end of file diff --git a/include/kvm/guest_compat.h b/include/kvm/guest_compat.h new file mode 100644 index 0000000..ae7abbd --- /dev/null +++ b/include/kvm/guest_compat.h @@ -0,0 +1,9 @@ +#ifndef KVM__GUEST_COMPAT_H +#define KVM__GUEST_COMPAT_H + +int compat__print_all_messages(void); +int compat__remove_message(int id); +int compat__add_message(const char *title, const char *description); + + +#endif \ No newline at end of file