|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2018 [email protected]
4: //
5:
6: #include "zram.h"
7:
8: //
9: // 3ポート共有 RAM
10: //
11: // ZRAM はロングワード単位でホストバイトオーダ配置なので、
12: // バイトアクセス、ワードアクセス時は HLB(), HLW() マクロ使用のこと。
13: //
14:
15: ZRAMDevice *gZRAM;
16:
17: ZRAMDevice::ZRAMDevice()
18: {
19: logname = "zram";
20: devname = "ZRAM";
21: devaddr = 0x71000000;
22: devlen = 128 * 1024;
23:
24: ram = new uint8[devlen];
25: }
26:
27: ZRAMDevice::~ZRAMDevice()
28: {
29: }
30:
31: // たぶん 128KB で折り返しイメージが見えるはず。要確認。
32:
33: uint64
34: ZRAMDevice::Read8(uint32 addr)
35: {
36: std::unique_lock<std::mutex> lock(mtx);
37:
38: uint32 an = addr % devlen;
39: uint32 data = ram[HLB(an)];
40: return data;
41: }
42:
43: uint64
44: ZRAMDevice::Read16(uint32 addr)
45: {
46: std::unique_lock<std::mutex> lock(mtx);
47:
48: uint32 an = addr % devlen;
49: uint32 data = *(uint16 *)&ram[HLW(an)];
50: return data;
51: }
52:
53: uint64
54: ZRAMDevice::Read32(uint32 addr)
55: {
56: std::unique_lock<std::mutex> lock(mtx);
57:
58: uint32 an = addr % devlen;
59: uint32 data = *(uint32 *)&ram[an];
60: return data;
61: }
62:
63: uint64
64: ZRAMDevice::Write8(uint32 addr, uint32 data)
65: {
66: std::unique_lock<std::mutex> lock(mtx);
67:
68: uint32 an = addr % devlen;
69: ram[HLB(an)] = data;
70: return 0;
71: }
72:
73: uint64
74: ZRAMDevice::Write16(uint32 addr, uint32 data)
75: {
76: std::unique_lock<std::mutex> lock(mtx);
77:
78: uint32 an = addr % devlen;
79: *(uint16 *)&ram[HLW(an)] = data;
80: return 0;
81: }
82:
83: uint64
84: ZRAMDevice::Write32(uint32 addr, uint32 data)
85: {
86: std::unique_lock<std::mutex> lock(mtx);
87:
88: uint32 an = addr % devlen;
89: *(uint32 *)&ram[an] = data;
90: return 0;
91: }
92:
93: uint64
94: ZRAMDevice::Peek8(uint32 addr)
95: {
96: std::unique_lock<std::mutex> lock(mtx);
97:
98: uint32 an = addr % devlen;
99: return ram[HLB(an)];
100: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.