Annotation of qemu/roms/ipxe/src/arch/i386/include/librm.h, revision 1.1.1.1

1.1       root        1: #ifndef LIBRM_H
                      2: #define LIBRM_H
                      3: 
                      4: FILE_LICENCE ( GPL2_OR_LATER );
                      5: 
                      6: /* Segment selectors as used in our protected-mode GDTs.
                      7:  *
                      8:  * Don't change these unless you really know what you're doing.
                      9:  */
                     10: 
                     11: #define VIRTUAL_CS 0x08
                     12: #define VIRTUAL_DS 0x10
                     13: #define PHYSICAL_CS 0x18
                     14: #define PHYSICAL_DS 0x20
                     15: #define REAL_CS 0x28
                     16: #define REAL_DS 0x30
                     17: #if 0
                     18: #define LONG_CS 0x38
                     19: #define LONG_DS 0x40
                     20: #endif
                     21: 
                     22: #ifndef ASSEMBLY
                     23: 
                     24: #ifdef UACCESS_LIBRM
                     25: #define UACCESS_PREFIX_librm
                     26: #else
                     27: #define UACCESS_PREFIX_librm __librm_
                     28: #endif
                     29: 
                     30: /* Variables in librm.S */
                     31: extern unsigned long virt_offset;
                     32: 
                     33: /**
                     34:  * Convert physical address to user pointer
                     35:  *
                     36:  * @v phys_addr                Physical address
                     37:  * @ret userptr                User pointer
                     38:  */
                     39: static inline __always_inline userptr_t
                     40: UACCESS_INLINE ( librm, phys_to_user ) ( unsigned long phys_addr ) {
                     41:        return ( phys_addr - virt_offset );
                     42: }
                     43: 
                     44: /**
                     45:  * Convert user buffer to physical address
                     46:  *
                     47:  * @v userptr          User pointer
                     48:  * @v offset           Offset from user pointer
                     49:  * @ret phys_addr      Physical address
                     50:  */
                     51: static inline __always_inline unsigned long
                     52: UACCESS_INLINE ( librm, user_to_phys ) ( userptr_t userptr, off_t offset ) {
                     53:        return ( userptr + offset + virt_offset );
                     54: }
                     55: 
                     56: static inline __always_inline userptr_t
                     57: UACCESS_INLINE ( librm, virt_to_user ) ( volatile const void *addr ) {
                     58:        return trivial_virt_to_user ( addr );
                     59: }
                     60: 
                     61: static inline __always_inline void *
                     62: UACCESS_INLINE ( librm, user_to_virt ) ( userptr_t userptr, off_t offset ) {
                     63:        return trivial_user_to_virt ( userptr, offset );
                     64: }
                     65: 
                     66: static inline __always_inline userptr_t
                     67: UACCESS_INLINE ( librm, userptr_add ) ( userptr_t userptr, off_t offset ) {
                     68:        return trivial_userptr_add ( userptr, offset );
                     69: }
                     70: 
                     71: static inline __always_inline void
                     72: UACCESS_INLINE ( librm, memcpy_user ) ( userptr_t dest, off_t dest_off,
                     73:                                        userptr_t src, off_t src_off,
                     74:                                        size_t len ) {
                     75:        trivial_memcpy_user ( dest, dest_off, src, src_off, len );
                     76: }
                     77: 
                     78: static inline __always_inline void
                     79: UACCESS_INLINE ( librm, memmove_user ) ( userptr_t dest, off_t dest_off,
                     80:                                         userptr_t src, off_t src_off,
                     81:                                         size_t len ) {
                     82:        trivial_memmove_user ( dest, dest_off, src, src_off, len );
                     83: }
                     84: 
                     85: static inline __always_inline void
                     86: UACCESS_INLINE ( librm, memset_user ) ( userptr_t buffer, off_t offset,
                     87:                                        int c, size_t len ) {
                     88:        trivial_memset_user ( buffer, offset, c, len );
                     89: }
                     90: 
                     91: static inline __always_inline size_t
                     92: UACCESS_INLINE ( librm, strlen_user ) ( userptr_t buffer, off_t offset ) {
                     93:        return trivial_strlen_user ( buffer, offset );
                     94: }
                     95: 
                     96: static inline __always_inline off_t
                     97: UACCESS_INLINE ( librm, memchr_user ) ( userptr_t buffer, off_t offset,
                     98:                                        int c, size_t len ) {
                     99:        return trivial_memchr_user ( buffer, offset, c, len );
                    100: }
                    101: 
                    102: 
                    103: /******************************************************************************
                    104:  *
                    105:  * Access to variables in .data16 and .text16
                    106:  *
                    107:  */
                    108: 
                    109: extern char *data16;
                    110: extern char *text16;
                    111: 
                    112: #define __data16( variable )                                           \
                    113:        __attribute__ (( section ( ".data16" ) ))                       \
                    114:        _data16_ ## variable __asm__ ( #variable )
                    115: 
                    116: #define __data16_array( variable, array )                              \
                    117:        __attribute__ (( section ( ".data16" ) ))                       \
                    118:        _data16_ ## variable array __asm__ ( #variable )
                    119: 
                    120: #define __bss16( variable )                                            \
                    121:        __attribute__ (( section ( ".bss16" ) ))                        \
                    122:        _data16_ ## variable __asm__ ( #variable )
                    123: 
                    124: #define __bss16_array( variable, array )                               \
                    125:        __attribute__ (( section ( ".bss16" ) ))                        \
                    126:        _data16_ ## variable array __asm__ ( #variable )
                    127: 
                    128: #define __text16( variable )                                           \
                    129:        __attribute__ (( section ( ".text16.data" ) ))                  \
                    130:        _text16_ ## variable __asm__ ( #variable )
                    131: 
                    132: #define __text16_array( variable, array )                              \
                    133:        __attribute__ (( section ( ".text16.data" ) ))                  \
                    134:        _text16_ ## variable array __asm__ ( #variable )
                    135: 
                    136: #define __use_data16( variable )                                       \
                    137:        ( * ( ( typeof ( _data16_ ## variable ) * )                     \
                    138:              & ( data16 [ ( size_t ) & ( _data16_ ## variable ) ] ) ) )
                    139: 
                    140: #define __use_text16( variable )                                       \
                    141:        ( * ( ( typeof ( _text16_ ## variable ) * )                     \
                    142:              & ( text16 [ ( size_t ) & ( _text16_ ## variable ) ] ) ) )
                    143: 
                    144: #define __from_data16( pointer )                                       \
                    145:        ( ( unsigned int )                                              \
                    146:          ( ( ( void * ) (pointer) ) - ( ( void * ) data16 ) ) )
                    147: 
                    148: #define __from_text16( pointer )                                       \
                    149:        ( ( unsigned int )                                              \
                    150:          ( ( ( void * ) (pointer) ) - ( ( void * ) text16 ) ) )
                    151: 
                    152: /* Variables in librm.S, present in the normal data segment */
                    153: extern uint16_t rm_sp;
                    154: extern uint16_t rm_ss;
                    155: extern uint16_t __data16 ( rm_cs );
                    156: #define rm_cs __use_data16 ( rm_cs )
                    157: extern uint16_t __text16 ( rm_ds );
                    158: #define rm_ds __use_text16 ( rm_ds )
                    159: 
                    160: /**
                    161:  * Convert segment:offset address to user buffer
                    162:  *
                    163:  * @v segment          Real-mode segment
                    164:  * @v offset           Real-mode offset
                    165:  * @ret buffer         User buffer
                    166:  */
                    167: static inline __always_inline userptr_t
                    168: real_to_user ( unsigned int segment, unsigned int offset ) {
                    169:        return ( phys_to_user ( ( segment << 4 ) + offset ) );
                    170: }
                    171: 
                    172: extern uint16_t copy_user_to_rm_stack ( userptr_t data, size_t size );
                    173: extern void remove_user_from_rm_stack ( userptr_t data, size_t size );
                    174: 
                    175: /* TEXT16_CODE: declare a fragment of code that resides in .text16 */
                    176: #define TEXT16_CODE( asm_code_str )                    \
                    177:        ".section \".text16\", \"ax\", @progbits\n\t"   \
                    178:        ".code16\n\t"                                   \
                    179:        asm_code_str "\n\t"                             \
                    180:        ".code32\n\t"                                   \
                    181:        ".previous\n\t"
                    182: 
                    183: /* REAL_CODE: declare a fragment of code that executes in real mode */
                    184: #define REAL_CODE( asm_code_str )                      \
                    185:        "pushl $1f\n\t"                                 \
                    186:        "call real_call\n\t"                            \
                    187:        "addl $4, %%esp\n\t"                            \
                    188:        TEXT16_CODE ( "\n1:\n\t"                        \
                    189:                      asm_code_str                      \
                    190:                      "\n\t"                            \
                    191:                      "ret\n\t" )
                    192: 
                    193: /* PHYS_CODE: declare a fragment of code that executes in flat physical mode */
                    194: #define PHYS_CODE( asm_code_str )                      \
                    195:        "call _virt_to_phys\n\t"                        \
                    196:        asm_code_str                                    \
                    197:        "call _phys_to_virt\n\t"
                    198: 
                    199: #endif /* ASSEMBLY */
                    200: 
                    201: #endif /* LIBRM_H */

unix.superglobalmegacorp.com

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