Annotation of qemu/roms/openbios/kernel/cross.h, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.