1
2
3
4
5
6
7
8
9
10
11#ifndef _ASM_MICROBLAZE_FLAT_H
12#define _ASM_MICROBLAZE_FLAT_H
13
14#include <asm/unaligned.h>
15
16#define flat_argvp_envp_on_stack() 0
17#define flat_old_ram_flag(flags) (flags)
18#define flat_reloc_valid(reloc, size) ((reloc) <= (size))
19#define flat_set_persistent(relval, p) 0
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35static inline unsigned long
36flat_get_addr_from_rp(unsigned long *rp, unsigned long relval,
37 unsigned long flags, unsigned long *persistent)
38{
39 unsigned long addr;
40 (void)flags;
41
42
43 if (relval & 0x80000000) {
44
45 unsigned long val_hi, val_lo;
46
47 val_hi = get_unaligned(rp);
48 val_lo = get_unaligned(rp+1);
49
50
51 addr = ((val_hi & 0xffff) << 16) + (val_lo & 0xffff);
52 } else {
53
54 addr = get_unaligned(rp);
55 }
56
57 return addr;
58}
59
60
61
62
63
64
65static inline void
66flat_put_addr_at_rp(unsigned long *rp, unsigned long addr, unsigned long relval)
67{
68
69 if (relval & 0x80000000) {
70
71 unsigned long val_hi = get_unaligned(rp);
72 unsigned long val_lo = get_unaligned(rp + 1);
73
74
75 val_hi = (val_hi & 0xffff0000) | addr >> 16;
76 val_lo = (val_lo & 0xffff0000) | (addr & 0xffff);
77
78
79 put_unaligned(val_hi, rp);
80 put_unaligned(val_lo, rp+1);
81 } else {
82
83 put_unaligned(addr, rp);
84 }
85}
86
87#define flat_get_relocate_addr(rel) (rel & 0x7fffffff)
88
89#endif
90