Restored the partial support for x64.

This commit is contained in:
Jonas 'Sortie' Termansen 2011-09-08 21:09:14 +02:00
parent 371dec71c9
commit 4bc2841ef0
8 changed files with 50 additions and 15 deletions

View File

@ -715,6 +715,7 @@ namespace Sortix
void SysReceieveKeystroke(CPU::InterruptRegisters* R)
{
#ifdef PLATFORM_X86
uint32_t codepoint;
if ( keystrokeQueueUsed == 0 )
{
@ -728,6 +729,7 @@ namespace Sortix
keystrokeQueueUsed--;
}
R->eax = codepoint;
#endif
}
}
}

View File

@ -131,6 +131,8 @@ namespace Sortix
#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("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);
#endif
@ -627,11 +629,21 @@ namespace Sortix
#warning "Virtual Memory is not available on this arch"
addr_t Lookup(addr_t where) { while(true); return 0; }
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; }
void MapKernel(addr_t where, addr_t physical) { while(true); }
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; }
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
}

View File

@ -344,6 +344,12 @@ namespace Sortix
// good dozen of pages onwards. Beware that this is only meant to be
// a temporary place to put memory.
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
}

View File

@ -81,6 +81,7 @@ namespace Sortix
void SysExecute(CPU::InterruptRegisters* R)
{
#ifdef PLATFORM_X86
const char* programname = (const char*) R->ebx;
size_t programsize = 0;
@ -96,5 +97,6 @@ namespace Sortix
R->eip = entry;
R->useresp = 0x80000000UL;
R->ebp = 0x80000000UL;
#endif
}
}

View File

@ -261,6 +261,11 @@ namespace Sortix
// Create a new thread data structure.
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
uintptr_t StackPos = 0x80000000UL;
@ -271,7 +276,6 @@ namespace Sortix
VirtualMemory::MapUser(MapTo, PhysStack);
size_t* Stack = (size_t*) StackPos;
#ifdef PLATFORM_X86
// Prepare the parameters for the entry function (C calling convention).
//Stack[StackLength - 1] = (size_t) 0xFACE; // Parameter2
Stack[-1] = (size_t) Parameter2; // Parameter2
@ -280,12 +284,7 @@ namespace Sortix
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.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.
thread->SetState(Thread::State::RUNNABLE);
@ -293,6 +292,8 @@ namespace Sortix
// Avoid side effects by restoring the old address space.
VirtualMemory::SwitchAddressSpace(OldAddrSpace);
#endif
return thread;
}
@ -319,12 +320,16 @@ namespace Sortix
if ( currentThread != NoopThread && currentThread->GetProcess() && sigintpending )
{
#ifdef PLATFORM_X86
Sound::Mute();
const char* programname = "sh";
R->ebx = (uint32_t) programname;
SysExecute(R);
sigintpending = false;
Log::Print("^C\n");
#else
#warning "Sigint is not available on this arch"
#endif
}
WakeSleeping(TimePassed);

View File

@ -55,8 +55,10 @@ namespace Sortix
void SysSetFrequency(CPU::InterruptRegisters* R)
{
#ifdef PLATFORM_X86
unsigned frequency = R->ebx;
if ( frequency == 0 ) { Mute(); } else { Play(frequency); }
#endif
}
}
}

View File

@ -62,6 +62,7 @@ namespace Sortix
void SysCreateFrame(CPU::InterruptRegisters* R)
{
#ifdef PLATFORM_X86
addr_t page = Page::Get();
if ( page == NULL ) { R->eax = 0; return; }
@ -102,10 +103,12 @@ namespace Sortix
process->_endcodesection = mapto + 0x1000UL;
R->eax = mapto;
#endif
}
void SysChangeFrame(CPU::InterruptRegisters* R)
{
#ifdef PLATFORM_X86
int fd = (int) R->ebx;
Process* process = CurrentProcess();
@ -167,11 +170,13 @@ namespace Sortix
frame->onscreen = true;
currentframe = frame;
SetCursor(width, height-1);
SetCursor(width, height-1);
#endif
}
void SysDeleteFrame(CPU::InterruptRegisters* R)
{
#ifdef PLATFORM_X86
int fd = (int) R->ebx;
Process* process = CurrentProcess();
@ -181,6 +186,7 @@ namespace Sortix
if ( device == NULL ) { R->eax = -1; return; }
if ( !device->Close() ) { R->eax = -1; return; }
R->eax = 0;
#endif
}
}

View File

@ -18,7 +18,7 @@
with Sortix. If not, see <http://www.gnu.org/licenses/>.
memorymanagement-asm.s
Handles memory for the x86 architecture.
Handles memory for the x64 architecture.
******************************************************************************/
@ -80,9 +80,9 @@ FragNext:
FragDone:
ret
.globl _ZN6Sortix4Page3GetEv
.type _ZN6Sortix4Page3GetEv, @function # namespace Sortix { void Paging::Allocate(); }
_ZN6Sortix4Page3GetEv:
.globl _ZN6Sortix4Page10GetPrivateEv
.type _ZN6Sortix4Page10GetPrivateEv, @function # namespace Sortix { void Paging::Allocate(); }
_ZN6Sortix4Page10GetPrivateEv:
# Load the front of our linked list.
movq _ZN6Sortix4Page15UnallocatedPageE, %rax # Load UnallocPage* Sortix::Page::UnallocatedPage
@ -135,9 +135,9 @@ OutOfMem:
movq $0, %rax
ret
.globl _ZN6Sortix4Page3PutEPv
.type _ZN6Sortix4Page3PutEPv, @function # namespace Sortix { void Paging::Free(void* Page); }
_ZN6Sortix4Page3PutEPv:
.globl _ZN6Sortix4Page10PutPrivateEm
.type _ZN6Sortix4Page10PutPrivateEm, @function # namespace Sortix { void Paging::Free(void* Page); }
_ZN6Sortix4Page10PutPrivateEm:
movq _ZN6Sortix4Page15UnallocatedPageE, %rax # Load UnallocPage* Sortix::Page::UnallocatedPage
# Disable virtual memory