|
|
|
@ -25,9 +25,6 @@ |
|
|
|
|
#include <asm/kmap_types.h> |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT)) |
|
|
|
|
#define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT) |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Here we define all the compile-time 'special' virtual |
|
|
|
|
* addresses. The point is to have a constant address at |
|
|
|
@ -83,35 +80,7 @@ enum fixed_addresses { |
|
|
|
|
#define FIXADDR_START (FIXADDR_TOP + PAGE_SIZE - __FIXADDR_SIZE) |
|
|
|
|
#define FIXADDR_BOOT_START (FIXADDR_TOP + PAGE_SIZE - __FIXADDR_BOOT_SIZE) |
|
|
|
|
|
|
|
|
|
extern void __this_fixmap_does_not_exist(void); |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* 'index to address' translation. If anyone tries to use the idx |
|
|
|
|
* directly without tranlation, we catch the bug with a NULL-deference |
|
|
|
|
* kernel oops. Illegal ranges of incoming indices are caught too. |
|
|
|
|
*/ |
|
|
|
|
static __always_inline unsigned long fix_to_virt(const unsigned int idx) |
|
|
|
|
{ |
|
|
|
|
/*
|
|
|
|
|
* this branch gets completely eliminated after inlining, |
|
|
|
|
* except when someone tries to use fixaddr indices in an |
|
|
|
|
* illegal way. (such as mixing up address types or using |
|
|
|
|
* out-of-range indices). |
|
|
|
|
* |
|
|
|
|
* If it doesn't get removed, the linker will complain |
|
|
|
|
* loudly with a reasonably clear error message.. |
|
|
|
|
*/ |
|
|
|
|
if (idx >= __end_of_fixed_addresses) |
|
|
|
|
__this_fixmap_does_not_exist(); |
|
|
|
|
|
|
|
|
|
return __fix_to_virt(idx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline unsigned long virt_to_fix(const unsigned long vaddr) |
|
|
|
|
{ |
|
|
|
|
BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START); |
|
|
|
|
return __virt_to_fix(vaddr); |
|
|
|
|
} |
|
|
|
|
#include <asm-generic/fixmap.h> |
|
|
|
|
|
|
|
|
|
#endif /* !__ASSEMBLY__ */ |
|
|
|
|
|
|
|
|
|