1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * arch/h8300/asm/include/flat.h -- uClinux flat-format executables
4  */
5 
6 #ifndef __H8300_FLAT_H__
7 #define __H8300_FLAT_H__
8 
9 #include <asm/unaligned.h>
10 
11 /*
12  * on the H8 a couple of the relocations have an instruction in the
13  * top byte.  As there can only be 24bits of address space,  we just
14  * always preserve that 8bits at the top,  when it isn't an instruction
15  * is is 0 (davidm@snapgear.com)
16  */
17 
18 #define	flat_get_relocate_addr(rel)		(rel & ~0x00000001)
flat_get_addr_from_rp(u32 __user * rp,u32 relval,u32 flags,u32 * addr)19 static inline int flat_get_addr_from_rp(u32 __user *rp, u32 relval, u32 flags,
20 					u32 *addr)
21 {
22 	u32 val = get_unaligned((__force u32 *)rp);
23 	if (!(flags & FLAT_FLAG_GOTPIC))
24 		val &= 0x00ffffff;
25 	*addr = val;
26 	return 0;
27 }
28 
flat_put_addr_at_rp(u32 __user * rp,u32 addr,u32 rel)29 static inline int flat_put_addr_at_rp(u32 __user *rp, u32 addr, u32 rel)
30 {
31 	u32 *p = (__force u32 *)rp;
32 	put_unaligned((addr & 0x00ffffff) | (*(char *)p << 24), p);
33 	return 0;
34 }
35 
36 #endif /* __H8300_FLAT_H__ */
37