Restored the partial support for x64.
This commit is contained in:
parent
371dec71c9
commit
4bc2841ef0
|
@ -715,6 +715,7 @@ namespace Sortix
|
||||||
|
|
||||||
void SysReceieveKeystroke(CPU::InterruptRegisters* R)
|
void SysReceieveKeystroke(CPU::InterruptRegisters* R)
|
||||||
{
|
{
|
||||||
|
#ifdef PLATFORM_X86
|
||||||
uint32_t codepoint;
|
uint32_t codepoint;
|
||||||
if ( keystrokeQueueUsed == 0 )
|
if ( keystrokeQueueUsed == 0 )
|
||||||
{
|
{
|
||||||
|
@ -728,6 +729,7 @@ namespace Sortix
|
||||||
keystrokeQueueUsed--;
|
keystrokeQueueUsed--;
|
||||||
}
|
}
|
||||||
R->eax = codepoint;
|
R->eax = codepoint;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,6 +131,8 @@ namespace Sortix
|
||||||
|
|
||||||
#ifdef PLATFORM_X64
|
#ifdef PLATFORM_X64
|
||||||
Log::Print("Halt: CPU X64 cannot continue as the virtual memory isn't disabled (kernel bug) and the code is about to access non-mapped memory.\n");
|
Log::Print("Halt: CPU X64 cannot continue as the virtual memory isn't disabled (kernel bug) and the code is about to access non-mapped memory.\n");
|
||||||
|
Log::Print("Sorry, it simply isn't possible to fully boot Sortix in x64 mode yet.\n");
|
||||||
|
Log::Print("X64 may be working when Sortix 0.5 comes out, or try the git master.\n");
|
||||||
while(true);
|
while(true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -627,11 +629,21 @@ namespace Sortix
|
||||||
|
|
||||||
#warning "Virtual Memory is not available on this arch"
|
#warning "Virtual Memory is not available on this arch"
|
||||||
|
|
||||||
|
addr_t Lookup(addr_t where) { while(true); return 0; }
|
||||||
void Flush() { while(true); }
|
void Flush() { while(true); }
|
||||||
void SwitchDirectory(addr_t dir) { while(true); }
|
addr_t CreateAddressSpace() { while(true); return 0; }
|
||||||
|
addr_t SwitchAddressSpace(addr_t addrspace) { while(true); return 0; }
|
||||||
|
addr_t SwitchDirectory(addr_t dir) { while(true); return 0; }
|
||||||
addr_t CreateDirectory() { while(true); return 0; }
|
addr_t CreateDirectory() { while(true); return 0; }
|
||||||
|
void MapKernel(addr_t where, addr_t physical) { while(true); }
|
||||||
addr_t UnmapKernel(addr_t where) { while(true); return 0; }
|
addr_t UnmapKernel(addr_t where) { while(true); return 0; }
|
||||||
|
Table* CreateUserTable(addr_t where, bool maycreate) { while(true); return NULL; }
|
||||||
|
bool MapUser(addr_t where, addr_t physical) { while(true); return false; }
|
||||||
addr_t UnmapUser(addr_t where) { while(true); return 0; }
|
addr_t UnmapUser(addr_t where) { while(true); return 0; }
|
||||||
|
bool MapRangeKernel(addr_t where, size_t bytes) { while(true); return false; }
|
||||||
|
void UnmapRangeKernel(addr_t where, size_t bytes) { while(true); }
|
||||||
|
bool MapRangeUser(addr_t where, size_t bytes) { while(true); return false; }
|
||||||
|
void UnmapRangeUser(addr_t where, size_t bytes) { while(true); }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -344,6 +344,12 @@ namespace Sortix
|
||||||
// good dozen of pages onwards. Beware that this is only meant to be
|
// good dozen of pages onwards. Beware that this is only meant to be
|
||||||
// a temporary place to put memory.
|
// a temporary place to put memory.
|
||||||
const addr_t tempaddr = 0xFF800000UL;
|
const addr_t tempaddr = 0xFF800000UL;
|
||||||
|
|
||||||
|
#elif defined(PLATFORM_X64)
|
||||||
|
// This isn't supported yet, so just use random values.
|
||||||
|
const addr_t heapLower = 0x80000000UL;
|
||||||
|
const addr_t heapUpper = 0xFF800000UL;
|
||||||
|
const addr_t tempaddr = 0xFF800000UL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,6 +81,7 @@ namespace Sortix
|
||||||
|
|
||||||
void SysExecute(CPU::InterruptRegisters* R)
|
void SysExecute(CPU::InterruptRegisters* R)
|
||||||
{
|
{
|
||||||
|
#ifdef PLATFORM_X86
|
||||||
const char* programname = (const char*) R->ebx;
|
const char* programname = (const char*) R->ebx;
|
||||||
|
|
||||||
size_t programsize = 0;
|
size_t programsize = 0;
|
||||||
|
@ -96,5 +97,6 @@ namespace Sortix
|
||||||
R->eip = entry;
|
R->eip = entry;
|
||||||
R->useresp = 0x80000000UL;
|
R->useresp = 0x80000000UL;
|
||||||
R->ebp = 0x80000000UL;
|
R->ebp = 0x80000000UL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -261,6 +261,11 @@ namespace Sortix
|
||||||
// Create a new thread data structure.
|
// Create a new thread data structure.
|
||||||
Thread* thread = new Thread(Process, AllocatedThreadId++, PhysStack, StackLength);
|
Thread* thread = new Thread(Process, AllocatedThreadId++, PhysStack, StackLength);
|
||||||
|
|
||||||
|
#ifndef PLATFORM_X86
|
||||||
|
#warning "No threads are available on this arch"
|
||||||
|
while(true);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef PLATFORM_X86
|
#ifdef PLATFORM_X86
|
||||||
|
|
||||||
uintptr_t StackPos = 0x80000000UL;
|
uintptr_t StackPos = 0x80000000UL;
|
||||||
|
@ -271,7 +276,6 @@ namespace Sortix
|
||||||
VirtualMemory::MapUser(MapTo, PhysStack);
|
VirtualMemory::MapUser(MapTo, PhysStack);
|
||||||
size_t* Stack = (size_t*) StackPos;
|
size_t* Stack = (size_t*) StackPos;
|
||||||
|
|
||||||
#ifdef PLATFORM_X86
|
|
||||||
// Prepare the parameters for the entry function (C calling convention).
|
// Prepare the parameters for the entry function (C calling convention).
|
||||||
//Stack[StackLength - 1] = (size_t) 0xFACE; // Parameter2
|
//Stack[StackLength - 1] = (size_t) 0xFACE; // Parameter2
|
||||||
Stack[-1] = (size_t) Parameter2; // Parameter2
|
Stack[-1] = (size_t) Parameter2; // Parameter2
|
||||||
|
@ -280,12 +284,7 @@ namespace Sortix
|
||||||
Stack[-4] = (size_t) 0x0; // Eip
|
Stack[-4] = (size_t) 0x0; // Eip
|
||||||
thread->_registers.ebp = thread->_registers.useresp = (uint32_t) (StackPos - 4*sizeof(size_t)); // Point to the last word used on the stack.
|
thread->_registers.ebp = thread->_registers.useresp = (uint32_t) (StackPos - 4*sizeof(size_t)); // Point to the last word used on the stack.
|
||||||
thread->_registers.eip = (uint32_t) Start; // Point to our entry function.
|
thread->_registers.eip = (uint32_t) Start; // Point to our entry function.
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
#warning "No threads are available on this arch"
|
|
||||||
while(true);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Mark the thread as running, which adds it to the scheduler's linked list.
|
// Mark the thread as running, which adds it to the scheduler's linked list.
|
||||||
thread->SetState(Thread::State::RUNNABLE);
|
thread->SetState(Thread::State::RUNNABLE);
|
||||||
|
@ -293,6 +292,8 @@ namespace Sortix
|
||||||
// Avoid side effects by restoring the old address space.
|
// Avoid side effects by restoring the old address space.
|
||||||
VirtualMemory::SwitchAddressSpace(OldAddrSpace);
|
VirtualMemory::SwitchAddressSpace(OldAddrSpace);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
return thread;
|
return thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,12 +320,16 @@ namespace Sortix
|
||||||
|
|
||||||
if ( currentThread != NoopThread && currentThread->GetProcess() && sigintpending )
|
if ( currentThread != NoopThread && currentThread->GetProcess() && sigintpending )
|
||||||
{
|
{
|
||||||
|
#ifdef PLATFORM_X86
|
||||||
Sound::Mute();
|
Sound::Mute();
|
||||||
const char* programname = "sh";
|
const char* programname = "sh";
|
||||||
R->ebx = (uint32_t) programname;
|
R->ebx = (uint32_t) programname;
|
||||||
SysExecute(R);
|
SysExecute(R);
|
||||||
sigintpending = false;
|
sigintpending = false;
|
||||||
Log::Print("^C\n");
|
Log::Print("^C\n");
|
||||||
|
#else
|
||||||
|
#warning "Sigint is not available on this arch"
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
WakeSleeping(TimePassed);
|
WakeSleeping(TimePassed);
|
||||||
|
|
|
@ -55,8 +55,10 @@ namespace Sortix
|
||||||
|
|
||||||
void SysSetFrequency(CPU::InterruptRegisters* R)
|
void SysSetFrequency(CPU::InterruptRegisters* R)
|
||||||
{
|
{
|
||||||
|
#ifdef PLATFORM_X86
|
||||||
unsigned frequency = R->ebx;
|
unsigned frequency = R->ebx;
|
||||||
if ( frequency == 0 ) { Mute(); } else { Play(frequency); }
|
if ( frequency == 0 ) { Mute(); } else { Play(frequency); }
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,7 @@ namespace Sortix
|
||||||
|
|
||||||
void SysCreateFrame(CPU::InterruptRegisters* R)
|
void SysCreateFrame(CPU::InterruptRegisters* R)
|
||||||
{
|
{
|
||||||
|
#ifdef PLATFORM_X86
|
||||||
addr_t page = Page::Get();
|
addr_t page = Page::Get();
|
||||||
if ( page == NULL ) { R->eax = 0; return; }
|
if ( page == NULL ) { R->eax = 0; return; }
|
||||||
|
|
||||||
|
@ -102,10 +103,12 @@ namespace Sortix
|
||||||
process->_endcodesection = mapto + 0x1000UL;
|
process->_endcodesection = mapto + 0x1000UL;
|
||||||
|
|
||||||
R->eax = mapto;
|
R->eax = mapto;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void SysChangeFrame(CPU::InterruptRegisters* R)
|
void SysChangeFrame(CPU::InterruptRegisters* R)
|
||||||
{
|
{
|
||||||
|
#ifdef PLATFORM_X86
|
||||||
int fd = (int) R->ebx;
|
int fd = (int) R->ebx;
|
||||||
|
|
||||||
Process* process = CurrentProcess();
|
Process* process = CurrentProcess();
|
||||||
|
@ -167,11 +170,13 @@ namespace Sortix
|
||||||
|
|
||||||
frame->onscreen = true;
|
frame->onscreen = true;
|
||||||
currentframe = frame;
|
currentframe = frame;
|
||||||
SetCursor(width, height-1);
|
SetCursor(width, height-1);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void SysDeleteFrame(CPU::InterruptRegisters* R)
|
void SysDeleteFrame(CPU::InterruptRegisters* R)
|
||||||
{
|
{
|
||||||
|
#ifdef PLATFORM_X86
|
||||||
int fd = (int) R->ebx;
|
int fd = (int) R->ebx;
|
||||||
|
|
||||||
Process* process = CurrentProcess();
|
Process* process = CurrentProcess();
|
||||||
|
@ -181,6 +186,7 @@ namespace Sortix
|
||||||
if ( device == NULL ) { R->eax = -1; return; }
|
if ( device == NULL ) { R->eax = -1; return; }
|
||||||
if ( !device->Close() ) { R->eax = -1; return; }
|
if ( !device->Close() ) { R->eax = -1; return; }
|
||||||
R->eax = 0;
|
R->eax = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
with Sortix. If not, see <http://www.gnu.org/licenses/>.
|
with Sortix. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
memorymanagement-asm.s
|
memorymanagement-asm.s
|
||||||
Handles memory for the x86 architecture.
|
Handles memory for the x64 architecture.
|
||||||
|
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
|
@ -80,9 +80,9 @@ FragNext:
|
||||||
FragDone:
|
FragDone:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.globl _ZN6Sortix4Page3GetEv
|
.globl _ZN6Sortix4Page10GetPrivateEv
|
||||||
.type _ZN6Sortix4Page3GetEv, @function # namespace Sortix { void Paging::Allocate(); }
|
.type _ZN6Sortix4Page10GetPrivateEv, @function # namespace Sortix { void Paging::Allocate(); }
|
||||||
_ZN6Sortix4Page3GetEv:
|
_ZN6Sortix4Page10GetPrivateEv:
|
||||||
# Load the front of our linked list.
|
# Load the front of our linked list.
|
||||||
movq _ZN6Sortix4Page15UnallocatedPageE, %rax # Load UnallocPage* Sortix::Page::UnallocatedPage
|
movq _ZN6Sortix4Page15UnallocatedPageE, %rax # Load UnallocPage* Sortix::Page::UnallocatedPage
|
||||||
|
|
||||||
|
@ -135,9 +135,9 @@ OutOfMem:
|
||||||
movq $0, %rax
|
movq $0, %rax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.globl _ZN6Sortix4Page3PutEPv
|
.globl _ZN6Sortix4Page10PutPrivateEm
|
||||||
.type _ZN6Sortix4Page3PutEPv, @function # namespace Sortix { void Paging::Free(void* Page); }
|
.type _ZN6Sortix4Page10PutPrivateEm, @function # namespace Sortix { void Paging::Free(void* Page); }
|
||||||
_ZN6Sortix4Page3PutEPv:
|
_ZN6Sortix4Page10PutPrivateEm:
|
||||||
movq _ZN6Sortix4Page15UnallocatedPageE, %rax # Load UnallocPage* Sortix::Page::UnallocatedPage
|
movq _ZN6Sortix4Page15UnallocatedPageE, %rax # Load UnallocPage* Sortix::Page::UnallocatedPage
|
||||||
|
|
||||||
# Disable virtual memory
|
# Disable virtual memory
|
||||||
|
|
Loading…
Reference in New Issue