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 @@ ...@@ -11,7 +11,7 @@
#endif #endif
/* You will define this macro in PA2 */ /* You will define this macro in PA2 */
//#define HAS_IOE #define HAS_IOE
#include <stdint.h> #include <stdint.h>
#include <assert.h> #include <assert.h>
......
...@@ -7,4 +7,10 @@ typedef void(*pio_callback_t)(ioaddr_t, int, bool); ...@@ -7,4 +7,10 @@ typedef void(*pio_callback_t)(ioaddr_t, int, bool);
void* add_pio_map(ioaddr_t, int, pio_callback_t); 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 #endif
...@@ -66,7 +66,7 @@ namespace EHelperImpl { ...@@ -66,7 +66,7 @@ namespace EHelperImpl {
make_EHelper(call_rm) { make_EHelper(call_rm) {
RLIB_MACRO_DEBUG_ASSERT(decoding.is_operand_size_16 == false); 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_push<4>(&decoding.seq_eip);
rtl_jr(&id_dest->val); rtl_jr(&id_dest->val);
......
#include "cpu/exec.h" #include "cpu/exec.h"
#include "device/port-io.h"
void difftest_skip_ref(); void difftest_skip_ref();
void difftest_skip_dut(); void difftest_skip_dut();
...@@ -43,7 +44,14 @@ namespace EHelperImpl { ...@@ -43,7 +44,14 @@ namespace EHelperImpl {
} }
make_EHelper(in) { 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); print_asm_template2(in);
...@@ -53,8 +61,13 @@ namespace EHelperImpl { ...@@ -53,8 +61,13 @@ namespace EHelperImpl {
} }
make_EHelper(out) { 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); print_asm_template2(out);
#if defined(DIFF_TEST) #if defined(DIFF_TEST)
......
...@@ -39,49 +39,30 @@ void* add_pio_map(ioaddr_t addr, int len, pio_callback_t callback) { ...@@ -39,49 +39,30 @@ void* add_pio_map(ioaddr_t addr, int len, pio_callback_t callback) {
return pio_space + addr; return pio_space + addr;
} }
static inline uint32_t pio_read_common(ioaddr_t addr, int len) { template <size_t Bytes>
assert(addr + len - 1 < PORT_IO_SPACE_MAX); uint32_t pio_read_common(ioaddr_t addr) {
pio_callback(addr, len, false); // prepare data to read static_assert(Bytes == 4 || Bytes == 2 || Bytes == 1);
switch (len) { using result_type = std::conditional_t<Bytes == 4, uint32_t, std::conditional_t<Bytes == 2, uint16_t, uint8_t>>;
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);
}
/* CPU interface */ assert(addr + Bytes - 1 < PORT_IO_SPACE_MAX);
uint32_t pio_read_l(ioaddr_t addr) { pio_callback(addr, Bytes, false); // prepare data to read
return pio_read_common(addr, 4); return *(result_type *)(pio_space + addr);
} }
uint32_t pio_read_w(ioaddr_t addr) { template <size_t Bytes>
return pio_read_common(addr, 2); 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) { assert(addr + Bytes - 1 < PORT_IO_SPACE_MAX);
return pio_read_common(addr, 1); *(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) { template uint32_t pio_read_common<4>(ioaddr_t addr);
pio_write_common(addr, data, 2); 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);
void pio_write_b(ioaddr_t addr, uint32_t data) { template void pio_write_common<2>(ioaddr_t addr, uint32_t data);
pio_write_common(addr, data, 1); template void pio_write_common<1>(ioaddr_t addr, uint32_t data);
}
...@@ -7,8 +7,7 @@ ...@@ -7,8 +7,7 @@
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#define VMEM 0x40000 #define VMEM 0x40000
#define SCREEN_PORT 0x100
#define SCREEN_PORT 0x100 // Note that this is not the standard
#define SCREEN_H 300 #define SCREEN_H 300
#define SCREEN_W 400 #define SCREEN_W 400
...@@ -33,8 +32,8 @@ void init_vga() { ...@@ -33,8 +32,8 @@ void init_vga() {
texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STATIC, SCREEN_W, SCREEN_H); 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); *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 */ #endif /* HAS_IOE */
...@@ -3,11 +3,15 @@ ...@@ -3,11 +3,15 @@
#include <amdev.h> #include <amdev.h>
size_t timer_read(uintptr_t reg, void *buf, size_t size) { 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) { switch (reg) {
case _DEVREG_TIMER_UPTIME: { case _DEVREG_TIMER_UPTIME: {
_UptimeReg *uptime = (_UptimeReg *)buf; _UptimeReg *uptime = (_UptimeReg *)buf;
uptime->hi = 0; curr_time = inl(rtc_port_id);
uptime->lo = 0; uptime->hi = curr_time >> 32;
uptime->lo = (uint32_t) curr_time;
return sizeof(_UptimeReg); return sizeof(_UptimeReg);
} }
case _DEVREG_TIMER_DATE: { case _DEVREG_TIMER_DATE: {
......
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
#include "printf.h" #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 // define this globally (e.g. gcc -DPRINTF_INCLUDE_CONFIG_H ...) to include the
// printf_config.h header file // printf_config.h header file
......
...@@ -30,8 +30,5 @@ int vsprintf_(char *out, const char *fmt, va_list va) { ...@@ -30,8 +30,5 @@ int vsprintf_(char *out, const char *fmt, va_list va) {
// return 0; // return 0;
//} //}
void _putchar(char character) {
;
}
#endif #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