You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.5 KiB
C

/* Copyright (C) 2021,2022 fef <owo@fef.moe>. All rights reserved. */
#pragma once
#include <arch/poison.h>
#include <limits.h>
/*
* If possible, arch should define this value as an unmappable base address.
* For example, on the amd64, this is set to 0xdead000000000000 because the
* highest 17 bits of linear addresses must always be identical there.
* As a result, it will *always* page fault when dereferenced, no matter
* the current state of the page maps.
*/
#ifndef POISON_BASE
#define POISON_BASE 0ul
#endif
/*
* You should only use values that `sus_nil()` finds sus (i.e. values < 0x1000),
* and whose LSB is zero. The latter is a little safety measure because most
* architectures use bit 0 of the page maps as a present flag. So, even if the
* impossible happens and this *somehow* ends up in a page map, it is marked as
* non-present and therefore page faults rather than exposing anything.
*/
#define PAGE_POISON_ALLOC (POISON_BASE + 0x00000010ul)
#define PAGE_POISON_FREE (POISON_BASE + 0x00000020ul)
#if LONG_BIT == 32
#define SLAB_POISON_ALLOC 0x61616160ul
#define SLAB_POISON_FREE 0x41414140ul
#elif LONG_BIT == 64
#define SLAB_POISON_ALLOC 0x6161616161616161ul
#define SLAB_POISON_FREE 0x4141414141414141ul
#elif LONG_BIT == 128
#define SLAB_POISON_ALLOC 0x61616161616161616161616161616160ul
#define SLAB_POISON_FREE 0x41414141414141414141414141414140ul
#else
#error "Unsupported long size"
#endif
#define CLIST_POISON_PREV (POISON_BASE + 0x000000c4ul)
#define CLIST_POISON_NEXT (POISON_BASE + 0x000000c8ul)