/*
 * @author  xamidev <xamidev@riseup.net>
 * @brief   Process definition
 * @license GPL-3.0-only
 */

#ifndef PROCESS_H
#define PROCESS_H

#include <stddef.h>
#include <config.h>
#include <stdint.h>
#include <limine.h>
#include <stdbool.h>

typedef enum {
    READY,
    RUNNING,
    DEAD
} status_t;

struct fd {
    int fd;
    char filename[PROCESS_NAME_MAX];  // File opened
    uint64_t cursor; // Cursor position in file
    bool open;
};

struct process {
    size_t pid;
    char name[PROCESS_NAME_MAX];

    status_t status;
    struct cpu_status* context;
	void* root_page_table; // Process PML4 (should contain kernel PML4 in higher half [256-511]
    void* kernel_stack; // Used for interrupts (syscall: int 0x80), defines the TSS RSP0
    
    struct fd fdt[FDT_MAX]; // File Descriptor Table
    size_t next_free_fd;
    
    struct process* next;
};

void process_init(void);
struct process* process_create(char* name, void(*function)(void*), void* arg);
void process_add(struct process** processes_list, struct process* process);
void process_delete(struct process** processes_list, struct process* process);
struct process* process_get_next(struct process* process);
void process_exit(void);

void process_display_list(struct process* processes_list);


void process_create_user_raw(char* file, int size, char* name);

#endif
