mirror of
https://gitlab.com/sortix/sortix.git
synced 2023-02-13 20:55:38 -05:00
Added a shell, a few programs, and added support for SIGINT.
This commit is contained in:
parent
2f9d08a800
commit
34e9ca277d
15 changed files with 189 additions and 2 deletions
4
Makefile
4
Makefile
|
@ -5,7 +5,7 @@ endif
|
|||
REMOTE=192.168.2.6
|
||||
REMOTEUSER=sortie
|
||||
REMOTECOPYDIR:=/home/$(REMOTEUSER)/Desktop/MaxsiOS
|
||||
MODULES=libmaxsi hello pong mkinitrd sortix
|
||||
MODULES=libmaxsi hello pong mkinitrd utils sortix
|
||||
|
||||
VERSION=0.4
|
||||
DEBNAME:=sortix_$(VERSION)_$(CPU)
|
||||
|
@ -103,7 +103,7 @@ iso: all debsource
|
|||
mkdir -p $(INITRDDIR)
|
||||
cp hello/hello $(INITRDDIR)
|
||||
cp pong/pong $(INITRDDIR)
|
||||
cp $(INITRDDIR)/hello $(INITRDDIR)/init
|
||||
for F in init cat sh mxsh clear; do cp utils/$$F $(INITRDDIR); done
|
||||
(cd $(INITRDDIR) && ../mkinitrd/mkinitrd * -o ../$(ISODIR)/boot/sortix.initrd)
|
||||
rm -rf $(INITRDDIR)
|
||||
cp builds/$(DEBSRCNAME)-src.tar.gz $(ISODIR)
|
||||
|
|
|
@ -62,6 +62,7 @@ namespace Maxsi
|
|||
const uint32_t NONE = 0x40000000 + 30;
|
||||
const uint32_t ALTGR = 0x40000000 + 31;
|
||||
const uint32_t NUMLCK = 0x40000000 + 32;
|
||||
const uint32_t SIGINT = 0x40000000 + 33;
|
||||
const uint32_t DEPRESSED = (1<<31);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,8 +36,18 @@ _start:
|
|||
push $0 # argc
|
||||
call main
|
||||
|
||||
# HACK: Just restart the shell!
|
||||
mov $10, %eax
|
||||
mov $SH, %ebx
|
||||
int $0x80
|
||||
|
||||
# Now return mains result when exiting the process
|
||||
mov %eax, %ebx
|
||||
mov $1, %eax
|
||||
mov $0x0, %ebx # TODO: This syscall exits a thread, not a process!
|
||||
int $0x80
|
||||
|
||||
.section .data
|
||||
SH:
|
||||
.asciz "sh"
|
||||
|
||||
|
|
|
@ -34,6 +34,8 @@ const char* exceptions[] = { "Divide by zero", "Debug", "Non maskable interrupt"
|
|||
if ( Regs->int_no < 32 )
|
||||
{
|
||||
const char* message = ( Regs->int_no < numknownexceptions ) ? exceptions[Regs->int_no] : "Unknown";
|
||||
//Sortix::Log::PrintF("eax=0x%x\tebx=0x%x\tecx=0x%x\tedx=0x%x\tesi=0x%x\tedi=0x%x\tesp=0x%x\tuseresp=0x%x\tebp=0x%x\teip=0x%x\n", Regs->eax, Regs->ebx, Regs->ecx, Regs->edx, Regs->esi, Regs->edi, Regs->esp, Regs->useresp, Regs->ebp, Regs->eip);
|
||||
|
||||
Sortix::PanicF("Unhandled CPU Exception id %zu '%s' at eip=0x%zx (cr2=0x%p, err_code=0x%p)", Regs->int_no, message, Regs->eip, Regs->cr2, Regs->err_code);
|
||||
}
|
||||
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
#include "panic.h"
|
||||
#include "keyboard.h"
|
||||
#include "isr.h"
|
||||
#include "process.h"
|
||||
#include "scheduler.h"
|
||||
|
||||
#include "pong.h"
|
||||
|
||||
|
@ -578,6 +580,7 @@ namespace Sortix
|
|||
|
||||
nat Mask = 0;
|
||||
nat LockMask = 0;
|
||||
bool control;
|
||||
|
||||
const nat Shift = (1<<0);
|
||||
const nat AltGr = (1<<1);
|
||||
|
@ -600,6 +603,7 @@ namespace Sortix
|
|||
if ( CodePoint == LSHFT ) { Mask &= ~Shift; }
|
||||
if ( CodePoint == ALTGR ) { Mask &= ~AltGr; }
|
||||
if ( CodePoint == SCRLCK ) { Mask &= ~ScrLck; }
|
||||
if ( CodePoint == CTRL ) { control = false; }
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -607,6 +611,12 @@ namespace Sortix
|
|||
if ( CodePoint == ALTGR ) { Mask |= AltGr; }
|
||||
if ( CodePoint == SCRLCK ) { Mask |= ScrLck; }
|
||||
if ( CodePoint == CAPS ) { LockMask ^= Shift; SetLEDs(LEDCapsLck); }
|
||||
if ( CodePoint == CTRL ) { control = true; }
|
||||
}
|
||||
|
||||
if ( control && ( CodePoint == 'c' || CodePoint == 'C' ) )
|
||||
{
|
||||
CodePoint = SIGINT;
|
||||
}
|
||||
|
||||
return CodePoint;
|
||||
|
@ -666,6 +676,12 @@ namespace Sortix
|
|||
|
||||
uint32_t CodePoint = Layouts::GetCodePoint(Scancode);
|
||||
|
||||
if ( CodePoint == SIGINT )
|
||||
{
|
||||
SigInt();
|
||||
return;
|
||||
}
|
||||
|
||||
bool KeyUp = (Scancode & 0x80);
|
||||
|
||||
if ( KeyUp ) { CodePoint |= DEPRESSED; }
|
||||
|
|
|
@ -52,6 +52,7 @@ namespace Sortix
|
|||
_addrspace = addrspace;
|
||||
_endcodesection = 0x400000UL;
|
||||
segments = NULL;
|
||||
sigint = false;
|
||||
}
|
||||
|
||||
Process::~Process()
|
||||
|
@ -81,6 +82,7 @@ namespace Sortix
|
|||
void SysExecute(CPU::InterruptRegisters* R)
|
||||
{
|
||||
const char* programname = (const char*) R->ebx;
|
||||
|
||||
size_t programsize = 0;
|
||||
byte* program = InitRD::Open(programname, &programsize);
|
||||
if ( program == NULL ) { R->eax = -1; return; }
|
||||
|
@ -93,5 +95,6 @@ namespace Sortix
|
|||
// This is a hacky way to set up the thread!
|
||||
R->eip = entry;
|
||||
R->useresp = 0x80000000UL;
|
||||
R->ebp = 0x80000000UL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -62,6 +62,9 @@ namespace Sortix
|
|||
DescriptorTable descriptors;
|
||||
ProcessSegment* segments;
|
||||
|
||||
public:
|
||||
bool sigint;
|
||||
|
||||
public:
|
||||
addr_t _endcodesection; // HACK
|
||||
|
||||
|
|
|
@ -183,11 +183,16 @@ namespace Sortix
|
|||
SetState(UNRUNNABLE);
|
||||
}
|
||||
|
||||
bool sigintpending = false;
|
||||
void SigInt() { sigintpending = true; }
|
||||
|
||||
namespace Scheduler
|
||||
{
|
||||
// Initializes the scheduling subsystem.
|
||||
void Init()
|
||||
{
|
||||
sigintpending = false;
|
||||
|
||||
currentThread = NULL;
|
||||
firstRunnableThread = NULL;
|
||||
firstUnrunnableThread = NULL;
|
||||
|
@ -332,6 +337,15 @@ namespace Sortix
|
|||
{
|
||||
//Log::PrintF("Scheduling while at eip=0x%p...", R->eip);
|
||||
|
||||
if ( currentThread != NoopThread && currentThread->GetProcess() && sigintpending )
|
||||
{
|
||||
const char* programname = "sh";
|
||||
R->ebx = (uint32_t) programname;
|
||||
SysExecute(R);
|
||||
sigintpending = false;
|
||||
Log::Print("^C\n");
|
||||
}
|
||||
|
||||
WakeSleeping(TimePassed);
|
||||
|
||||
// Find the next thread to be run.
|
||||
|
|
|
@ -115,6 +115,9 @@ namespace Sortix
|
|||
|
||||
// Scheduling
|
||||
Thread* CurrentThread();
|
||||
|
||||
// HACK
|
||||
void SigInt();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
23
utils/Makefile
Normal file
23
utils/Makefile
Normal file
|
@ -0,0 +1,23 @@
|
|||
# Set up variables such that we can easily cross-compile.
|
||||
OSROOT=..
|
||||
include ../crosscompilemakefile.mak
|
||||
|
||||
BINARIES:=\
|
||||
init \
|
||||
cat \
|
||||
sh \
|
||||
mxsh \
|
||||
clear \
|
||||
|
||||
all: $(BINARIES)
|
||||
|
||||
%: %.cpp
|
||||
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -O2 -c $< -o $@.o
|
||||
$(LD) $(LDFLAGS) $@.o -o $@ $(LIBS)
|
||||
|
||||
sh: mxsh
|
||||
cp mxsh sh
|
||||
|
||||
clean:
|
||||
rm -f $(BINARIES) *.o
|
||||
|
30
utils/cat.cpp
Normal file
30
utils/cat.cpp
Normal file
|
@ -0,0 +1,30 @@
|
|||
#include <stdio.h>
|
||||
#include <libmaxsi/sortix-keyboard.h>
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
bool lastwasesc = false;
|
||||
|
||||
while (true)
|
||||
{
|
||||
unsigned method = System::Keyboard::POLL;
|
||||
uint32_t codepoint = System::Keyboard::ReceieveKeystroke(method);
|
||||
|
||||
if ( codepoint == 0 ) { continue; }
|
||||
if ( codepoint & Maxsi::Keyboard::DEPRESSED ) { continue; }
|
||||
if ( codepoint == Maxsi::Keyboard::UP ) { printf("\e[A"); continue; }
|
||||
if ( codepoint == Maxsi::Keyboard::DOWN ) { printf("\e[B"); continue; }
|
||||
if ( codepoint == Maxsi::Keyboard::RIGHT ) { printf("\e[C"); continue; }
|
||||
if ( codepoint == Maxsi::Keyboard::LEFT ) { printf("\e[D"); continue; }
|
||||
if ( codepoint == Maxsi::Keyboard::ESC ) { printf("\e["); lastwasesc = true; continue; }
|
||||
if ( lastwasesc && codepoint == '[' ) { continue; }
|
||||
if ( codepoint >= 0x80 ) { continue; }
|
||||
|
||||
char msg[2]; msg[0] = codepoint; msg[1] = '\0';
|
||||
printf(msg);
|
||||
lastwasesc = false;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
7
utils/clear.cpp
Normal file
7
utils/clear.cpp
Normal file
|
@ -0,0 +1,7 @@
|
|||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
printf("\e[H\e[2J");
|
||||
return 0;
|
||||
}
|
15
utils/init.cpp
Normal file
15
utils/init.cpp
Normal file
|
@ -0,0 +1,15 @@
|
|||
#include <stdio.h>
|
||||
#include <libmaxsi/process.h>
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
// Reset the terminal's color and the rest of it.
|
||||
printf("\e[m\e[J");
|
||||
|
||||
const char* programname = "sh";
|
||||
const char* newargv[] = { programname };
|
||||
|
||||
Maxsi::Process::Execute(programname, 1, newargv);
|
||||
|
||||
return 1;
|
||||
}
|
53
utils/mxsh.cpp
Normal file
53
utils/mxsh.cpp
Normal file
|
@ -0,0 +1,53 @@
|
|||
#include <stdio.h>
|
||||
#include <libmaxsi/process.h>
|
||||
#include <libmaxsi/sortix-keyboard.h>
|
||||
|
||||
using namespace Maxsi;
|
||||
|
||||
void command()
|
||||
{
|
||||
printf("root@sortix / # ");
|
||||
|
||||
const size_t commandsize = 128;
|
||||
char command[commandsize + 1];
|
||||
size_t commandused = 0;
|
||||
|
||||
while (true)
|
||||
{
|
||||
unsigned method = System::Keyboard::POLL;
|
||||
uint32_t codepoint = System::Keyboard::ReceieveKeystroke(method);
|
||||
|
||||
if ( codepoint == 0 ) { continue; }
|
||||
if ( codepoint & Maxsi::Keyboard::DEPRESSED ) { continue; }
|
||||
if ( codepoint >= 0x80 ) { continue; }
|
||||
|
||||
if ( codepoint == '\b' )
|
||||
{
|
||||
if ( 0 < commandused ) { printf("\b"); commandused--; }
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( commandsize <= commandused && codepoint != '\n' ) { continue; }
|
||||
|
||||
char msg[2]; msg[0] = codepoint; msg[1] = '\0';
|
||||
printf(msg);
|
||||
|
||||
if ( codepoint == '\n' ) { command[commandused] = '\0'; break; }
|
||||
|
||||
command[commandused++] = codepoint;
|
||||
}
|
||||
|
||||
if ( command[0] == '\0' ) { return; }
|
||||
|
||||
// Replace the current process with another process image.
|
||||
Process::Execute(command, 0, NULL);
|
||||
|
||||
// This is clever. This only happens if the program didn't change.
|
||||
printf("%s: command not found\n", command);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
while ( true ) { command(); }
|
||||
}
|
||||
|
7
utils/uname.cpp
Normal file
7
utils/uname.cpp
Normal file
|
@ -0,0 +1,7 @@
|
|||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
printf("Sortix\n");
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue