68 lines
2.4 KiB
C
68 lines
2.4 KiB
C
#ifndef COSMOPOLITAN_APE_RELOCATIONS_H_
|
||
#define COSMOPOLITAN_APE_RELOCATIONS_H_
|
||
/*─────────────────────────────────────────────────────────────────────────────╗
|
||
│ αcτµαlly pδrταblε εxεcµταblε § relocations │
|
||
╚──────────────────────────────────────────────────────────────────────────────╝
|
||
One of the things αcτµαlly pδrταblε εxεcµταblε does a good job
|
||
abstracting, is how a program needs to exist at three addresses
|
||
simultaneously during the early stages of the loading process.
|
||
|
||
By default, the linker calculates all symbols using virtual addresses.
|
||
In some cases it's necessary to use addend macros that change virtual
|
||
addresses into the other two types: physical and real. */
|
||
|
||
#ifndef IMAGE_BASE_VIRTUAL
|
||
#define IMAGE_BASE_VIRTUAL 0x400000
|
||
#endif
|
||
|
||
#ifndef IMAGE_BASE_PHYSICAL
|
||
#define IMAGE_BASE_PHYSICAL 0x100000
|
||
#endif
|
||
|
||
/**
|
||
* Location of anything goes memory for real mode.
|
||
*
|
||
* The MBR won't load program content beyond this address, so we have
|
||
* room for buffers, page tables, etc. before we reach the stack frame.
|
||
*/
|
||
#ifndef REAL_SCRATCH_AREA
|
||
#define REAL_SCRATCH_AREA 0x40000
|
||
#endif
|
||
|
||
/**
|
||
* Location of real mode 64kb stack frame.
|
||
*
|
||
* This address was chosen because memory beyond 0x80000 can't be
|
||
* accessed safely without consulting e820.
|
||
*/
|
||
#ifndef REAL_STACK_FRAME
|
||
#define REAL_STACK_FRAME 0x70000
|
||
#endif
|
||
|
||
/**
|
||
* Returns Relative Virtual Address.
|
||
*/
|
||
#define RVA(x) ((x) - (IMAGE_BASE_VIRTUAL))
|
||
|
||
/**
|
||
* Adjusts virtual address so it's relative to load address.
|
||
*/
|
||
#define PHYSICAL(x) ((x) - (IMAGE_BASE_VIRTUAL - IMAGE_BASE_PHYSICAL))
|
||
|
||
/**
|
||
* Makes high-entropy read-only addresses relocatable in real mode.
|
||
*/
|
||
#define REAL(x) ((x) - (IMAGE_BASE_VIRTUAL - IMAGE_BASE_REAL))
|
||
|
||
#if IMAGE_BASE_VIRTUAL % 0x200000 != 0
|
||
#error "IMAGE_BASE_VIRTUAL must be 2mb aligned"
|
||
#endif
|
||
#if IMAGE_BASE_PHYSICAL % 0x1000 != 0
|
||
#error "IMAGE_BASE_PHYSICAL must be 4kb aligned"
|
||
#endif
|
||
#if IMAGE_BASE_REAL % 0x1000 != 0
|
||
#error "IMAGE_BASE_REAL must be 4kb aligned"
|
||
#endif
|
||
|
||
#endif /* COSMOPOLITAN_APE_RELOCATIONS_H_ */
|