ARMMap::ARMMap() { MemoryBlock::set(m_regions, 0, sizeof(m_regions)); m_regions[KernelData].virt = 0; m_regions[KernelData].phys = 0; m_regions[KernelData].size = GigaByte(1) - MegaByte(128); m_regions[KernelData].access = Memory::Readable | Memory::Writable | Memory::Executable; m_regions[KernelPrivate].virt = GigaByte(1) - MegaByte(128); m_regions[KernelPrivate].phys = GigaByte(1) - MegaByte(128); m_regions[KernelPrivate].size = MegaByte(128); m_regions[KernelPrivate].access = Memory::Readable | Memory::Writable; m_regions[UserData].virt = 0x80000000; m_regions[UserData].size = MegaByte(256); m_regions[UserHeap].virt = 0xb0000000; m_regions[UserHeap].size = MegaByte(256); m_regions[UserStack].virt = 0xc0000000; m_regions[UserStack].size = KiloByte(4); m_regions[UserPrivate].virt = 0xa0000000; m_regions[UserPrivate].size = MegaByte(256); }
IntelMap::IntelMap() { MemoryBlock::set(m_regions, 0, sizeof(m_regions)); m_regions[KernelData].virt = 0; m_regions[KernelData].size = GigaByte(1) - MegaByte(128); m_regions[KernelPrivate].virt = GigaByte(1) - MegaByte(128); m_regions[KernelPrivate].size = MegaByte(128); m_regions[UserData].virt = 0x80000000; m_regions[UserData].size = MegaByte(256); m_regions[UserHeap].virt = 0xb0000000; m_regions[UserHeap].size = MegaByte(256); m_regions[UserStack].virt = 0xc0000000; m_regions[UserStack].size = KiloByte(4); m_regions[UserPrivate].virt = 0xa0000000; m_regions[UserPrivate].size = MegaByte(256); m_regions[UserShare].virt = 0xd0000000; m_regions[UserShare].size = MegaByte(256); }
ARMProcess::ARMProcess(ProcessID id, Address entry, bool privileged) : Process(id, entry, privileged) { DEBUG("id =" << id << " entry =" << entry << " privileged = " << privileged); Size size = PAGEDIR_SIZE; BitAllocator *memory = Kernel::instance->getMemory(); Memory::Range range; Size framesize = (14+17)*sizeof(u32); // Allocate first level page table memory->allocate(&size, &m_pageDirectory, KiloByte(16)); // Initialize memory context Arch::Memory mem(m_pageDirectory, memory); mem.create(); // User stack. range.phys = 0; range.virt = mem.range(Memory::UserStack).virt; range.size = mem.range(Memory::UserStack).size; range.access = Memory::Present | Memory::User | Memory::Readable | Memory::Writable; mem.mapRange(&range); setUserStack(range.virt + range.size - MEMALIGN); // Kernel stack. range.phys = 0; range.virt = mem.range(Memory::KernelStack).virt; range.size = mem.range(Memory::KernelStack).size; range.access = Memory::Present | Memory::Readable | Memory::Writable; mem.mapRange(&range); setKernelStack(range.virt + range.size - MEMALIGN - framesize); // Map kernel stack. Arch::Memory local(0, memory); range.virt = local.findFree(range.size, Memory::KernelPrivate); local.mapRange(&range); Address *stack = (Address *) (range.virt + range.size - framesize - MEMALIGN); // Zero kernel stack MemoryBlock::set((void *)range.virt, 0, range.size); // restoreState: fill kernel register state stack[0] = (Address) loadCoreState0; /* restoreState: pop {lr} */ stack += 14; // loadCoreState0: fill user register state stack[0] = (privileged ? SYS_MODE : USR_MODE) | FIQ_BIT | IRQ_BIT; /* user program status (CPSR) */ stack++; stack[0] = m_userStack; /* user program SP */ stack[1] = 0; /* user program LR */ stack+=15; stack[0] = entry; /* user program entry (PC) */ local.unmapRange(&range); }