Пример #1
0
        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();
        }
Пример #2
0
        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;
        }
Пример #3
0
        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);
        }