Fixed some bugs

This commit is contained in:
rkx1209 2018-07-03 19:38:11 +09:00
parent 5752d2fd74
commit 3af589503c
11 changed files with 3835 additions and 3824 deletions

View file

@ -1962,9 +1962,11 @@ static void Handle3SamePair(uint32_t insn, int is_q, bool u, unsigned int opcode
int ebytes = 1 << size;
int elements = (is_q ? 128 : 64) / (8 << size);
for (int e = 0; e < elements; e++) {
unsigned int reg_idx = e < (ebytes / 2) ? rn : rm;
cb->ReadVecElem(GPR_DUMMY, reg_idx, e, size);
cb->ReadVecElem(GPR_DUMMY2, reg_idx, e + 1, size);
unsigned int reg_idx = e < (elements / 2) ? rn : rm;
int base = e < (elements / 2) ? e : (e - elements / 2);
//ns_print("ADDP V[%u][%u] = V[%u][%u] + V[%u][%u]\n", rd, e, reg_idx, 2 * e, reg_idx, 2 * e + 1);
cb->ReadVecElem(GPR_DUMMY, reg_idx, 2 * base, size);
cb->ReadVecElem(GPR_DUMMY2, reg_idx, 2 * base + 1, size);
switch (opcode) {
case 0x17: /* ADDP */
cb->AddReg (GPR_DUMMY, GPR_DUMMY, GPR_DUMMY2, false, true);
@ -1985,8 +1987,13 @@ static void Handle3SamePair(uint32_t insn, int is_q, bool u, unsigned int opcode
UnsupportedOp ("FMINP");
break;
}
cb->WriteVecElem(rd, GPR_DUMMY, e, size);
cb->WriteVecElem(VREG_DUMMY, GPR_DUMMY, e, size);
}
// V[rd] = V[dummy] XXX: More optimize
cb->ReadVecElem(GPR_DUMMY, VREG_DUMMY, 0, 3);
cb->WriteVecElem(rd, GPR_DUMMY, 0, 3);
cb->ReadVecElem(GPR_DUMMY, VREG_DUMMY, 1, 3);
cb->WriteVecElem(rd, GPR_DUMMY, 1, 3);
}
static void DisasSimd3SameLogic(uint32_t insn, DisasCallback *cb) {

View file

@ -1160,28 +1160,16 @@ void IntprCallback::WriteVecElem(unsigned int vd_idx, unsigned int rn_idx, unsig
template<typename T>
static void _CompareTest(T *res, T arg1, T arg2, bool and_test) {
T onflag = ~(T)0;
if (and_test) {
*res = (arg1 & arg2 != 0);
*res = (arg1 & arg2 != 0 ? onflag : 0);
} else {
*res = (arg1 == arg2);
*res = (arg1 == arg2 ? onflag : 0);
}
}
/* Compare Bit wise equal */
void IntprCallback::CompareEqualVec(unsigned int vd_idx, unsigned int vn_idx, unsigned int vm_idx, int index, int size) {
if (size == 0) {
_CompareTest(&VREG(vd_idx).b[index], VREG(vn_idx).b[index], VREG(vm_idx).b[index], true);
} else if (size == 1) {
_CompareTest(&VREG(vd_idx).h[index], VREG(vn_idx).h[index], VREG(vm_idx).h[index], true);
} else if (size == 2) {
_CompareTest(&VREG(vd_idx).s[index], VREG(vn_idx).s[index], VREG(vm_idx).s[index], true);
} else if (size == 3) {
_CompareTest(&VREG(vd_idx).d[index], VREG(vn_idx).d[index], VREG(vm_idx).d[index], true);
}
}
/* Compare Bit wise test bits nonzero */
void IntprCallback::CompareTestBitsVec(unsigned int vd_idx, unsigned int vn_idx, unsigned int vm_idx, int index, int size) {
if (size == 0) {
_CompareTest(&VREG(vd_idx).b[index], VREG(vn_idx).b[index], VREG(vm_idx).b[index], false);
} else if (size == 1) {
@ -1192,3 +1180,16 @@ void IntprCallback::CompareTestBitsVec(unsigned int vd_idx, unsigned int vn_idx,
_CompareTest(&VREG(vd_idx).d[index], VREG(vn_idx).d[index], VREG(vm_idx).d[index], false);
}
}
/* Compare Bit wise test bits nonzero */
void IntprCallback::CompareTestBitsVec(unsigned int vd_idx, unsigned int vn_idx, unsigned int vm_idx, int index, int size) {
if (size == 0) {
_CompareTest(&VREG(vd_idx).b[index], VREG(vn_idx).b[index], VREG(vm_idx).b[index], true);
} else if (size == 1) {
_CompareTest(&VREG(vd_idx).h[index], VREG(vn_idx).h[index], VREG(vm_idx).h[index], true);
} else if (size == 2) {
_CompareTest(&VREG(vd_idx).s[index], VREG(vn_idx).s[index], VREG(vm_idx).s[index], true);
} else if (size == 3) {
_CompareTest(&VREG(vd_idx).d[index], VREG(vn_idx).d[index], VREG(vm_idx).d[index], true);
}
}

View file

@ -102,7 +102,7 @@ def formatParam(param, input, i):
else:
arrspec = ''
return '%s%s %s%s%s' % (type, '&' if not input and (not type.endswith('*') and not arrspec) else '', name, arrspec, ', unsigned int %s_size' % name if hasSize else '')
return '%s%s %s%s%s' % (type, '&' if not input and not arrspec else '', name, arrspec, ', unsigned int %s_size' % name if hasSize else '')
def generatePrototype(func):
return ', '.join([formatParam(x, True, i) for i, x in enumerate(func['inputs'])] + [formatParam(x, False, i + len(func['inputs'])) for i, x in enumerate(func['outputs'])])
@ -141,14 +141,14 @@ def generateCaller(qname, fname, func):
an, sn, bn = tempname(), tempname(), tempname()
yield 'unsigned int %s;' % sn
yield 'auto %s = req->GetBuffer(%s, %i, %s);' % (an, emitInt(rest[1]), cbo, sn)
yield 'auto %s = new uint8_t[%s];' % (bn, sn)
yield 'ARMv8::ReadBytes(%s, %s, %s);' % (an, bn, sn)
params.append('(%s *) %s' % (retype(rest[0]), bn))
yield '%s* %s = (%s *) new uint8_t[%s];' % (retype(rest[0]), bn, retype(rest[0]), sn)
yield 'ARMv8::ReadBytes(%s, (uint8_t *)%s, %s);' % (an, bn, sn)
params.append('%s' % (bn))
params.append(sn)
logFmt.append('%s *%s= buffer<0x%%lx>' % (retype(rest[0]), '%s ' % name if name else ''))
logElems.append(sn)
bufSizes += 1
yield AFTER, 'delete[] %s;' % bn
yield AFTER, 'delete[] (uint8_t *) %s;' % bn
elif type == 'object':
params.append('IPC::GetHandle<%s*>(req->GetMoved(%i))' % (rest[0][0], objOff))
logFmt.append('%s %s= 0x%%x' % (rest[0][0], '%s ' % name if name else ''))
@ -202,12 +202,12 @@ def generateCaller(qname, fname, func):
an, sn, bn = tempname(), tempname(), tempname()
yield 'unsigned int %s;' % sn
yield 'auto %s = req->GetBuffer(%s, %i, %s);' % (an, emitInt(rest[1]), cbo, sn)
yield 'auto %s = new uint8_t[%s];' % (bn, sn)
params.append('(%s *) %s' % (retype(rest[0]), bn))
yield '%s* %s = (%s *) new uint8_t[%s];' % (retype(rest[0]), bn, retype(rest[0]), sn)
params.append('%s' % (bn))
params.append(sn)
bufSizes += 1
yield AFTER, 'ARMv8::WriteBytes(%s, %s, %s);' % (an, bn, sn)
yield AFTER, 'delete[] %s;' % bn
yield AFTER, 'ARMv8::WriteBytes(%s, (uint8_t *) %s, %s);' % (an, bn, sn)
yield AFTER, 'delete[] (uint8_t *)%s;' % bn
elif type == 'object':
tn = tempname()
yield '%s* %s;' % (rest[0][0], tn)

View file

@ -50,11 +50,11 @@ void IpcMessage::GenBuf(unsigned int _move_cnt, unsigned int _copy_cnt, unsigned
copy_cnt = _copy_cnt;
uint32_t *obuf = (uint32_t *) raw_ptr;
obuf[0] = 0;
ns_print("is_domain: %u, move: %u, copy: %u, bytes: %u\n", is_domainobj, move_cnt, copy_cnt, data_bytes);
if(move_cnt != 0 || copy_cnt != 0) {
obuf[1] = ((move_cnt != 0 && !is_domainobj) || copy_cnt != 0) ? (1U << 31) : 0;
obuf[2] = (copy_cnt << 1) | ((is_domainobj ? 0 : move_cnt) << 5);
}
auto pos = 2 + (((move_cnt != 0 && !is_domainobj) || copy_cnt != 0) ? (1 + move_cnt + copy_cnt) : 0);
auto start = pos;
if(pos & 3)

View file

@ -57,7 +57,7 @@ static RAMBlock* FindRamBlock(uint64_t addr, size_t len) {
}
static void AddAnonStraight(uint64_t addr, size_t len, int perm) {
//ns_print("Add anonymous fixed region [0x%lx, %d]\n", addr, len);
ns_print("Add anonymous fixed region [0x%lx, %d]\n", addr, len);
RAMBlock *new_ram = new RAMBlock("[anon]", addr, len, perm) ;
regions.push_back(new_ram);
}
@ -68,7 +68,7 @@ static void AddAnonRamBlock(uint64_t addr, size_t len, int perm) {
ns_abort("Failed to allocate new RAM Block\n");
}
RAMBlock *new_ram = new RAMBlock("[anon]", addr, len, raw, perm);
debug_print("Add anonymous region [0x%lx, %d]\n", new_ram->addr, new_ram->length);
ns_print("Add anonymous region [0x%lx, %d]\n", new_ram->addr, new_ram->length);
regions.push_back(new_ram);
}
@ -118,7 +118,7 @@ std::list<std::tuple<uint64_t,uint64_t, int>> GetRegions() {
temp.push_back(make_tuple(addr, addr + length));
}
temp.sort([](auto a, auto b) { auto [ab, _] = a; auto [bb, __] = b; return ab < bb; });
uint64_t last;
uint64_t last = 0;
for(auto [begin, end] : temp) {
if(last != begin)
ret.push_back(make_tuple(last, begin - 1, -1));

View file

@ -2,7 +2,7 @@
#include "Nsemu.hpp"
#include "IpcStubs.hpp"
uint32_t nn::socket::sf::IClient::Accept(uint32_t socket, int32_t& ret, uint32_t& bsd_errno, uint32_t& sockaddr_len, sockaddr *_addr, unsigned _size) {
uint32_t nn::socket::sf::IClient::Accept(uint32_t socket, int32_t& ret, uint32_t& bsd_errno, uint32_t& sockaddr_len, sockaddr*& _addr, unsigned _size) {
ns_print("nn::socket::sf::IClient::accept\n");
struct sockaddr *addr = (struct sockaddr *) _addr;
socklen_t size = (uint32_t) _size;
@ -37,7 +37,7 @@ uint32_t nn::socket::sf::IClient::Connect(uint32_t socket, sockaddr * _addr, uns
bsd_errno = errno;
return 0;
}
uint32_t nn::socket::sf::IClient::GetSockName(uint32_t socket, int32_t& ret, uint32_t& bsd_errno, uint32_t& sockaddr_len, sockaddr * _addr, unsigned _size) {
uint32_t nn::socket::sf::IClient::GetSockName(uint32_t socket, int32_t& ret, uint32_t& bsd_errno, uint32_t& sockaddr_len, sockaddr*& _addr, unsigned _size) {
ns_print("nn::socket::sf::IClient::getsockname\n");
struct sockaddr *addr = (struct sockaddr *) _addr;
@ -56,7 +56,7 @@ uint32_t nn::socket::sf::IClient::Listen(uint32_t socket, uint32_t backlog, int3
return 0;
}
uint32_t nn::socket::sf::IClient::Recv(uint32_t socket, uint32_t flags, int32_t& ret, uint32_t& bsd_errno, int8_t * buf, unsigned _size) {
uint32_t nn::socket::sf::IClient::Recv(uint32_t socket, uint32_t flags, int32_t& ret, uint32_t& bsd_errno, int8_t*& buf, unsigned _size) {
ns_print("nn::socket::sf::IClient::recv\n");
ret = (int32_t) ::recv(socket, buf, _size, flags);
@ -64,7 +64,7 @@ uint32_t nn::socket::sf::IClient::Recv(uint32_t socket, uint32_t flags, int32_t&
return 0;
}
uint32_t nn::socket::sf::IClient::Send(uint32_t socket, uint32_t flags, int8_t * buf, unsigned _size, int32_t& ret, uint32_t& bsd_errno) {
uint32_t nn::socket::sf::IClient::Send(uint32_t socket, uint32_t flags, int8_t* buf, unsigned _size, int32_t& ret, uint32_t& bsd_errno) {
ns_print("nn::socket::sf::IClient::send\n");
ret = (uint32_t) ::send(socket, buf, (size_t) _size, flags);
@ -72,7 +72,7 @@ uint32_t nn::socket::sf::IClient::Send(uint32_t socket, uint32_t flags, int8_t *
return 0;
}
uint32_t nn::socket::sf::IClient::SendTo(uint32_t socket, uint32_t flags, int8_t * buf, unsigned _size, sockaddr * _addr, unsigned _addr_size, int32_t& ret, uint32_t& bsd_errno) {
uint32_t nn::socket::sf::IClient::SendTo(uint32_t socket, uint32_t flags, int8_t* buf, unsigned _size, sockaddr* _addr, unsigned _addr_size, int32_t& ret, uint32_t& bsd_errno) {
ns_print("nn::socket::sf::IClient::sendto\n");
struct sockaddr *addr = (struct sockaddr *) _addr;
@ -82,7 +82,7 @@ uint32_t nn::socket::sf::IClient::SendTo(uint32_t socket, uint32_t flags, int8_t
return 0;
}
uint32_t nn::socket::sf::IClient::SetSockOpt(uint32_t socket, uint32_t level, uint32_t option_name, uint8_t * optval, unsigned _opt_size, int32_t& ret, uint32_t& bsd_errno) {
uint32_t nn::socket::sf::IClient::SetSockOpt(uint32_t socket, uint32_t level, uint32_t option_name, uint8_t* optval, unsigned _opt_size, int32_t& ret, uint32_t& bsd_errno) {
ns_print("nn::socket::sf::IClient::setsockopt\n");
return 0;
}

View file

@ -2,13 +2,13 @@
#include "Nsemu.hpp"
#include "IpcStubs.hpp"
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenBisPartition(nn::fssrv::sf::Partition partitionID, nn::fssrv::sf::IStorage* BisPartition) {
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenBisPartition(nn::fssrv::sf::Partition partitionID, nn::fssrv::sf::IStorage*& BisPartition) {
ns_print("Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenBisPartition\n");
//BisPartition = buildInterface(nn::fssrv::sf::IStorage, "bis.istorage");
return 0x0;
}
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByApplicationId(nn::ApplicationId tid, nn::fssrv::sf::IStorage* dataStorage) {
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByApplicationId(nn::ApplicationId tid, nn::fssrv::sf::IStorage*& dataStorage) {
ns_print("Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByApplicationId 0x%lx\n", tid);
std::stringstream ss;
ss << "tid_archives_" << hex << tid << ".istorage";
@ -16,13 +16,13 @@ uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByApplicationId(nn::App
return 0;
}
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByCurrentProcess(nn::fssrv::sf::IStorage* dataStorage) {
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByCurrentProcess(nn::fssrv::sf::IStorage*& dataStorage) {
ns_print("Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByCurrentProcess\n");
//dataStorage = buildInterface(nn::fssrv::sf::IStorage, "");
return 0;
}
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByDataId(nn::ApplicationId tid, uint8_t storageId, nn::fssrv::sf::IStorage* dataStorage) {
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByDataId(nn::ApplicationId tid, uint8_t storageId, nn::fssrv::sf::IStorage*& dataStorage) {
ns_print("Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByDataId 0x%lx\n", 0x0100000000000800+(uint64_t)storageId);
std::stringstream ss;
ss << "archives/" << hex << setw(16) << setfill('0') << 0x0100000000000800+(uint64_t)storageId << ".istorage";
@ -30,13 +30,13 @@ uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByDataId(nn::Applicatio
return 0;
}
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenGameCardPartition(nn::fssrv::sf::Partition partitionID, uint32_t _1, nn::fssrv::sf::IStorage* gameCardFs) {
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenGameCardPartition(nn::fssrv::sf::Partition partitionID, uint32_t _1, nn::fssrv::sf::IStorage*& gameCardFs) {
ns_print("Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenGameCardPartition\n");
//gameCardFs = buildInterface(nn::fssrv::sf::IStorage, "GamePartition.istorage");
return 0;
}
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenRomStorage(nn::fssrv::sf::IStorage* _0) {
uint32_t nn::fssrv::sf::IFileSystemProxy::OpenRomStorage(nn::fssrv::sf::IStorage*& _0) {
ns_print("Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenRomStorage\n");
//_0 = buildInterface(nn::fssrv::sf::IStorage, "RomStorage.istorage");
return 0;

View file

@ -5,18 +5,18 @@ uint32_t SmService::Initialize() {
return 0;
}
uint32_t SmService::GetService(ServiceName _name, IpcService *service) {
uint32_t SmService::GetService(ServiceName _name, IpcService*& service) {
std::string name = (char *) _name;
if (IPC::services.find(name) == IPC::services.end()) {
ns_print("Unknown service name %s\n", name.c_str());
return 0xC15; //error code
}
service = IPC::services[name];
ns_print("Found: %s\n", name.c_str());
ns_print("Found: %s => %p\n", name.c_str(), (void *)service);
return 0;
}
uint32_t SmService::RegisterService(ServiceName _name, IpcService *service) {
uint32_t SmService::RegisterService(ServiceName _name, IpcService*& service) {
std::string name = (char *) _name;
IpcService *new_srv = new IpcService();
debug_print("Registering service %s\n", _name);

View file

@ -149,8 +149,9 @@ typedef struct {
std::tuple<uint64_t, uint64_t> QueryMemory(uint64_t meminfo, uint64_t pageinfo, uint64_t addr) {
ns_print("QueryMemory 0x%lx\n", addr);
for(auto [begin, end, perm] : Memory::GetRegions()) {
//ns_print("Region [0x%lx, 0x%lx %d]\n", begin, end, perm);
if (begin <= addr && addr <= end) {
ns_print("found region at 0x%lx, 0x%lx\n", begin, end);
//ns_print("found region at 0x%lx, 0x%lx\n", begin, end);
MemInfo minfo;
minfo.begin = begin;
minfo.size = end - begin + 1;

View file

@ -79,13 +79,15 @@ public:
void SetErrorCode(uint32_t error_code);
void ParseMessage();
void SetMove(int offset, uint32_t handler) {
if (!raw_ptr) {
return;
}
if(is_domainobj)
raw_ptr[(payload_off >> 2) + 4 + offset] = handler;
else
raw_ptr[3 + copy_cnt + offset] = handler;
uint32_t *buf = (uint32_t *) raw_ptr;
if (!raw_ptr) {
return;
}
ns_print("SetMove (0x%x)\n", handler);
if(is_domainobj)
buf[(payload_off >> 2) + 4 + offset] = handler;
else
buf[3 + copy_cnt + offset] = handler;
}
void SetCopy(int offset, uint32_t handler) {
if (!raw_ptr) {

File diff suppressed because it is too large Load diff