summaryrefslogtreecommitdiff
path: root/include/hilbert/kernel/application.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/hilbert/kernel/application.hpp')
-rw-r--r--include/hilbert/kernel/application.hpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/include/hilbert/kernel/application.hpp b/include/hilbert/kernel/application.hpp
new file mode 100644
index 0000000..dc2c9a3
--- /dev/null
+++ b/include/hilbert/kernel/application.hpp
@@ -0,0 +1,70 @@
+#ifndef HILBERT_KERNEL_APPLICATION_HPP
+#define HILBERT_KERNEL_APPLICATION_HPP
+
+#include <hilbert/kernel/vfile.hpp>
+#include <cstdint>
+
+//TODO: end application, threading.
+
+namespace hilbert::kernel::application {
+
+ enum class app_state {
+ running,
+ paused,
+ zombie
+ };
+
+ struct app_instance {
+
+ app_state state;
+
+ uint64_t *p4;
+ uint64_t *p3;
+ uint64_t *p2s[512];
+ uint64_t **p1s[512];
+
+ bool **p1es_to_free_on_exit[512];
+
+ uint64_t p4_paddr;
+
+ //set to 0 if none
+ uint64_t framebuffer_vaddr;
+
+ //only valid if state is zombie
+ int exit_code;
+
+ //only valid if state is paused
+ struct {
+ uint64_t rip;
+ uint64_t rsp;
+ //TODO: etc.
+ } saved_regs;
+
+ app_instance();
+
+ //vaddr and paddr must be aligned, and vaddr must be < 0x0080.0000.0000
+ void map_page(uint64_t vaddr, uint64_t paddr,
+ bool write, bool execute, bool free_pram_on_exit);
+
+ //returns start of first page.
+ uint64_t get_free_vaddr_pages(uint64_t count);
+
+ //in lower half
+ uint64_t count_mapped_vram_pages();
+
+ };
+
+ extern app_instance *running_app;
+
+ enum class create_app_result {
+ success,
+ device_error,
+ app_corrupt,
+ fs_corrupt
+ };
+
+ create_app_result create_app(const vfile::vfile &file, app_instance *&out);
+
+}
+
+#endif