/* This file is part of jpcsp. Jpcsp is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Jpcsp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Jpcsp. If not, see <http://www.gnu.org/licenses/>. */ package jpcsp.HLE.modules; import java.util.HashMap; import jpcsp.Memory; import jpcsp.Allegrex.compiler.RuntimeContext; import jpcsp.HLE.BufferInfo; import jpcsp.HLE.BufferInfo.LengthInfo; import jpcsp.HLE.BufferInfo.Usage; import jpcsp.HLE.CanBeNull; import jpcsp.HLE.CheckArgument; import jpcsp.HLE.HLEFunction; import jpcsp.HLE.HLEModule; import jpcsp.HLE.HLEUnimplemented; import jpcsp.HLE.PspString; import jpcsp.HLE.SceKernelErrorException; import jpcsp.HLE.TPointer; import jpcsp.HLE.TPointer32; import jpcsp.HLE.Modules; import jpcsp.HLE.TPointer8; import jpcsp.HLE.kernel.types.SceKernelErrors; import jpcsp.HLE.kernel.types.SceNetIfHandle; import jpcsp.HLE.kernel.types.SceNetIfHandle.SceNetIfHandleInternal; import jpcsp.HLE.kernel.types.SceNetIfMessage; import jpcsp.HLE.kernel.types.pspNetMacAddress; import jpcsp.HLE.modules.SysMemUserForUser.SysMemInfo; import org.apache.log4j.Logger; public class sceNetIfhandle extends HLEModule { public static Logger log = Modules.getLogger("sceNetIfhandle"); protected HashMap<Integer, SysMemInfo> allocatedMemory; protected int unknownCallback1; protected int unknownCallback2; protected int unknownCallback3; protected boolean callbacksDefined; protected TPointer[] handles; protected int unknownValue1; protected int unknownValue2; protected int unknownValue3; protected int unknownValue4; @Override public void start() { allocatedMemory = new HashMap<Integer, SysMemUserForUser.SysMemInfo>(); unknownCallback1 = 0; unknownCallback2 = 0; unknownCallback3 = 0; callbacksDefined = false; handles = new TPointer[8]; for (int i = 0; i < handles.length; i++) { handles[i] = TPointer.NULL; } super.start(); } public TPointer checkHandleAddr(TPointer handleAddr) { for (int i = 0; i < handles.length; i++) { if (handles[i].getAddress() == handleAddr.getAddress()) { return handleAddr; } } throw new SceKernelErrorException(SceKernelErrors.ERROR_NOT_FOUND); } public TPointer checkHandleInternalAddr(TPointer handleInternalAddr) { for (int i = 0; i < handles.length; i++) { if (handles[i].getValue32() == handleInternalAddr.getAddress()) { return handleInternalAddr; } } throw new SceKernelErrorException(SceKernelErrors.ERROR_NOT_FOUND); } protected int hleNetCreateIfhandleEther(TPointer handleAddr) { int handleIndex = -1; for (int i = 0; i < handles.length; i++) { if (handles[i].isNull()) { handleIndex = i; break; } } if (handleIndex < 0) { return SceKernelErrors.ERROR_OUT_OF_MEMORY; } SceNetIfHandleInternal handleInternal = new SceNetIfHandleInternal(); int allocatedMem = sceNetMallocInternal(handleInternal.sizeof()); if (allocatedMem < 0) { return SceKernelErrors.ERROR_OUT_OF_MEMORY; } handleAddr.setValue32(0, allocatedMem); handles[handleIndex] = handleAddr; handleInternal.write(new TPointer(Memory.getInstance(), allocatedMem)); RuntimeContext.debugMemory(allocatedMem, handleInternal.sizeof()); return 0; } protected int hleNetAttachIfhandleEther(TPointer handleAddr, pspNetMacAddress macAddress, String interfaceName) { SceNetIfHandle handle = new SceNetIfHandle(); handle.read(handleAddr); handle.handleInternal.macAddress = macAddress; handle.handleInternal.interfaceName = interfaceName; handle.addrFirstMessageToBeSent = 0; handle.addrLastMessageToBeSent = 0; handle.numberOfMessagesToBeSent = 0; handle.unknown36 = 0; handle.unknown40 = 0; handle.write(handleAddr); return 0; } @HLEFunction(nid = 0xC80181A2, version = 150, checkInsideInterrupt = true) public int sceNetGetDropRate(@CanBeNull TPointer32 dropRateAddr, @CanBeNull TPointer32 dropDurationAddr) { return Modules.sceWlanModule.sceWlanGetDropRate(dropRateAddr, dropDurationAddr); } @HLEFunction(nid = 0xFD8585E1, version = 150, checkInsideInterrupt = true) public int sceNetSetDropRate(int dropRate, int dropDuration) { return Modules.sceWlanModule.sceWlanSetDropRate(dropRate, dropDuration); } @HLEFunction(nid = 0x15CFE3C0, version = 150) public int sceNetMallocInternal(int size) { SysMemInfo info = Modules.SysMemUserForUserModule.malloc(SysMemUserForUser.USER_PARTITION_ID, "sceNetMallocInternal", SysMemUserForUser.PSP_SMEM_Low, size, 0); if (info == null) { return 0; } allocatedMemory.put(info.addr, info); return info.addr; } @HLEFunction(nid = 0x76BAD213, version = 150) public int sceNetFreeInternal(int memory) { SysMemInfo info = allocatedMemory.remove(memory); if (info != null) { Modules.SysMemUserForUserModule.free(info); } return 0; } @HLEUnimplemented @HLEFunction(nid = 0x0542835F, version = 150) public int sceNetIfhandle_driver_0542835F(int unknownCallback1, int unknownCallback2, int unknownCallback3) { this.unknownCallback1 = unknownCallback1; this.unknownCallback2 = unknownCallback2; this.unknownCallback3 = unknownCallback3; callbacksDefined = true; return 0; } @HLEUnimplemented @HLEFunction(nid = 0x773FC77C, version = 150) public int sceNetIfhandle_driver_773FC77C() { // Has no parameters unknownCallback1 = 0; unknownCallback2 = 0; unknownCallback3 = 0; callbacksDefined = false; return 0; } @HLEUnimplemented @HLEFunction(nid = 0x9CBA24D4, version = 150) public int sceNetIfhandle_driver_9CBA24D4(PspString interfaceName) { int handleAddr = 0; for (int i = 0; i < handles.length; i++) { if (handles[i].isNotNull()) { SceNetIfHandle handle = new SceNetIfHandle(); handle.read(handles[i]); if (interfaceName.equals(handle.handleInternal.interfaceName)) { handleAddr = handles[i].getAddress(); break; } } } return handleAddr; } @HLEUnimplemented @HLEFunction(nid = 0xC5623112, version = 150) public int sceNetIfhandle_driver_C5623112(@CheckArgument(value="checkHandleAddr") @BufferInfo(lengthInfo=LengthInfo.fixedLength, length=44, usage=Usage.in) TPointer handleAddr, @BufferInfo(lengthInfo=LengthInfo.fixedLength, length=6, usage=Usage.out) TPointer8 macAddress) { SceNetIfHandle handle = new SceNetIfHandle(); handle.read(handleAddr); handle.handleInternal.macAddress.write(macAddress); return 0; } @HLEUnimplemented @HLEFunction(nid = 0x16042084, version = 150) public int sceNetCreateIfhandleEther(@BufferInfo(lengthInfo=LengthInfo.fixedLength, length=44, usage=Usage.out) TPointer handleAddr) { return hleNetCreateIfhandleEther(handleAddr); } @HLEUnimplemented @HLEFunction(nid = 0xAE81C0CB, version = 150) public int sceNetAttachIfhandleEther(@CheckArgument("checkHandleAddr") TPointer handleAddr, @BufferInfo(lengthInfo=LengthInfo.fixedLength, length=6, usage=Usage.in) TPointer8 macAddress, PspString interfaceName) { pspNetMacAddress netMacAddress = new pspNetMacAddress(); netMacAddress.read(macAddress); return hleNetAttachIfhandleEther(handleAddr, netMacAddress, interfaceName.getString()); } @HLEUnimplemented @HLEFunction(nid = 0x07505747, version = 150) public int sceNetIfhandle_07505747(int unknown) { return 0; // Current thread delay in ms (used only for some gameIds) } @HLEUnimplemented @HLEFunction(nid = 0x0B258B5E, version = 150) public int sceNetIfhandle_0B258B5E() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x0C391E9F, version = 150) public int sceNetIfhandle_0C391E9F(int partitionId, int memorySize) { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x0FB8AE0D, version = 150) public void sceNetIfhandle_0FB8AE0D() { // Has no parameters unknownValue1 = 0; unknownValue2 = 0; unknownValue3 = 0; unknownValue4 = 0; } @HLEUnimplemented @HLEFunction(nid = 0x29ED84C5, version = 150) public int sceNetIfhandle_29ED84C5() { // Has no parameters return 0; } @HLEUnimplemented @HLEFunction(nid = 0x35FAB6A2, version = 150) public void sceNetIfhandle_35FAB6A2() { // Has no parameters } @HLEUnimplemented @HLEFunction(nid = 0x5FB31C72, version = 150) public int sceNetIfhandle_5FB31C72(@CanBeNull @BufferInfo(usage=Usage.out) TPointer32 unknownValue1Addr, @CanBeNull @BufferInfo(usage=Usage.out) TPointer32 unknownValue2Addr, @CanBeNull @BufferInfo(usage=Usage.out) TPointer32 unknownValue3Addr, @CanBeNull @BufferInfo(usage=Usage.out) TPointer32 unknownValue4Addr) { unknownValue1Addr.setValue(unknownValue1); unknownValue2Addr.setValue(unknownValue2); unknownValue3Addr.setValue(unknownValue3); unknownValue4Addr.setValue(unknownValue4); return 0; } @HLEUnimplemented @HLEFunction(nid = 0x62B20015, version = 150) public int sceNetIfhandle_62B20015(int unknownValue1, int unknownValue2, int unknownValue3, int unknownValue4) { this.unknownValue1 = unknownValue1; this.unknownValue2 = unknownValue2; this.unknownValue3 = unknownValue3; this.unknownValue4 = unknownValue4; return 0; } @HLEUnimplemented @HLEFunction(nid = 0x955F2924, version = 150) public int sceNetIfhandle_955F2924() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xE9BF5332, version = 150) public int sceNetIfhandle_E9BF5332() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x0296C7D6, version = 150) public void sceNetIfhandleIfIoctl(@CanBeNull @CheckArgument("checkHandleInternalAddr") @BufferInfo(lengthInfo=LengthInfo.fixedLength, length=320, usage=Usage.inout) TPointer handleInternalAddr, int cmd, @CanBeNull @BufferInfo(lengthInfo=LengthInfo.fixedLength, length=32, usage=Usage.in) TPointer unknown) { if (log.isDebugEnabled()) { String interfaceName = unknown.getStringNZ(16); int flags = unknown.getValue16(16); log.debug(String.format("sceNetIfhandleIfIoctl interfaceName='%s' flags=0x%X", interfaceName, flags)); } } @HLEUnimplemented @HLEFunction(nid = 0x1560F143, version = 150) public int sceNetMCopyback() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x16246B99, version = 150) public int sceNetIfPrepend() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x2162EE67, version = 150) public int sceNetIfhandlePollSema() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x263767F6, version = 150) public int sceNetFlagIfEvent(@CanBeNull TPointer handleAddr, int unknown1, int unknown2) { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x30602CE9, version = 150) public int sceNetIfhandleSignalSema() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x30F69334, version = 150) public int sceNetIfhandleInit(int eventFlagId) { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x3E8DD3F8, version = 150) public int sceNetMCat() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x456E3146, version = 150) public int sceNetMCopym() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x49EDBB18, version = 150) public int sceNetMPullup() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x4C2886CB, version = 150) public int sceNetGetMallocStatInternal() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x4CF15C43, version = 150) public int sceNetMGethdr() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x4FB43BCE, version = 150) public int sceNetIfhandleGetDetachEther() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x54D1AEA1, version = 150) public int sceNetDetachIfhandleEther() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x59F0D619, version = 150) public int sceNetMGetclr() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x6AB53C27, version = 150) public int sceNetMDup() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x8FCB05A1, version = 150) public int sceNetIfhandleIfUp(@CheckArgument("checkHandleInternalAddr") @BufferInfo(lengthInfo=LengthInfo.fixedLength, length=320, usage=Usage.inout) TPointer handleInternalAddr) { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x9A6261EC, version = 150) public int sceNetMCopydata(@BufferInfo(lengthInfo=LengthInfo.fixedLength, length=76, usage=Usage.in) TPointer messageAddr, int dataOffset, int length, @CanBeNull @BufferInfo(lengthInfo=LengthInfo.previousParameter, usage=Usage.out) TPointer destinationAddr) { if (destinationAddr.isNotNull()) { SceNetIfMessage message = new SceNetIfMessage(); while (messageAddr.isNotNull()) { message.read(messageAddr); if (dataOffset < message.dataLength) { break; } dataOffset -= message.dataLength; messageAddr.setAddress(message.nextDataAddr); } while (length > 0 && messageAddr.isNotNull()) { message.read(messageAddr); int copyLength = Math.min(length, message.dataLength - dataOffset); destinationAddr.memcpy(message.dataAddr + dataOffset, copyLength); length -= copyLength; destinationAddr.add(copyLength); dataOffset = 0; } } return 0; } @HLEUnimplemented @HLEFunction(nid = 0xA493AA5F, version = 150) public int sceNetMGet(int unknown1, int unknown2) { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xB1F5BB87, version = 150) public void sceNetIfhandleIfStart(@CanBeNull TPointer handleInternalAddr, @CanBeNull SceNetIfMessage messageToBeSent) { } @HLEUnimplemented @HLEFunction(nid = 0xB8188F96, version = 150) public int sceNetIfhandleGetAttachEther(@BufferInfo(usage=Usage.out) TPointer32 handleInternalAddrAddr, @BufferInfo(usage=Usage.out) TPointer32 unknown) { // returns the address of handleInternal into handleInternalAddrAddr return 0; } @HLEUnimplemented @HLEFunction(nid = 0xB9096E48, version = 150) public int sceNetIfhandleTerm() { // Has no parameters return 0; } @HLEUnimplemented @HLEFunction(nid = 0xBFF3CEA5, version = 150) public void sceNetMAdj(@CanBeNull TPointer messageAddr, int sizeAdj) { if (messageAddr.isNull()) { return; } SceNetIfMessage message = new SceNetIfMessage(); if (sizeAdj < 0) { sizeAdj = -sizeAdj; int totalSize = 0; int currentMessageAddr = messageAddr.getAddress(); do { message.read(messageAddr.getMemory(), currentMessageAddr); totalSize += message.dataLength; currentMessageAddr = message.nextDataAddr; } while (currentMessageAddr != 0); if (message.dataLength < sizeAdj) { totalSize -= sizeAdj; message.read(messageAddr); totalSize = Math.max(totalSize - sizeAdj, 0); if ((message.unknown18 & 2) != 0) { message.unknown24 = totalSize; message.write(messageAddr); } currentMessageAddr = messageAddr.getAddress(); while (currentMessageAddr != 0) { message.read(messageAddr.getMemory(), currentMessageAddr); if (message.dataLength < totalSize) { currentMessageAddr = message.nextDataAddr; totalSize -= message.dataLength; } else { message.dataLength = totalSize; message.write(messageAddr.getMemory(), currentMessageAddr); break; } } currentMessageAddr = message.nextDataAddr; while (currentMessageAddr != 0) { message.read(messageAddr.getMemory(), currentMessageAddr); message.dataLength = 0; message.write(messageAddr.getMemory(), currentMessageAddr); currentMessageAddr = message.nextDataAddr; } } else { message.read(messageAddr); if ((message.unknown18 & 2) != 0) { message.unknown24 -= sizeAdj; message.write(messageAddr); } } } else { int totalSizeAdj = sizeAdj; int currentMessageAddr = messageAddr.getAddress(); do { message.read(messageAddr.getMemory(), currentMessageAddr); if (sizeAdj < message.dataLength) { message.dataLength -= sizeAdj; message.dataAddr += sizeAdj; message.write(messageAddr); sizeAdj = 0; } else { sizeAdj -= message.dataLength; message.dataLength = 0; message.write(messageAddr); currentMessageAddr = message.nextDataAddr; } } while (messageAddr.isNotNull() && sizeAdj > 0); message.read(messageAddr); if ((message.unknown18 & 2) != 0) { message.unknown24 -= totalSizeAdj - sizeAdj; message.write(messageAddr); } } } @HLEUnimplemented @HLEFunction(nid = 0xC28F6FF2, version = 150) public int sceNetIfEnqueue() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xC3325FDC, version = 150) public int sceNetMPrepend() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xC6D14282, version = 150) public int sceNetIfhandle_driver_C6D14282(TPointer handleAddr, int callbackArg4) { SceNetIfHandle handle = new SceNetIfHandle(); handle.read(handleAddr); handle.callbackArg4 = callbackArg4; handle.write(handleAddr); return 0; } @HLEUnimplemented @HLEFunction(nid = 0xC9344A59, version = 150) public int sceNetDestroyIfhandleEther() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xD5AD6DEA, version = 150) public int sceNetIfhandle_driver_D5AD6DEA(@CanBeNull TPointer handleAddr) { if (handleAddr.isNull()) { return 0; } SceNetIfHandle handle = new SceNetIfHandle(); handle.read(handleAddr); return handle.callbackArg4; } @HLEUnimplemented @HLEFunction(nid = 0xD5DA7B3C, version = 150) public int sceNetIfhandleWaitSema() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xE2F4F1C9, version = 150) public int sceNetIfDequeue() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xE440A7D8, version = 150) public int sceNetIfhandleIfDequeue() { // Has no parameters return 0; } @HLEUnimplemented @HLEFunction(nid = 0xE80F00A4, version = 150) public int sceNetMPulldown() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xEAD3A759, version = 150) public int sceNetIfhandleIfDown() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xF56FAC82, version = 150) public int sceNetMFreem(@CanBeNull TPointer messageAddr) { SceNetIfMessage message = new SceNetIfMessage(); while (messageAddr.isNotNull()) { message.read(messageAddr); int nextMessage = message.nextDataAddr; sceNetFreeInternal(messageAddr.getAddress()); messageAddr = new TPointer(messageAddr.getMemory(), nextMessage); } return 0; } @HLEUnimplemented @HLEFunction(nid = 0xF8825DC4, version = 150) public int sceNetMFree() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xF94BAF52, version = 150) public int sceNetSendIfEvent(TPointer handleAddr) { return 0; } @HLEUnimplemented @HLEFunction(nid = 0x9173FD47, version = 150) public int sceNetIfhandle_9173FD47() { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xB40A882F, version = 150) public int sceNetIfhandle_B40A882F() { return 0; } }