Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/arch/ia64/include/ddi.h

    r63f8966 r314f3a3c  
    5252static inline void pio_write_8(ioport8_t *port, uint8_t v)
    5353{
    54         uintptr_t prt = (uintptr_t) port;
     54        if (port < (ioport8_t *) IO_SPACE_BOUNDARY) {
     55                uintptr_t prt = (uintptr_t) port;
    5556
    56         *((ioport8_t *)(IA64_IOSPACE_ADDRESS +
    57             ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     57                *((ioport8_t *)(IA64_IOSPACE_ADDRESS +
     58                    ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     59        } else {
     60                *port = v;
     61        }
    5862
    5963        asm volatile ("mf\n" ::: "memory");
     64        asm volatile ("mf.a\n" ::: "memory");
    6065}
    6166
    6267static inline void pio_write_16(ioport16_t *port, uint16_t v)
    6368{
    64         uintptr_t prt = (uintptr_t) port;
     69        if (port < (ioport16_t *) IO_SPACE_BOUNDARY) {
     70                uintptr_t prt = (uintptr_t) port;
    6571
    66         *((ioport16_t *)(IA64_IOSPACE_ADDRESS +
    67             ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     72                *((ioport16_t *)(IA64_IOSPACE_ADDRESS +
     73                    ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     74        } else {
     75                *port = v;
     76        }
    6877
    6978        asm volatile ("mf\n" ::: "memory");
     79        asm volatile ("mf.a\n" ::: "memory");
    7080}
    7181
    7282static inline void pio_write_32(ioport32_t *port, uint32_t v)
    7383{
    74         uintptr_t prt = (uintptr_t) port;
     84        if (port < (ioport32_t *) IO_SPACE_BOUNDARY) {
     85                uintptr_t prt = (uintptr_t) port;
    7586
    76         *((ioport32_t *)(IA64_IOSPACE_ADDRESS +
    77             ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     87                *((ioport32_t *)(IA64_IOSPACE_ADDRESS +
     88                    ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     89        } else {
     90                *port = v;
     91        }
    7892
    7993        asm volatile ("mf\n" ::: "memory");
     94        asm volatile ("mf.a\n" ::: "memory");
    8095}
    8196
    8297static inline uint8_t pio_read_8(ioport8_t *port)
    8398{
    84         uintptr_t prt = (uintptr_t) port;
     99        uint8_t v;
    85100
    86101        asm volatile ("mf\n" ::: "memory");
    87102
    88         return *((ioport8_t *)(IA64_IOSPACE_ADDRESS +
    89             ((prt & 0xfff) | ((prt >> 2) << 12))));
     103        if (port < (ioport8_t *) IO_SPACE_BOUNDARY) {
     104                uintptr_t prt = (uintptr_t) port;
     105
     106                v = *((ioport8_t *)(IA64_IOSPACE_ADDRESS +
     107                    ((prt & 0xfff) | ((prt >> 2) << 12))));
     108        } else {
     109                v = *port;
     110        }
     111
     112        asm volatile ("mf.a\n" ::: "memory");
     113
     114        return v;
    90115}
    91116
    92117static inline uint16_t pio_read_16(ioport16_t *port)
    93118{
    94         uintptr_t prt = (uintptr_t) port;
     119        uint16_t v;
    95120
    96121        asm volatile ("mf\n" ::: "memory");
    97122
    98         return *((ioport16_t *)(IA64_IOSPACE_ADDRESS +
    99             ((prt & 0xfff) | ((prt >> 2) << 12))));
     123        if (port < (ioport16_t *) IO_SPACE_BOUNDARY) {
     124                uintptr_t prt = (uintptr_t) port;
     125
     126                v = *((ioport16_t *)(IA64_IOSPACE_ADDRESS +
     127                    ((prt & 0xfff) | ((prt >> 2) << 12))));
     128        } else {
     129                v = *port;
     130        }
     131
     132        asm volatile ("mf.a\n" ::: "memory");
     133
     134        return v;
    100135}
    101136
    102137static inline uint32_t pio_read_32(ioport32_t *port)
    103138{
    104         uintptr_t prt = (uintptr_t) port;
     139        uint32_t v;
    105140
    106141        asm volatile ("mf\n" ::: "memory");
    107142
    108         return *((ioport32_t *)(IA64_IOSPACE_ADDRESS +
    109             ((prt & 0xfff) | ((prt >> 2) << 12))));
     143        if (port < (ioport32_t *) IO_SPACE_BOUNDARY) {
     144                uintptr_t prt = (uintptr_t) port;
     145
     146                v = *((ioport32_t *)(IA64_IOSPACE_ADDRESS +
     147                    ((prt & 0xfff) | ((prt >> 2) << 12))));
     148        } else {
     149                v = *port;
     150        }
     151
     152        asm volatile ("mf.a\n" ::: "memory");
     153
     154        return v;
    110155}
    111156
Note: See TracChangeset for help on using the changeset viewer.