summaryrefslogtreecommitdiff
path: root/kernel/old/include/user.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/old/include/user.h')
-rw-r--r--kernel/old/include/user.h139
1 files changed, 139 insertions, 0 deletions
diff --git a/kernel/old/include/user.h b/kernel/old/include/user.h
new file mode 100644
index 0000000..672f916
--- /dev/null
+++ b/kernel/old/include/user.h
@@ -0,0 +1,139 @@
+/**
+** @file user.h
+**
+** @author CSCI-452 class of 20245
+**
+** @brief Declarations of user-level code management routines
+*/
+
+#ifndef USER_H_
+#define USER_H_
+
+#include <common.h>
+
+#include <procs.h>
+#include <x86/arch.h>
+
+// default value for EFLAGS in new processes
+#define DEFAULT_EFLAGS (EFL_MB1 | EFL_IF)
+
+/*
+** General (C and/or assembly) definitions
+*/
+
+#ifndef ASM_SRC
+
+/*
+** Start of C-only definitions
+*/
+
+/*
+** Types
+*/
+
+/*
+** Blob file organization
+**
+** The file begins with a four-byte magic number and a four-byte integer
+** indicating the number of ELF files contained in the blob. This is
+** followed by an array of 32-byte file table entries, and then the contents
+** of the ELF files in the order they appear in the program file table.
+**
+** Bytes Contents
+** ----- ----------------------------
+** 0 - 3 File magic number ("BLB\0")
+** 4 - 7 Number of ELF files in blob ("n")
+** 8 - n*32+8 Program file table
+** n*32+9 - ? ELF file contents
+**
+** Each program file table entry contains the following information:
+**
+** name File name (up to 19 characters long)
+** offset Byte offset to the ELF header for this file
+** size Size of this ELF file, in bytes
+** flags Flags related to this file
+*/
+
+// user program blob header
+typedef struct header_s {
+ char magic[4];
+ uint32_t num;
+} header_t;
+
+// length of the file name field
+#define NAMELEN 20
+
+// program descriptor
+typedef struct prog_s {
+ char name[NAMELEN]; // truncated name (15 chars)
+ uint32_t offset; // offset from the beginning of the blob
+ uint32_t size; // size of this ELF module
+ uint32_t flags; // miscellaneous flags
+} prog_t;
+
+/*
+** Globals
+*/
+
+/*
+** Prototypes
+*/
+
+/**
+** Name: user_init
+**
+** Initializes the user support module.
+*/
+void user_init(void);
+
+/**
+** Name: user_locate
+**
+** Locates a user program in the user code archive.
+**
+** @param what The ID of the user program to find
+**
+** @return pointer to the program table entry in the code archive, or NULL
+*/
+prog_t *user_locate(uint_t what);
+
+/**
+** Name: user_duplicate
+**
+** Duplicates the memory setup for an existing process.
+**
+** @param new The PCB for the new copy of the program
+** @param old The PCB for the existing the program
+**
+** @return the status of the duplicate attempt
+*/
+int user_duplicate(pcb_t *new, pcb_t *old);
+
+/**
+** Name: user_load
+**
+** Loads a user program from the user code archive into memory.
+** Allocates all needed frames and sets up the VM tables.
+**
+** @param prog A pointer to the program table entry to be loaded
+** @param pcb The PCB for the program being loaded
+** @param args The argument vector for the program
+** @param sys Is the argument vector from kernel code?
+**
+** @return the status of the load attempt
+*/
+int user_load(prog_t *prog, pcb_t *pcb, const char **args, bool_t sys);
+
+/**
+** Name: user_cleanup
+**
+** "Unloads" a user program. Deallocates all memory frames and
+** cleans up the VM structures.
+**
+** @param pcb The PCB of the program to be cleaned up
+*/
+void user_cleanup(pcb_t *pcb);
+
+#endif /* !ASM_SRC */
+
+#endif