58 lines
1.7 KiB
C
58 lines
1.7 KiB
C
/***************************************************************************************
|
|
* Copyright (c) 2014-2022 Zihao Yu, Nanjing University
|
|
*
|
|
* NEMU is licensed under Mulan PSL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
* You may obtain a copy of Mulan PSL v2 at:
|
|
* http://license.coscl.org.cn/MulanPSL2
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
*
|
|
* See the Mulan PSL v2 for more details.
|
|
***************************************************************************************/
|
|
|
|
#ifndef __DEVICE_MAP_H__
|
|
#define __DEVICE_MAP_H__
|
|
|
|
#include <difftest.h>
|
|
#include <stdbool.h>
|
|
#include <types.h>
|
|
|
|
typedef void (*io_callback_t)(uint32_t, int, bool);
|
|
uint8_t *new_space(int size);
|
|
|
|
typedef struct {
|
|
const char *name;
|
|
// we treat ioaddr_t as paddr_t here
|
|
paddr_t low;
|
|
paddr_t high;
|
|
void *space;
|
|
io_callback_t callback;
|
|
} IOMap;
|
|
|
|
static inline bool map_inside(IOMap *map, paddr_t addr) {
|
|
return (addr >= map->low && addr <= map->high);
|
|
}
|
|
|
|
static inline int find_mapid_by_addr(IOMap *maps, int size, paddr_t addr) {
|
|
int i;
|
|
for (i = 0; i < size; i++) {
|
|
if (map_inside(maps + i, addr)) {
|
|
nemu_do_difftest = false;
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void add_pio_map(const char *name, ioaddr_t addr, void *space, uint32_t len,
|
|
io_callback_t callback);
|
|
void add_mmio_map(const char *name, paddr_t addr, void *space, uint32_t len,
|
|
io_callback_t callback);
|
|
|
|
word_t map_read(paddr_t addr, int len, IOMap *map);
|
|
void map_write(paddr_t addr, int len, word_t data, IOMap *map);
|
|
|
|
#endif
|