|
|
1.1 root 1: /* memory access abstraction layer for forth kernel
2: *
3: * Copyright (C) 2005 Stefan Reinauer
4: *
5: * See the file "COPYING" for further information about
6: * the copyright and warranty status of this work.
7: */
8:
9: #ifndef __CROSS_H
10: #define __CROSS_H 1
11:
12: /* The forthstrap compiler has to abstract the underlying dictionary
13: * type: big/little endian, 32/64bit. All other binaries shall use
14: * unchanged memory access for performance.
15: */
16:
17: /* byte swapping */
18:
19: #ifndef SWAP_ENDIANNESS
20:
21: /* trivial case - we don't have to change anything */
22: #define read_ucell(addr) (*(ucell *)(addr))
23: #define read_cell(addr) (*(cell *)(addr))
24: #define read_long(addr) (*(u32 *)(addr))
25: #define read_word(addr) (*(u16 *)(addr))
26: #define read_byte(addr) (*(u8 *)(addr))
27:
28: #define write_ucell(addr, value) {*(ucell *)(addr)=(value);}
29: #define write_cell(addr, value) {*(cell *)(addr)=(value);}
30: #define write_long(addr, value) {*(u32 *)(addr)=(value);}
31: #define write_word(addr, value) {*(u16 *)(addr)=(value);}
32: #define write_byte(addr, value) {*(u8 *)(addr)=(value);}
33:
34: #define target_ucell(x) (x)
35: #define target_cell(x) (x)
36: #define target_long(x) (x)
37: #define target_ulong(x) (x)
38:
39: #else /* SWAP_ENDIANNESS */
40:
41: #define target_word(value) ( (((value)>>8)&0xff) | (((value)&0xff)<<8) )
42: #define target_long(value) ( (((value)&0xff000000)>>24)|(((value)&0x00ff0000)>>8)|(((value)&0xff00)<<8)|(((value)&0xff)<<24) )
43: #define target_ulong(value) (target_long(value))
44:
45: #if BITS==32
46: #define target_ucell(value) ((ucell)target_long(value))
47: #define target_cell(value) ((cell)target_long(value))
48: #elif BITS==64
49: #define target_ucell(value) \
50: ((((ucell)target_long((value) & 0xffffffff)) << 32) | \
51: ((ucell)target_long((value) >> 32)))
52: #define target_cell(value) \
53: ((((cell)target_long((value) & 0xffffffff)) << 32) | \
54: ((cell)target_long((value) >> 32)))
55: #else
56: #error "Endianness not supported. Please report."
57: #endif
58:
59: #define read_ucell(addr) target_ucell(*(ucell *)(addr))
60: #define read_cell(addr) target_cell(*(cell *)(addr))
61: #define read_long(addr) target_long(*(u32 *)(addr))
62: #define read_word(addr) target_word(*(u16 *)(addr))
63: #define read_byte(addr) (*(u8 *)(addr))
64:
65: #define write_ucell(addr, value) {*(ucell *)(addr)=target_ucell(value);}
66: #define write_cell(addr, value) {*(cell *)(addr)=target_cell(value);}
67: #define write_long(addr, value) {*(u32 *)(addr)=target_long(value);}
68: #define write_word(addr, value) {*(u16 *)(addr)=target_word(value);}
69: #define write_byte(addr, value) {*(u8 *)(addr)=(value);}
70: #endif
71:
72: #ifdef CONFIG_LITTLE_ENDIAN
73: #define unaligned_read_word(addr) \
74: (read_byte(addr)|(read_byte((u8 *)addr+1)<<8))
75:
76: #define unaligned_read_long(addr) \
77: (unaligned_read_word(addr)|(unaligned_read_word((u8 *)addr+2)<<16))
78:
79: #define unaligned_write_word(addr, value) \
80: write_byte(addr, (value & 0xff)); write_byte((u8 *)(addr+1), (value>>8))
81:
82: #define unaligned_write_long(addr, value) \
83: unaligned_write_word(addr, (value & 0xffff)); \
84: unaligned_write_word((addr + 2), (value >> 16))
85:
86: #endif
87:
88: #ifdef CONFIG_BIG_ENDIAN
89: #define unaligned_read_word(addr) \
90: ((read_byte(addr)<<8)|read_byte((u8 *)addr+1))
91:
92: #define unaligned_read_long(addr) \
93: ((unaligned_read_word(addr)<<16)|unaligned_read_word((u8 *)addr+2))
94:
95: #define unaligned_write_word(addr, value) \
96: write_byte(addr, (value >> 8)); write_byte((u8 *)(addr+1), (value & 0xff))
97:
98: #define unaligned_write_long(addr, value) \
99: unaligned_write_word(addr, (value >> 16)); \
100: unaligned_write_word((addr + 2), (value & 0xffff))
101: #endif
102:
103: /* bit width handling */
104:
105: #if BITS==32
106: #define FMT_CELL_x PRIx32
107: #define FMT_CELL_d PRId32
108: #else
109: #define FMT_CELL_x PRIx64
110: #define FMT_CELL_d PRId64
111: #endif
112:
113: #ifdef NATIVE_BITWIDTH_SMALLER_THAN_HOST_BITWIDTH
114: extern unsigned long base_address;
115: #define pointer2cell(x) ((ucell)(((unsigned long)(x))-base_address))
116: #define cell2pointer(x) ((u8 *)(((unsigned long)(x))+base_address))
117: #endif
118:
119: #ifdef NATIVE_BITWIDTH_LARGER_THAN_HOST_BITWIDTH
120: #define pointer2cell(x) ((ucell)(unsigned long)(x))
121: #define cell2pointer(x) ((u8 *)((unsigned long)(x)&0xFFFFFFFFUL))
122: #endif
123:
124: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.