memset(&buf[80*24], 0, 80*2);
}
}
+
+// === EXPORTS ===
+EXPORT(__stack_chk_fail);
// --- EXPORTS ---
EXPORT(memcpy); EXPORT(memset);
+EXPORT(memcmp);
//EXPORT(memcpyw); EXPORT(memsetw);
EXPORT(memcpyd); EXPORT(memsetd);
EXPORT(inb); EXPORT(inw); EXPORT(ind);
EXPORT(outb); EXPORT(outw); EXPORT(outd);
EXPORT(__udivdi3); EXPORT(__umoddi3);
+
+EXPORT(LittleEndian16); EXPORT(BigEndian16);
+EXPORT(LittleEndian32); EXPORT(BigEndian32);
);
for(;;); // Shouldn't reach here
}
+
+// === EXPORTS ===
+EXPORT(Proc_SpawnWorker);
Sint64 dest = giTimestamp + Delay;
while(dest < giTimestamp) Threads_Yield();
}
+
+// === EXPORTS ===
+EXPORT(now);
+EXPORT(Time_CreateTimer);
+EXPORT(Time_RemoveTimer);
+EXPORT(Time_Delay);
Elf32_Dyn *dynamicTab = NULL; // Dynamic Table Pointer\r
char *dynstrtab = NULL; // .dynamic String Table\r
Elf32_Sym *dynsymtab = NULL;\r
+ int bFailed = 0;\r
\r
ENTER("pBase", Base);\r
\r
{\r
ptr = (void*)(iBaseDiff + rel[i].r_offset);\r
if( !Elf_Int_DoRelocate(rel[i].r_info, ptr, *ptr, dynsymtab, (Uint)Base) ) {\r
- LEAVE('x', 0);\r
- return 0;\r
+ bFailed = 1;\r
}\r
}\r
}\r
{\r
ptr = (void*)(iBaseDiff + rela[i].r_offset);\r
if( !Elf_Int_DoRelocate(rel[i].r_info, ptr, rela[i].r_addend, dynsymtab, (Uint)Base) ) {\r
- LEAVE('x', 0);\r
- return 0;\r
+ bFailed = 1;\r
}\r
}\r
}\r
{\r
ptr = (void*)(iBaseDiff + pltRel[i].r_offset);\r
if( !Elf_Int_DoRelocate(pltRel[i].r_info, ptr, *ptr, dynsymtab, (Uint)Base) ) {\r
- LEAVE('x', 0);\r
- return 0;\r
+ bFailed = 1;\r
}\r
}\r
}\r
{\r
ptr = (void*)((Uint)Base + pltRela[i].r_offset);\r
if( !Elf_Int_DoRelocate(pltRela[i].r_info, ptr, pltRela[i].r_addend, dynsymtab, (Uint)Base) ) {\r
- LEAVE('x', 0);\r
- return 0;\r
+ bFailed = 1;\r
}\r
}\r
}\r
}\r
\r
+ if(bFailed) {\r
+ LEAVE('i', 0);\r
+ return 0;\r
+ }\r
+ \r
LEAVE('x', hdr->entrypoint);\r
return hdr->entrypoint;\r
}\r
// === CONSTANTS ===\r
#define BIN_LOWEST MM_USER_MIN // 1MiB\r
#define BIN_GRANUALITY 0x10000 // 64KiB\r
+//! \todo Move 0xBC000000 to mm_virt.h\r
#define BIN_HIGHEST (0xBC000000-BIN_GRANUALITY) // Just below the kernel\r
#define KLIB_LOWEST MM_MODULE_MIN\r
#define KLIB_GRANUALITY 0x8000 // 32KiB\r
MM_SetFlags( addr, MM_PFLAG_COW, -1 );\r
}\r
\r
+ //Log("Mapped '%s' to 0x%x", binary->TruePath, base);\r
+ \r
//LOG("*0x%x = 0x%x\n", binary->Pages[0].Virtual, *(Uint*)binary->Pages[0].Virtual);\r
\r
return base;\r
if(giDebug_KTerm != -1)
VFS_Close(giDebug_KTerm);
giDebug_KTerm = VFS_Open(File, VFS_OPENFLAG_WRITE);
- Log("Opend '%s' as %i\n", File, giDebug_KTerm);
+ Log("Opened '%s' as %i\n", File, giDebug_KTerm);
}
void Debug_Enter(char *FuncName, char *ArgTypes, ...)
}
// --- EXPORTS ---
+EXPORT(Log);
EXPORT(Warning);
EXPORT(Debug_Enter);
EXPORT(Debug_Log);
void VT_InitOutput()
{
giVT_OutputDevHandle = VFS_Open(gsVT_OutputDevice, VFS_OPENFLAG_WRITE);
- Log("giVT_OutputDevHandle = %x\n", giVT_OutputDevHandle);
VT_SetTerminal( 0 );
}
void VT_InitInput()
{
giVT_InputDevHandle = VFS_Open(gsVT_InputDevice, VFS_OPENFLAG_READ);
- LOG("giVT_InputDevHandle = %x\n", giVT_InputDevHandle);
if(giVT_InputDevHandle == -1) return ;
VFS_IOCtl(giVT_InputDevHandle, KB_IOCTL_SETCALLBACK, VT_KBCallBack);
}
case KEY_F11: VT_SetTerminal(10); return;
case KEY_F12: VT_SetTerminal(11); return;
case KEY_PGUP:
- break;
+ return;
case KEY_PGDOWN:
- break;
+ return;
}
}
}
}
#endif
+
+// === EXPORTS ===
+EXPORT(malloc);
+EXPORT(realloc);
+EXPORT(free);
return -1;
}
+EXPORT(strlen);
EXPORT(strdup);
EXPORT(strcmp);
+EXPORT(strncmp);
EXPORT(strcpy);
+//EXPORT(strncpy);
EXPORT(timestamp);
EXPORT(ReadUTF8);
EXPORT(CheckMem);
EXPORT(CheckString);
+EXPORT(LookupString);
if(strcmp(deps[j], gKernelModules[k].Name) == 0)
break;
}
- Log("%s requires %s\n", gKernelModules[i].Name, deps[j]);
if(k == giNumBuiltinModules) {
Warning("Unable to find dependency '%s' for '%s' in kernel",
deps[j], gKernelModules[i].Name);
}
// `k` is assumed to be less than `giNumBuiltinModules`
- Log("baIsLoaded[%i(%s)] = %i\n", k, deps[j], baIsLoaded[k]);
// If a dependency failed, skip and mark as failed
if( baIsLoaded[k] == -1 ) {
baIsLoaded[i] = -1;
#include <proc.h>
#include <errno.h>
-#define CHECK_NUM_NULLOK(v,size) do {\
- if((v)&&!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}\
- }while(0)
-#define CHECK_STR_NULLOK(v) do {\
- if((v)&&!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}\
- }while(0)
-#define CHECK_NUM_NONULL(v,size) do {\
- if(!(v)||!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}\
- }while(0)
-#define CHECK_STR_NONULL(v) do {\
- if(!(v)||!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}\
- }while(0)
+#define CHECK_NUM_NULLOK(v,size) \
+ if((v)&&!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}
+#define CHECK_STR_NULLOK(v) \
+ if((v)&&!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}
+#define CHECK_NUM_NONULL(v,size) \
+ if(!(v)||!Syscall_Valid((size),(Uint)(v))){ret=-1;err=-EINVAL;break;}
+#define CHECK_STR_NONULL(v) \
+ if(!(v)||!Syscall_ValidString((Uint)(v))){ret=-1;err=-EINVAL;break;}
// === IMPORTS ===
extern int Proc_Clone(Uint *Err, Uint Flags);
{
Uint64 ret = 0;
Uint err = 0;
- #if DEBUG
+
ENTER("iThread iNum", Threads_GetTID(), Regs->Num);
if(Regs->Num < NUM_SYSCALLS)
LOG("Syscall %s", cSYSCALL_NAMES[Regs->Num]);
- LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3);
- #endif
+ LOG("Arg1: 0x%x, Arg2: 0x%x, Arg3: 0x%x, Arg4: 0x%x", Regs->Arg1, Regs->Arg2, Regs->Arg3, Regs->Arg4);
+ //#endif
switch(Regs->Num)
{
// ---
case SYS_EXECVE:
CHECK_STR_NONULL(Regs->Arg1);
+ //Log(" Regs = {Arg2: %x, Arg3: %x}", Regs->Arg2, Regs->Arg3);
{
int i;
char **tmp = (char**)Regs->Arg2;
// Check ArgV (traverse array checking all string pointers)
CHECK_NUM_NONULL( tmp, sizeof(char**) );
+ //Log("tmp = %p", tmp);
for(i=0;tmp[i];i++) {
- CHECK_NUM_NULLOK( &tmp[i], sizeof(char*) );
+ CHECK_NUM_NONULL( &tmp[i], sizeof(char*) );
CHECK_STR_NONULL( tmp[i] );
}
// Check EnvP also
if( Regs->Arg3 )
{
tmp = (char**)Regs->Arg3;
+ //Log("tmp = %p", tmp);
for(i=0;tmp[i];i++) {
CHECK_NUM_NULLOK( &tmp[i], sizeof(char*) );
CHECK_STR_NONULL( tmp[i] );
break;
// -- Debug
- #if DEBUG_BUILD
+ //#if DEBUG_BUILD
case SYS_DEBUG:
Log((char*)Regs->Arg1,
Regs->Arg2, Regs->Arg3, Regs->Arg4, Regs->Arg5, Regs->Arg6);
break;
- #endif
+ //#endif
// -- Default (Return Error)
default:
ret = -1;
break;
}
+
+ if(err != 0) {
+ LOG("ID: %i, Return errno = %i", Regs->Num, err);
+ }
+
#if BITS < 64
Regs->Return = ret&0xFFFFFFFF;
Regs->RetHi = ret >> 32;
i += 7;
i += System_Int_GetString(fData+i, &sArg1);
if(!sArg1) goto read2eol;
- Log("[CFG ] Load EDI Module '%s'\n", sArg1);
+ Log("[CFG ] Load EDI Module '%s'", sArg1);
Module_LoadFile(sArg1, "");
}
// - Symlink
if(!sArg1) goto read2eol;
i += System_Int_GetString(fData+i, &sArg2);
if(!sArg2) goto read2eol;
- Log("[CFG ] Symlink '%s' pointing to '%s'\n", sArg1, sArg2);
+ Log("[CFG ] Symlink '%s' pointing to '%s'", sArg1, sArg2);
VFS_Symlink(sArg1, sArg2);
}
// - New Directory
i += 6;
i += System_Int_GetString(fData+i, &sArg1);
if(!sArg1) goto read2eol;
- Log("[CFG ] New Directory '%s'\n", sArg1);
+ Log("[CFG ] New Directory '%s'", sArg1);
VFS_MkDir(sArg1);
}
// - Spawn a task
i += 6;
i += System_Int_GetString(fData+i, &sArg1);
if(!sArg1) goto read2eol;
- Log("[CFG ] Starting '%s' as a new task\n", sArg1);
+ Log("[CFG ] Starting '%s' as a new task", sArg1);
Proc_Spawn(sArg1);
}
else {
Warning("Thread #%i committed a segfault at address %p", Proc_GetCurThread()->TID, Addr);
Threads_Exit( 0, -1 );
}
+
+// === EXPORTS ===
+EXPORT(Threads_GetUID);
return max;
}
+
+// === EXPORTS ===
+EXPORT(VFS_Read);
+EXPORT(VFS_Write);
+EXPORT(VFS_ReadAt);
+EXPORT(VFS_WriteAt);
+EXPORT(VFS_IOCtl);
+EXPORT(VFS_Seek);
+EXPORT(VFS_Tell);
if(h->Node == NULL) return NULL;
return h;
}
+
+// === EXPORTS ===
+EXPORT(VFS_Open);
+EXPORT(VFS_Close);
.PHONY: all clean
+MODULES = IPStack
+USRLIBS = ld-acess.so libacess.so libgcc.so libc.so
+USRAPPS = init login CLIShell cat ls mount
+
all:
+ @for mod in $(MODULES); do \
+ (echo === $$mod && $(MAKE) all --no-print-directory -C Modules/$$mod) \
+ done
+
@echo === Kernel
@$(MAKE) all --no-print-directory -C Kernel
- @echo === ld-acess.so
- @$(MAKE) all --no-print-directory -C Usermode/Libraries/ld-acess.so_src
- @echo === libacess.so
- @$(MAKE) all --no-print-directory -C Usermode/Libraries/libacess.so_src
- @echo === libgcc.so
- @$(MAKE) all --no-print-directory -C Usermode/Libraries/libgcc.so_src
- @echo === libc.so
- @$(MAKE) all --no-print-directory -C Usermode/Libraries/libc.so_src
- @echo === init
- @$(MAKE) all --no-print-directory -C Usermode/Applications/init_src
- @echo === login
- @$(MAKE) all --no-print-directory -C Usermode/Applications/login_src
- @echo === CLIShell
- @$(MAKE) all --no-print-directory -C Usermode/Applications/CLIShell_src
- @echo === cat
- @$(MAKE) all --no-print-directory -C Usermode/Applications/cat_src
- @echo === ls
- @$(MAKE) all --no-print-directory -C Usermode/Applications/ls_src
- @echo === mount
- @$(MAKE) all --no-print-directory -C Usermode/Applications/mount_src
+
+ @for lib in $(USRLIBS); do \
+ (echo === $$lib && $(MAKE) all --no-print-directory -C Usermode/Libraries/`echo $$lib`_src) \
+ done
+
+ @for app in $(USRAPPS); do \
+ (echo === $$app && $(MAKE) all --no-print-directory -C Usermode/Applications/`echo $$app`_src) \
+ done
+
+# @echo === ld-acess.so
+# @$(MAKE) all --no-print-directory -C Usermode/Libraries/ld-acess.so_src
+# @echo === libacess.so
+# @$(MAKE) all --no-print-directory -C Usermode/Libraries/libacess.so_src
+# @echo === libgcc.so
+# @$(MAKE) all --no-print-directory -C Usermode/Libraries/libgcc.so_src
+# @echo === libc.so
+# @$(MAKE) all --no-print-directory -C Usermode/Libraries/libc.so_src
+# @echo === init
+# @$(MAKE) all --no-print-directory -C Usermode/Applications/init_src
+# @echo === login
+# @$(MAKE) all --no-print-directory -C Usermode/Applications/login_src
+# @echo === CLIShell
+# @$(MAKE) all --no-print-directory -C Usermode/Applications/CLIShell_src
+# @echo === cat
+# @$(MAKE) all --no-print-directory -C Usermode/Applications/cat_src
+# @echo === ls
+# @$(MAKE) all --no-print-directory -C Usermode/Applications/ls_src
+# @echo === mount
+# @$(MAKE) all --no-print-directory -C Usermode/Applications/mount_src
clean:
@make clean --no-print-directory -C Kernel/
- @make clean --no-print-directory -C Usermode/Libraries/ld-acess.so_src
- @make clean --no-print-directory -C Usermode/Libraries/libacess.so_src
- @make clean --no-print-directory -C Usermode/Libraries/libc.so_src
- @make clean --no-print-directory -C Usermode/Libraries/libgcc.so_src
- @make clean --no-print-directory -C Usermode/Applications/init_src
- @make clean --no-print-directory -C Usermode/Applications/login_src
- @make clean --no-print-directory -C Usermode/Applications/CLIShell_src
- @make clean --no-print-directory -C Usermode/Applications/cat_src
- @make clean --no-print-directory -C Usermode/Applications/ls_src
- @make clean --no-print-directory -C Usermode/Applications/mount_src
+
+ @for lib in $(USRLIBS); do \
+ ($(MAKE) clean --no-print-directory -C Usermode/Libraries/`echo $$lib`_src) \
+ done
+
+ @for app in $(USRAPPS); do \
+ ($(MAKE) clean --no-print-directory -C Usermode/Applications/`echo $$app`_src) \
+ done
+
+# @make clean --no-print-directory -C Usermode/Libraries/ld-acess.so_src
+# @make clean --no-print-directory -C Usermode/Libraries/libacess.so_src
+# @make clean --no-print-directory -C Usermode/Libraries/libc.so_src
+# @make clean --no-print-directory -C Usermode/Libraries/libgcc.so_src
+# @make clean --no-print-directory -C Usermode/Applications/init_src
+# @make clean --no-print-directory -C Usermode/Applications/login_src
+# @make clean --no-print-directory -C Usermode/Applications/CLIShell_src
+# @make clean --no-print-directory -C Usermode/Applications/cat_src
+# @make clean --no-print-directory -C Usermode/Applications/ls_src
+# @make clean --no-print-directory -C Usermode/Applications/mount_src
struct sInterface *Next;
tVFS_Node Node;
tAdapter *Adapter;
- int Type; // 4 for IPv4 and 6 for IPv6
+ int Type; // 0 for disabled, 4 for IPv4 and 6 for IPv6
union {
struct {
tIPv6 Address;
- int SubnetBits;
+ int SubnetBits; //Should this be outside the union?
} IP6;
struct {
if(i == -1)
{
tmp = realloc(gaRegisteredTypes, (giRegisteredTypes+1)*sizeof(*gaRegisteredTypes));
- if(!tmp) Panic("[NET ] Out of heap space!");
+ if(!tmp) {
+ Warning("[NET ] Out of heap space!");
+ return ;
+ }
i = giRegisteredTypes;
giRegisteredTypes ++;
gaRegisteredTypes = tmp;
int tid = Proc_SpawnWorker(); // Create a new worker thread
if(tid < 0) {
- Panic("[NET ] Unable to create watcher thread for '%s'", Adapter->Device);
+ Warning("[NET ] Unable to create watcher thread for '%s'", Adapter->Device);
+ return ;
}
if(tid > 0) {
// Install Handlers
ARP_Initialise();
- // Parse module arguments
- for( i = 0; Arguments[i]; i++ )
+ if(Arguments)
{
- //if(strcmp(Arguments[i], "Device") == '=') {
- //
- //}
+ // Parse module arguments
+ for( i = 0; Arguments[i]; i++ )
+ {
+ //if(strcmp(Arguments[i], "Device") == '=') {
+ //
+ //}
+ }
}
return 1;
return &iface->Node;
}
-static const char *casIOCtls[] = { DRV_IOCTLNAMES, "add_interface", NULL };
+static const char *casIOCtls_Root[] = { DRV_IOCTLNAMES, "add_interface", NULL };
+static const char *casIOCtls_Iface[] = {
+ DRV_IOCTLNAMES,
+ "getset_type",
+ "get_address", "set_address",
+ "getset_subnet",
+ "get_gateway", "set_gateway",
+ NULL
+ };
/**
- * \brief Handles IOCtls for the IPStack root
+ * \brief Handles IOCtls for the IPStack root/interfaces
*/
int IPStack_IOCtl(tVFS_Node *Node, int ID, void *Data)
{
case DRV_IOCTL_LOOKUP:
if( !CheckString( Data ) ) return -1;
- return LookupString( (char**)casIOCtls, (char*)Data );
-
- // --- Non-Standard IOCtls ---
- /*
- * add_interface
- * - Adds a new IP interface and binds it to a device
- */
- case 4:
- if( !CheckString( Data ) ) return -1;
- return IPStack_AddInterface(Data);
+
+ if( Node == &gIP_DriverInfo.RootNode )
+ return LookupString( (char**)casIOCtls_Root, (char*)Data );
+ else
+ return LookupString( (char**)casIOCtls_Iface, (char*)Data );
+ }
+
+ if(Node == &gIP_DriverInfo.RootNode)
+ {
+ switch(ID)
+ {
+ /*
+ * add_interface
+ * - Adds a new IP interface and binds it to a device
+ */
+ case 4:
+ if( Threads_GetUID() != 0 ) return -1;
+ if( !CheckString( Data ) ) return -1;
+ return IPStack_AddInterface(Data);
+ }
+ return 0;
}
+ else
+ {
+ tInterface *iface = (tInterface*)Node->ImplPtr;
+ switch(ID)
+ {
+ /*
+ * getset_type
+ * - Get/Set the interface type
+ */
+ case 4:
+ // Get Type?
+ if( !Data ) return iface->Type;
+ // Ok, it's set type
+ if( Threads_GetUID() != 0 ) return -1;
+ if( !CheckMem( Data, sizeof(int) ) ) return -1;
+ switch( *(int*)Data )
+ {
+ case 0: // Disable
+ iface->Type = 0;
+ memset(&iface->IP6, 0, sizeof(tIPv6)); // Clear address
+ break;
+ case 4: // IPv4
+ iface->Type = 4;
+ memset(&iface->IP4, 0, sizeof(tIPv4));
+ break;
+ case 6: // IPv6
+ iface->Type = 6;
+ memset(&iface->IP6, 0, sizeof(tIPv6));
+ break;
+ default:
+ return -1;
+ }
+ return 0;
+
+ /*
+ * get_address
+ * - Get the interface's address
+ */
+ case 5:
+ switch(iface->Type)
+ {
+ case 0: return 1;
+ case 4:
+ if( !CheckMem( Data, sizeof(tIPv4) ) ) return -1;
+ memcpy( Data, &iface->IP4, sizeof(tIPv4) );
+ return 1;
+ case 6:
+ if( !CheckMem( Data, sizeof(tIPv6) ) ) return -1;
+ memcpy( Data, &iface->IP6, sizeof(tIPv6) );
+ return 1;
+ }
+ return 0;
+
+ /*
+ * set_address
+ * - Get the interface's address
+ */
+ case 6:
+ if( Threads_GetUID() != 0 ) return -1;
+ switch(iface->Type)
+ {
+ case 0: return 1;
+ case 4:
+ if( !CheckMem( Data, sizeof(tIPv4) ) ) return -1;
+ iface->Type = 0; // One very hacky mutex/trash protector
+ memcpy( &iface->IP4, Data, sizeof(tIPv4) );
+ iface->Type = 4;
+ return 1;
+ case 6:
+ if( !CheckMem( Data, sizeof(tIPv6) ) ) return -1;
+ iface->Type = 0;
+ memcpy( &iface->IP6, Data, sizeof(tIPv6) );
+ iface->Type = 6;
+ return 1;
+ }
+ return 0;
+
+ /*
+ * getset_subnet
+ * - Get/Set the bits in the address subnet
+ */
+ case 7:
+ // Get?
+ if( Data == NULL )
+ {
+ switch( iface->Type )
+ {
+ case 4: return iface->IP4.SubnetBits;
+ case 6: return iface->IP6.SubnetBits;
+ default: return 0;
+ }
+ }
+
+ // Ok, set.
+ if( Threads_GetUID() != 0 ) return -1;
+ if( !CheckMem(Data, sizeof(int)) ) return -1;
+
+ // Check and set the subnet bits
+ switch( iface->Type )
+ {
+ case 4:
+ if( *(int*)Data < 0 || *(int*)Data > 31 ) return -1;
+ iface->IP4.SubnetBits = *(int*)Data;
+ return iface->IP4.SubnetBits;
+ case 6:
+ if( *(int*)Data < 0 || *(int*)Data > 127 ) return -1;
+ iface->IP6.SubnetBits = *(int*)Data;
+ return iface->IP6.SubnetBits;
+ default:
+ break;
+ }
+
+ return 0;
+ }
+ }
+
return 0;
}
@echo --- $(LD) -o $@
@$(LD) -T ../link.ld -shared -nostdlib -o $@ $(OBJ)
# @$(LD) -shared -nostdlib -o $@ $(OBJ)
+ cp $@ $(DISTROOT)/Modules/$(NAME).kmd
@echo --- $(LD) -o $(KOBJ)
@$(CC) -Wl,-r -nostdlib -o $(KOBJ) $(OBJ)
all: $(BIN)
clean:
- $(RM) $(BIN) $(OBJ)
+ $(RM) $(BIN) $(OBJ) $(BIN).dsm
$(BIN): $(OBJ) Makefile
- $(LD) $(LDFLAGS) $(OBJ) -o $(BIN)
+ @echo --- ld -o $(BIN)
+ @$(LD) $(LDFLAGS) $(OBJ) -o $(BIN)
+ $(OBJDUMP) -d $(BIN) > $(BIN).dsm
cp $(BIN) $(DISTROOT)/SBin/
%.o: %.c
- $(CC) $(CFLAGS) -c $< -o $@
+ @echo --- cc -o $@
+ @$(CC) $(CFLAGS) -c $< -o $@
// === CONSTANTS ===
#define NULL ((void*)0)
-#define NUM_TERMS 4
+#define NUM_TERMS 1
#define DEFAULT_TERMINAL "/Devices/VTerm/0"
#define DEFAULT_SHELL "/Acess/SBin/login"
int main(int argc, char *argv[])
{
int tid;
- // int i;
- char termpath[sizeof(DEFAULT_TERMINAL)+1] = DEFAULT_TERMINAL;
+ int i;
+ char termpath[sizeof(DEFAULT_TERMINAL)] = DEFAULT_TERMINAL;
+ char *child_argv[2] = {DEFAULT_SHELL, 0};
- //for( i = 0; i < NUM_TERMS; i++ )
- //{
- //termpath[ sizeof(DEFAULT_TERMINAL)-1 ] = '0' + i;
- open(termpath, OPENFLAG_READ); // Stdin
- open(termpath, OPENFLAG_WRITE); // Stdout
- open(termpath, OPENFLAG_WRITE); // Stderr
-
+ for( i = 0; i < NUM_TERMS; i++ )
+ {
tid = clone(CLONE_VM, 0);
if(tid == 0)
{
- execve(DEFAULT_SHELL, NULL, NULL);
- for(;;) __asm__ __volatile__("hlt");
+ termpath[sizeof(DEFAULT_TERMINAL)-2] = '0' + i;
+
+ //__asm__ __volatile__ ("int $0xAC" :: "a" (256), "b" ("%s"), "c" (termpath));
+
+ open(termpath, OPENFLAG_READ); // Stdin
+ open(termpath, OPENFLAG_WRITE); // Stdout
+ open(termpath, OPENFLAG_WRITE); // Stderr
+ execve(DEFAULT_SHELL, child_argv, NULL);
+ for(;;) sleep();
}
- //}
+ }
+ // TODO: Implement message watching
for(;;) sleep();
return 42;
-include ../../../Makefile.cfg
+MAKEDEP = $(CC) -M
+
ASFLAGS = -felf
CPPFLAGS = -I../../include/
CFLAGS = -Wall -fPIC -fno-builtin -fno-stack-protector $(CPPFLAGS)
$(BIN): $(OBJ)
@echo --- $(LD) -shared -o $@
@$(LD) $(LDFLAGS) -o $(BIN) $(OBJ)
- $(STRIP) $(BIN)
+ @$(STRIP) $(BIN)
cp $(BIN) $(DISTROOT)/Libs
%.ao: %.asm syscalls.inc.asm
[extern _errno]
[section .text]
-SYSCALL0 _SysGetPhys, SYS_GETPHYS ; uint64_t _SysGetPhys(uint addr)
+SYSCALL1 _SysGetPhys, SYS_GETPHYS ; uint64_t _SysGetPhys(uint addr)
SYSCALL1 _SysAllocate, SYS_ALLOCATE ; uint64_t _SysAllocate(uint addr)
SYSCALL2 open, SYS_OPEN ; char*, int
SYSCALL3 reopen, SYS_REOPEN ; int, char*, int
SYSCALL1 close, SYS_CLOSE ; int
-SYSCALL4 read, SYS_READ ; int, int64_t, void*
-SYSCALL4 write, SYS_WRITE ; int, int64_t, void*
-SYSCALL4 seek, SYS_SEEK ; int, int64_t, int
+SYSCALL3 read, SYS_READ ; int, uint, void*
+SYSCALL3 write, SYS_WRITE ; int, uint, void*
+SYSCALL4 seek, SYS_SEEK ; int, uint64_t, int
SYSCALL1 tell, SYS_TELL ; int
SYSCALL3 finfo, SYS_FINFO ; int, void*, int
SYSCALL2 readdir, SYS_READDIR ; int, char*
ASFLAGS +=\r
LDFLAGS += -soname libc.so.1 -Map map.txt -lgcc\r
\r
-OBJ_LIBC = heap.o stdlib.o stub.o env.o fileIO.o string.o\r
+OBJ = stub.o heap.o stdlib.o env.o fileIO.o string.o\r
+DEPFILES := $(OBJ:%.o=%.d)\r
# signals.o\r
BIN = ../libc.so.1\r
\r
.PHONY: all clean\r
\r
-all: $(BIN) $(OBJ_LIBC)\r
+all: $(BIN)\r
\r
clean:\r
- $(RM) $(BIN) ../libc.so $(OBJ_LIBC) libc.so.1.dsm libc.so.1.dmp map.txt\r
+ $(RM) $(BIN) ../libc.so $(OBJ) $(DEPFILES) libc.so.1.dsm libc.so.1.dmp map.txt\r
\r
# Core C Library\r
-$(BIN): $(OBJ_LIBC)\r
+$(BIN): $(OBJ)\r
@echo --- ld -shared -o $@\r
- @$(LD) $(LDFLAGS) $(OBJ_LIBC) -o $@\r
- $(OBJDUMP) -d $@ > libc.so.1.dsm\r
- $(OBJDUMP) -x -r -R $@ > libc.so.1.dmp\r
+ @$(LD) $(LDFLAGS) $(OBJ) -o $@\r
+ @$(OBJDUMP) -d $@ > libc.so.1.dsm\r
+ @$(OBJDUMP) -x -r -R $@ > libc.so.1.dmp\r
cp ../libc.so.1 ../libc.so\r
cp ../libc.so.1 $(DISTROOT)/Libs/\r
\r
@echo --- $(AS) -o $@\r
@$(AS) $(ASFLAGS) -o $@ $<\r
\r
-$(filter %.o, $(OBJ_LIBC)): %.o: %.c config.h\r
+$(filter %.o, $(OBJ)): %.o: %.c\r
@echo --- $(CC) -o $@\r
@$(CC) $(CFLAGS) -DBUILD_SO -o $@ -c $<\r
+ @$(MAKEDEP) $(CPPFLAGS) -MT $@ -o $*.d $<\r
\r
-$(filter %.ao, $(OBJ_LIBC)): %.ao: %.asm\r
+$(filter %.ao, $(OBJ)): %.ao: %.asm\r
@echo --- $(AS) -o $@\r
@$(AS) $(ASFLAGS) -o $@ $<\r
*/\r
EXPORT void free(void *mem)\r
{\r
- heap_head *head = mem;\r
+ heap_head *head = (void*)((intptr_t)mem-sizeof(heap_head));\r
+ \r
+ // Sanity please!\r
+ if(!mem) return;\r
\r
if(head->magic != MAGIC) //Valid Heap Address\r
return;\r
head->magic = MAGIC_FREE;\r
\r
//Unify Right\r
- if((Uint)head + head->size < (Uint)_heap_end)\r
+ if((intptr_t)head + head->size < (intptr_t)_heap_end)\r
{\r
- heap_head *nextHead = (heap_head*)((Uint)head + head->size);\r
+ heap_head *nextHead = (heap_head*)((intptr_t)head + head->size);\r
if(nextHead->magic == MAGIC_FREE) { //Is the next block free\r
head->size += nextHead->size; //Amalgamate\r
nextHead->magic = 0; //For Security\r
}\r
}\r
//Unify Left\r
- if((Uint)head - sizeof(heap_foot) > (Uint)_heap_start)\r
+ if((intptr_t)head - sizeof(heap_foot) > (intptr_t)_heap_start)\r
{\r
heap_head *prevHead;\r
- heap_foot *prevFoot = (heap_foot *)((Uint)head - sizeof(heap_foot));\r
+ heap_foot *prevFoot = (heap_foot *)((intptr_t)head - sizeof(heap_foot));\r
if(prevFoot->magic == MAGIC) {\r
prevHead = prevFoot->header;\r
if(prevHead->magic == MAGIC_FREE) {\r
*/\r
static void *FindHeapBase()\r
{\r
+ #if 0\r
#define MAX 0xC0000000 // Address\r
#define THRESHOLD 512 // Pages\r
uint addr;\r
uint stretch = 0;\r
+ uint64_t tmp;\r
\r
// Scan address space\r
for(addr = 0;\r
addr += 0x1000\r
)\r
{\r
- if( _SysGetPhys(addr) == 0 ) {\r
+ tmp = _SysGetPhys(addr);\r
+ if( tmp != 0 ) {\r
stretch = 0;\r
} else {\r
stretch ++;\r
if(stretch > THRESHOLD)\r
{\r
- return (void*)( addr + stretch*0x1000 );\r
+ return (void*)( addr - stretch*0x1000 );\r
}\r
}\r
+ //__asm__ __volatile__ (\r
+ // "push %%ebx;mov %%edx,%%ebx;int $0xAC;pop %%ebx"\r
+ // ::"a"(256),"d"("%x"),"c"(addr));\r
}\r
+ \r
return NULL;\r
+ #else\r
+ return (void*)0x00900000;\r
+ #endif\r
}\r
\r
LOCAL uint brk(Uint newpos)\r
#include "stdio_int.h"\r
#include "lib.h"\r
\r
+#define USE_CPUID 0\r
+\r
// === PROTOTYPES ===\r
+#if USE_CPUID\r
static void cpuid(uint32_t Num, uint32_t *EAX, uint32_t *EBX, uint32_t *EDX, uint32_t *ECX);\r
+#endif\r
\r
// === GLOBALS ===\r
extern char **_envp;\r
extern struct sFILE *stdout;\r
extern struct sFILE *stderr;\r
// --- CPU Features ---\r
+#if USE_CPUID\r
tCPUID gCPU_Features;\r
+#endif\r
\r
// === CODE ===\r
/**\r
stderr = &_iob[2];\r
stderr->FD = 2; stderr->Flags = FILE_FLAG_MODE_WRITE;\r
\r
- /*\r
+ #if USE_CPUID\r
{\r
uint32_t ecx, edx;\r
cpuid(1, NULL, NULL, &edx, &ecx);\r
gCPU_Features.SSE = edx & (1 << 25); // SSE\r
gCPU_Features.SSE2 = edx & (1 << 26); // SSE2\r
}\r
- */\r
+ #endif\r
\r
return 1;\r
}\r
\r
\r
+#if USE_CPUID\r
/**\r
* \brief Call the CPUID opcode\r
*/\r
if(EDX) *EDX = edx;\r
if(ECX) *ECX = ecx;\r
}\r
+#endif\r
extern int open(const char *path, int flags);
extern int reopen(int fd, const char *path, int flags);
extern void close(int fd);
-extern uint64_t read(int fd, uint64_t length, void *buffer);
-extern uint64_t write(int fd, uint64_t length, void *buffer);
+extern uint read(int fd, uint length, void *buffer);
+extern uint write(int fd, uint length, void *buffer);
extern int seek(int fd, uint64_t offset, int whence);
extern uint64_t tell(int fd);
extern int ioctl(int fd, int id, void *data);