summaryrefslogblamecommitdiffstats
path: root/mem/memory.h
blob: 41323ed6616bfd2e81e784376015b6a4f6d7baef (plain) (tree)

































                                                                        
                                                                         

                                                          


                                           


                                                                                      










                                                                            
                                       

                                                   

                     
      
#ifndef JOVE_MEM_H
#define JOVE_MEM_H 1

#define PAGESIZE 4096ULL
#define KiB 1024ULL
#define MiB (KiB * KiB)
#define GiB (MiB * KiB)
#define TiB (GiB * KiB)

#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>
typedef uintptr_t physptr_t;

#include "slab.h"

/*Linear*/
void mem_paging_setup(void);

physptr_t mem_linear_tophys(uintptr_t virt);

/**Check if pointer is within valid memory.
 * @param ptr pointer to check.
 * @return if the pointer is invalid.*/
bool mem_check_ptr(const void *ptr);

/**Make sure the range indicated is available in memory.
 * If necessary, allocate new pages using the passed flags
 * @param from start of the range.
 * @param to end of the range.
 * @param rw flag to mark page is writeable.
 * @param user flag to mark page as user accessable*/
void mem_ensure_range(uintptr_t from, uintptr_t to, bool rw, bool user);

/** Make sure the range indicated is available in memory for specified pd
 * If necessary, allocate new pages using the passed flags
 * @param pd pointer to page directory to edit
 * @param from start of the range
 * @param to end of the range
 * @param rw flag to mark page is writeable
 * @param user flag to mark page as user accessable*/
void mem_ensure_range_for(void *pd, uintptr_t from, uintptr_t to, bool rw, bool user);

void mem_slab_setup(void);
void mem_slabcache_new(struct SlabCache *cache, char *name, size_t objsize);

void* mem_slab_alloc(struct SlabCache *cache);
void mem_slab_free(struct SlabCache *cache, void *ptr);

void* mem_alloc(size_t width);
void mem_free(void *ptr);

/*Physical*/

physptr_t mem_phys_alloc(size_t pages);
void mem_phys_reserve(physptr_t start, size_t len);

void mem_setup(void);

#endif