public static void Initialize(ref Arch.BootParam param) { BootParam = param; PageAllocator = new FreeListPageAllocator(); PageAllocator.Initialize(param.MainMemoryStart, param.MainMemorySize >> Arch.ArchDefinition.PageShift); CompletionQueueAllocator = new FreeListPageAllocator(); CompletionQueueAllocator.Initialize(param.CompletionQueueBase, param.CompletionQueueSize >> Arch.ArchDefinition.PageShift); Threads = ThreadList.CreateSentinal(); FutexLists = FutexCompletionEntry.CreateSentinal(); TimeoutQueue = new TimerQueue(); SecurityManager = new SecurityManager(); LinuxMemoryAllocator = new LinuxMemoryAllocator(); CapabilityManager = new CapabilityManager(); CompletionQueue = new CompletionQueue(); SecureFS.Initialize(Util.StringToByteArray("ExpressOS-security", false)); ReadBufferUnmarshaler.Initialize(); }
internal static void HandleOpenFileCompletion(OpenFileCompletion c, int linux_fd, int size) { var current = c.thr; var proc = current.Parent; GenericINode inode = null; int ret = linux_fd; if (ret < 0) { c.Dispose(); current.ReturnFromCompletion(ret); return; } switch (c.fileKind) { case GenericINode.INodeKind.ArchINodeKind: inode = new Arch.ArchINode(linux_fd, (uint)size, proc.helperPid); break; case GenericINode.INodeKind.SecureFSINodeKind: inode = SecureFS.HandleOpenFileCompletion(c, linux_fd, size, ref ret); break; default: break; } if (inode != null) { var file = new File(proc, inode, c.flags, c.mode); ret = proc.GetUnusedFd(); proc.InstallFd(ret, file); } c.Dispose(); current.ReturnFromCompletion(ret); return; }
public static int Open(Thread current, ref Arch.ExceptionRegisters regs, UserPtr filenamePtr, int flags, int mode) { // TODO: Deal with current path var filenameBuf = new byte[PATH_MAX]; var ret = filenamePtr.ReadString(current, filenameBuf); var proc = current.Parent; int fd = 0; GenericINode inode = null; var startTime = Arch.NativeMethods.l4api_get_system_clock(); if (Util.ByteStringCompare(filenameBuf, IPCFilename.GetByteString()) == 0) { fd = proc.GetUnusedFd(); inode = BinderINode.Instance; } else if (Util.ByteStringCompare(filenameBuf, AshmemFileName.GetByteString()) == 0) { var linux_fd = Arch.ArchFS.OpenAndReturnLinuxFd(current.Parent.helperPid, new ASCIIString(filenameBuf), flags, mode); if (linux_fd < 0) { return(linux_fd); } inode = new AshmemINode(linux_fd, current.Parent.helperPid); fd = proc.GetUnusedFd(); } else if (SecureFS.IsSecureFS(current, filenameBuf)) { var completion = SecureFS.OpenAndReadPagesAsync(current, filenameBuf, flags, mode); if (completion == null) { return(-ErrorCode.ENOMEM); } Globals.CompletionQueue.Enqueue(completion); current.SaveState(ref regs); current.AsyncReturn = true; return(0); } else { var filename_len = ret; var completion = Arch.ArchFS.OpenAndGetSizeAsync(current, filenameBuf, flags, mode); if (completion == null) { return(-ErrorCode.ENOMEM); } Globals.CompletionQueue.Enqueue(completion); current.SaveState(ref regs); current.AsyncReturn = true; return(0); } if (fd > 0) { var file = new File(proc, inode, flags, mode); proc.InstallFd(fd, file); } if (SyscallProfiler.Enable) { var endTime = Arch.NativeMethods.l4api_get_system_clock(); SyscallProfiler.AccountOpen((int)inode.kind, (long)(endTime - startTime)); } return(fd); }