Skip to content
Snippets Groups Projects
Verified Commit d2b63e1e authored by Recolic Keghart's avatar Recolic Keghart
Browse files

fix problems about IO

parent 74b2508f
No related branches found
No related tags found
No related merge requests found
Pipeline #796 passed with stages
in 3 minutes and 21 seconds
......@@ -11,7 +11,7 @@
#endif
/* You will define this macro in PA2 */
//#define HAS_IOE
#define HAS_IOE
#include <stdint.h>
#include <assert.h>
......
......@@ -7,4 +7,10 @@ typedef void(*pio_callback_t)(ioaddr_t, int, bool);
void* add_pio_map(ioaddr_t, int, pio_callback_t);
template <size_t Bytes>
uint32_t pio_read_common(ioaddr_t addr);
template <size_t Bytes>
void pio_write_common(ioaddr_t addr, uint32_t data);
#endif
......@@ -66,7 +66,7 @@ namespace EHelperImpl {
make_EHelper(call_rm) {
RLIB_MACRO_DEBUG_ASSERT(decoding.is_operand_size_16 == false);
rlib::println("Reach call_rm. WARNING: this instruction impl is heavily broken.");
// rlib::println("Reach call_rm. WARNING: this instruction impl is heavily broken.");
rtl_push<4>(&decoding.seq_eip);
rtl_jr(&id_dest->val);
......
#include "cpu/exec.h"
#include "device/port-io.h"
void difftest_skip_ref();
void difftest_skip_dut();
......@@ -43,7 +44,14 @@ namespace EHelperImpl {
}
make_EHelper(in) {
TODO();
rtlreg_t tmp;
switch(id_src->width)
{
case 1: tmp = pio_read_common<1>(id_src->val); break;
case 2: tmp = pio_read_common<2>(id_src->val); break;
case 4: tmp = pio_read_common<4>(id_src->val); break;
}
operand_write(id_dest, &tmp);
print_asm_template2(in);
......@@ -53,8 +61,13 @@ namespace EHelperImpl {
}
make_EHelper(out) {
TODO();
switch(id_src->width)
{
case 1: pio_write_common<1>(id_dest->val, id_src->val); break;
case 2: pio_write_common<2>(id_dest->val, id_src->val); break;
case 4: pio_write_common<4>(id_dest->val, id_src->val); break;
}
print_asm_template2(out);
#if defined(DIFF_TEST)
......
......@@ -39,49 +39,30 @@ void* add_pio_map(ioaddr_t addr, int len, pio_callback_t callback) {
return pio_space + addr;
}
static inline uint32_t pio_read_common(ioaddr_t addr, int len) {
assert(addr + len - 1 < PORT_IO_SPACE_MAX);
pio_callback(addr, len, false); // prepare data to read
switch (len) {
case 4: return *(uint32_t *)(pio_space + addr);
case 2: return *(uint16_t *)(pio_space + addr);
case 1: return *(uint8_t *)(pio_space + addr);
default: assert(0);
}
}
static inline void pio_write_common(ioaddr_t addr, uint32_t data, int len) {
assert(addr + len - 1 < PORT_IO_SPACE_MAX);
switch (len) {
case 4: *(uint32_t *)(pio_space + addr) = data; break;
case 2: *(uint16_t *)(pio_space + addr) = data; break;
case 1: *(uint8_t *)(pio_space + addr) = data; break;
default: assert(0);
}
pio_callback(addr, len, true);
}
template <size_t Bytes>
uint32_t pio_read_common(ioaddr_t addr) {
static_assert(Bytes == 4 || Bytes == 2 || Bytes == 1);
using result_type = std::conditional_t<Bytes == 4, uint32_t, std::conditional_t<Bytes == 2, uint16_t, uint8_t>>;
/* CPU interface */
uint32_t pio_read_l(ioaddr_t addr) {
return pio_read_common(addr, 4);
assert(addr + Bytes - 1 < PORT_IO_SPACE_MAX);
pio_callback(addr, Bytes, false); // prepare data to read
return *(result_type *)(pio_space + addr);
}
uint32_t pio_read_w(ioaddr_t addr) {
return pio_read_common(addr, 2);
}
template <size_t Bytes>
void pio_write_common(ioaddr_t addr, uint32_t data) {
static_assert(Bytes == 4 || Bytes == 2 || Bytes == 1);
using result_type = std::conditional_t<Bytes == 4, uint32_t, std::conditional_t<Bytes == 2, uint16_t, uint8_t>>;
uint32_t pio_read_b(ioaddr_t addr) {
return pio_read_common(addr, 1);
assert(addr + Bytes - 1 < PORT_IO_SPACE_MAX);
*(result_type *)(pio_space + addr) = data;
pio_callback(addr, Bytes, true);
}
void pio_write_l(ioaddr_t addr, uint32_t data) {
pio_write_common(addr, data, 4);
}
void pio_write_w(ioaddr_t addr, uint32_t data) {
pio_write_common(addr, data, 2);
}
void pio_write_b(ioaddr_t addr, uint32_t data) {
pio_write_common(addr, data, 1);
}
template uint32_t pio_read_common<4>(ioaddr_t addr);
template uint32_t pio_read_common<2>(ioaddr_t addr);
template uint32_t pio_read_common<1>(ioaddr_t addr);
template void pio_write_common<4>(ioaddr_t addr, uint32_t data);
template void pio_write_common<2>(ioaddr_t addr, uint32_t data);
template void pio_write_common<1>(ioaddr_t addr, uint32_t data);
......@@ -7,8 +7,7 @@
#include <SDL2/SDL.h>
#define VMEM 0x40000
#define SCREEN_PORT 0x100 // Note that this is not the standard
#define SCREEN_PORT 0x100
#define SCREEN_H 300
#define SCREEN_W 400
......@@ -33,8 +32,8 @@ void init_vga() {
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STATIC, SCREEN_W, SCREEN_H);
screensize_port_base = add_pio_map(SCREEN_PORT, 4, NULL);
screensize_port_base = reinterpret_cast<decltype(screensize_port_base)>(add_pio_map(SCREEN_PORT, 4, nullptr));
*screensize_port_base = ((SCREEN_W) << 16) | (SCREEN_H);
vmem = add_mmio_map(VMEM, 0x80000, NULL);
vmem = reinterpret_cast<decltype(vmem)>(add_mmio_map(VMEM, 0x80000, nullptr));
}
#endif /* HAS_IOE */
......@@ -3,11 +3,15 @@
#include <amdev.h>
size_t timer_read(uintptr_t reg, void *buf, size_t size) {
const size_t rtc_port_id = 0x48;
uint64_t curr_time;
switch (reg) {
case _DEVREG_TIMER_UPTIME: {
_UptimeReg *uptime = (_UptimeReg *)buf;
uptime->hi = 0;
uptime->lo = 0;
curr_time = inl(rtc_port_id);
uptime->hi = curr_time >> 32;
uptime->lo = (uint32_t) curr_time;
return sizeof(_UptimeReg);
}
case _DEVREG_TIMER_DATE: {
......
......@@ -35,6 +35,8 @@
#include "printf.h"
#include "am.h"
void _putchar(char c) {_putc(c);}
// define this globally (e.g. gcc -DPRINTF_INCLUDE_CONFIG_H ...) to include the
// printf_config.h header file
......
......@@ -30,8 +30,5 @@ int vsprintf_(char *out, const char *fmt, va_list va) {
// return 0;
//}
void _putchar(char character) {
;
}
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment