Пример #1
0
        public Horizon(Switch Ns)
        {
            this.Ns = Ns;

            IdGen    = new IdPool();
            NvMapIds = new IdPool();

            Handles  = new IdPoolWithObj();
            Fds      = new IdPoolWithObj();
            Displays = new IdPoolWithObj();

            Mutexes  = new ConcurrentDictionary <long, Mutex>();
            CondVars = new ConcurrentDictionary <long, CondVar>();

            Processes = new ConcurrentDictionary <int, Process>();

            Allocator = new AMemoryAlloc();

            HidOffset  = Allocator.Alloc(HidSize);
            FontOffset = Allocator.Alloc(FontSize);

            HidSharedMem = new HSharedMem(HidOffset);

            HidSharedMem.MemoryMapped += HidInit;

            HidHandle = Handles.GenerateId(HidSharedMem);

            FontHandle = Handles.GenerateId(new HSharedMem(FontOffset));
        }
Пример #2
0
        private void SvcUnmapSharedMemory(AThreadState ThreadState)
        {
            int  Handle = (int)ThreadState.X0;
            long Src    = (long)ThreadState.X1;
            long Size   = (long)ThreadState.X2;

            if (!IsValidPosition(Src))
            {
                Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid address {Src:x16}!");

                ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange);

                return;
            }

            HSharedMem SharedMem = Process.HandleTable.GetData <HSharedMem>(Handle);

            if (SharedMem != null)
            {
                Memory.Manager.Unmap(Src, Size, (int)MemoryType.SharedMemory);

                SharedMem.RemoveVirtualPosition(Memory, Src, Size);

                lock (MappedSharedMems)
                {
                    MappedSharedMems.Remove((SharedMem, Src, Size));
                }

                ThreadState.X0 = 0;
            }

            //TODO: Error codes.
        }
Пример #3
0
        public long CreateAppletResource(ServiceCtx Context)
        {
            HSharedMem HidHndData = Context.Ns.Os.Handles.GetData <HSharedMem>(Context.Ns.Os.HidHandle);

            MakeObject(Context, new IAppletResource(HidHndData));

            return(0);
        }
Пример #4
0
        public IAppletResource(HSharedMem Handle)
        {
            m_Commands = new Dictionary <int, ServiceProcessRequest>()
            {
                { 0, GetSharedMemoryHandle }
            };

            this.Handle = Handle;
        }
Пример #5
0
        private void HidInit(object sender, EventArgs e)
        {
            HSharedMem SharedMem = (HSharedMem)sender;

            if (SharedMem.TryGetLastVirtualPosition(out long Position))
            {
                Logging.Info($"HID shared memory successfully mapped to {Position:x16}!");
                Ns.Hid.Init(Position);
            }
        }
Пример #6
0
        public IIrSensorServer(HSharedMem IrSensorSharedMem)
        {
            m_Commands = new Dictionary <int, ServiceProcessRequest>()
            {
                { 302, ActivateIrsensor },
                { 303, DeactivateIrsensor },
                { 304, GetIrsensorSharedMemoryHandle },
                { 311, GetNpadIrCameraHandle }
            };

            this.IrSensorSharedMem = IrSensorSharedMem;
        }
Пример #7
0
        public Horizon(Switch Ns)
        {
            this.Ns = Ns;

            Scheduler = new KProcessScheduler();

            Processes = new ConcurrentDictionary <int, Process>();

            HidSharedMem  = new HSharedMem();
            FontSharedMem = new HSharedMem();

            VsyncEvent = new KEvent();
        }
Пример #8
0
        public Horizon(Switch Ns)
        {
            this.Ns = Ns;

            Mutexes  = new ConcurrentDictionary <long, Mutex>();
            CondVars = new ConcurrentDictionary <long, CondVar>();

            Processes = new ConcurrentDictionary <int, Process>();

            HidSharedMem  = new HSharedMem();
            FontSharedMem = new HSharedMem();

            VsyncEvent = new KEvent();
        }
Пример #9
0
        private void SvcUnmapSharedMemory(AThreadState ThreadState)
        {
            int  Handle   = (int)ThreadState.X0;
            long Position = (long)ThreadState.X1;
            long Size     = (long)ThreadState.X2;

            HSharedMem HndData = Ns.Os.Handles.GetData <HSharedMem>(Handle);

            if (HndData != null)
            {
                ThreadState.X0 = (int)SvcResult.Success;
            }

            //TODO: Error codes.
        }
Пример #10
0
        private static void SvcUnmapSharedMemory(Switch Ns, ARegisters Registers, AMemory Memory)
        {
            int  Handle   = (int)Registers.X0;
            long Position = (long)Registers.X1;
            long Size     = (long)Registers.X2;

            HSharedMem HndData = Ns.Os.Handles.GetData <HSharedMem>(Handle);

            if (HndData != null)
            {
                Registers.X0 = (int)SvcResult.Success;
            }

            //TODO: Error codes.
        }
Пример #11
0
        public Horizon(Switch Ns)
        {
            this.Ns = Ns;

            Scheduler = new KProcessScheduler(Ns.Log);

            Processes = new ConcurrentDictionary <int, Process>();

            SystemState = new SystemStateMgr();

            Allocator = new MemoryAllocator();

            HidSharedMem  = new HSharedMem();
            FontSharedMem = new HSharedMem();

            VsyncEvent = new KEvent();
        }
Пример #12
0
        private void SvcMapSharedMemory(AThreadState ThreadState)
        {
            int  Handle = (int)ThreadState.X0;
            long Src    = (long)ThreadState.X1;
            long Size   = (long)ThreadState.X2;
            int  Perm   = (int)ThreadState.X3;

            HSharedMem SharedMem = Ns.Os.Handles.GetData <HSharedMem>(Handle);

            if (SharedMem != null)
            {
                SharedMem.AddVirtualPosition(Src);

                Memory.Manager.MapPhys(Src, Size, (int)MemoryType.SharedMemory, (AMemoryPerm)Perm);

                ThreadState.X0 = (int)SvcResult.Success;
            }

            //TODO: Error codes.
        }
Пример #13
0
        private void SvcMapSharedMemory(AThreadState ThreadState)
        {
            int  Handle = (int)ThreadState.X0;
            long Src    = (long)ThreadState.X1;
            long Size   = (long)ThreadState.X2;
            int  Perm   = (int)ThreadState.X3;

            if (!IsValidPosition(Src))
            {
                Ns.Log.PrintWarning(LogClass.KernelSvc, $"Invalid address {Src:x16}!");

                ThreadState.X0 = MakeError(ErrorModule.Kernel, KernelErr.InvalidMemRange);

                return;
            }

            HSharedMem SharedMem = Process.HandleTable.GetData <HSharedMem>(Handle);

            if (SharedMem != null)
            {
                Memory.Manager.Map(Src, Size, (int)MemoryType.SharedMemory, AMemoryPerm.Write);

                AMemoryHelper.FillWithZeros(Memory, Src, (int)Size);

                SharedMem.AddVirtualPosition(Memory, Src, Size);

                Memory.Manager.Reprotect(Src, Size, (AMemoryPerm)Perm);

                lock (MappedSharedMems)
                {
                    MappedSharedMems.Add((SharedMem, Src, Size));
                }

                ThreadState.X0 = 0;
            }

            //TODO: Error codes.
        }
Пример #14
0
        private static void SvcMapSharedMemory(Switch Ns, ARegisters Registers, AMemory Memory)
        {
            int  Handle   = (int)Registers.X0;
            long Position = (long)Registers.X1;
            long Size     = (long)Registers.X2;
            int  Perm     = (int)Registers.X3;

            HSharedMem HndData = Ns.Os.Handles.GetData <HSharedMem>(Handle);

            if (HndData != null)
            {
                long Src = Position;
                long Dst = HndData.PhysPos;

                HndData.VirtPos = Src;

                Memory.Manager.MapPhys(Position, Size, (int)MemoryType.SharedMemory, (AMemoryPerm)Perm);

                Registers.X0 = (int)SvcResult.Success;
            }

            //TODO: Error codes.
        }
Пример #15
0
        public long GetVirtHidOffset()
        {
            HSharedMem HidSharedMem = Handles.GetData <HSharedMem>(HidHandle);

            return(HidSharedMem.VirtPos);
        }
Пример #16
0
 public HidIAppletResource(HSharedMem Handle)
 {
     this.Handle = Handle;
 }