diff --git a/KernelLand/Kernel/GenSyscalls.php b/KernelLand/Kernel/GenSyscalls.php deleted file mode 100644 index d451d1dd89175db4fb96f56b53cca21a84ee7fd0..0000000000000000000000000000000000000000 --- a/KernelLand/Kernel/GenSyscalls.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php -$gLines = file("syscalls.lst"); - -$lSyscalls = array(); -$i = 0; -foreach($gLines as $line) -{ - $line = trim($line); - if(empty($line)) continue; - - if( intVal($line) != 0) - $i = $line; - else - $lSyscalls[$i++] = explode("\t", $line, 3); -} -$lMax = $i; - -$lAsmInc = "; Acess2 -; System Calls List -; - -"; -$lHeader = "/* - * AcessOS Microkernel Version - * syscalls.h - */ -#ifndef _SYSCALLS_H -#define _SYSCALLS_H - -"; -$i = 0; -foreach($lSyscalls as $num=>$call) -{ - if($i != $num) { - $lHeader .= "\n"; - $lAsmInc .= "\n"; - } - - $lHeader .= "#define {$call[0]}\t{$num}"; - $lHeader .= "\t// {$num} - {$call[1]}\n"; - - $lAsmInc .= "%define {$call[0]}\t{$num}\t; {$call[1]}\n"; - - - if($i != $num) - $i = $num+1; - else - $i ++; -} -$lHeader .= "#define NUM_SYSCALLS\t$i\n"; -$lHeader .= "#define SYS_DEBUG\t0x100 // 0x100 - Print a debug string\n"; -$lHeader .= "\n"; -$lHeader .= "#ifdef __GNUC__\n"; -$lHeader .= "static const char *cSYSCALL_NAMES[] = {\n\t"; - -$j = 0; -for($i=0;$i<$lMax;$i++) -{ - if(!isset($lSyscalls[$i])) - $lHeader .= "\"\","; - else - $lHeader .= "\"".$lSyscalls[$i][0]."\","; - $j ++; - if($j == 6) { - $lHeader .= "\n\t"; - $j = 0; - } -} -$lHeader .= "\"\"\n};\n" -$lHeader .= "#endif\n"; -$lHeader .= "#endif\n"; - -$fp = fopen("include/syscalls.h", "w"); fwrite($fp, $lHeader); fclose($fp); -$fp = fopen("include/syscalls.inc.asm", "w"); fwrite($fp, $lAsmInc); fclose($fp); - -?> diff --git a/KernelLand/Modules/Filesystems/InitRD/GenerateInitRD.php b/KernelLand/Modules/Filesystems/InitRD/GenerateInitRD.php deleted file mode 100644 index 52377e6fed5179eec5558f67ce8f3e45e61e4fef..0000000000000000000000000000000000000000 --- a/KernelLand/Modules/Filesystems/InitRD/GenerateInitRD.php +++ /dev/null @@ -1,247 +0,0 @@ -<?php -date_default_timezone_set("UTC"); - -$lGenDate = date("Y-m-d H:i"); -$gOutput = <<<EOF -/* - * Acess2 InitRD - * InitRD Data - * Generated $lGenDate - */ -#include "initrd.h" - -EOF; - -define("DEBUG_ENABLED", false); - -$ACESSDIR = getenv("ACESSDIR"); -$ARCH = getenv("ARCH"); - -$gInputFile = $argv[1]; -$gOutputFile = $argv[2]; -$gOutputLDOptsFile = $argv[3]; -$gDepFile = ($argc > 4 ? $argv[4] : false); - -$gDependencies = array(); - -$lines = file($argv[1]); - -$lDepth = 0; -$lTree = array(); -$lStack = array( array("",array()) ); -foreach($lines as $line) -{ - $line = trim($line); - if($line == "" || $line[0] == "#") continue; - // Directory - if(preg_match('/^Dir\s+"([^"]+)"\s+{$/', $line, $matches)) - { - $new = array($matches[1], array()); - array_push($lStack, $new); - $lDepth ++; - } - // End of a block - elseif($line == "}") - { - $lDepth --; - $lStack[$lDepth][1][] = array_pop($lStack); - } - // File - elseif(preg_match('/^((?:Opt)?)File\s+"([^"]+)"(?:\s+"([^"]+)")?$/', $line, $matches)) - { - $isOptional = $matches[1]; - $dstfile = $matches[2]; - $path = isset($matches[3]) ? $matches[3] : ""; - - if( $path == "" ) { - $path = $dstfile; - $dstfile = basename($dstfile); - } - - // Parse path components - $path = str_replace("__EXT__", "$ACESSDIR/Externals/Output/$ARCH", $path); - $path = str_replace("__BIN__", "$ACESSDIR/Usermode/Output/$ARCH", $path); - $path = str_replace("__FS__", "$ACESSDIR/Usermode/Filesystem", $path); - $path = str_replace("__SRC__", "$ACESSDIR", $path); - - $gDependencies[] = $path; - - if( !file_exists($path) ) - { - if( $isOptional == "" ) - { - // Oops - echo "ERROR: '{$path}' does not exist\n", - exit(1); - } - else - { - // optional file - } - } - else - { - $lStack[$lDepth][1][] = array($dstfile, $path, $isOptional); - } - } - else - { - echo "ERROR: $line\n"; - exit(0); - } -} - -function hd($fp) -{ - //return "0x".str_pad( dechex(ord(fgetc($fp))), 8, "0", STR_PAD_LEFT ); - $val = unpack("I", fread($fp, 4)); - //print_r($val); exit -1; - return "0x".dechex($val[1]); -} - -function hd8($fp) -{ - return "0x".str_pad( dechex(ord(fgetc($fp))), 2, "0", STR_PAD_LEFT ); -} - -$inode = 0; -$gSymFiles = array(); -function ProcessFolder($prefix, $items) -{ - global $gOutput, $gDependencies; - global $ACESSDIR, $ARCH; - global $inode; - global $gSymFiles; - foreach($items as $i=>$item) - { - $inode ++; - if(is_array($item[1])) - { - ProcessFolder("{$prefix}_{$i}", $item[1]); - - $gOutput .= "tInitRD_File {$prefix}_{$i}_entries[] = {\n"; - foreach($item[1] as $j=>$child) - { - if($j) $gOutput .= ",\n"; - $gOutput .= "\t{\"".addslashes($child[0])."\",&{$prefix}_{$i}_{$j}}"; - } - $gOutput .= "\n};\n"; - - $size = count($item[1]); - $gOutput .= <<<EOF -tVFS_Node {$prefix}_{$i} = { - .NumACLs = 1, - .ACLs = &gVFS_ACL_EveryoneRX, - .Flags = VFS_FFLAG_DIRECTORY, - .Size = $size, - .Inode = {$inode}, - .ImplPtr = {$prefix}_{$i}_entries, - .Type = &gInitRD_DirType -}; - -EOF; - } - else - { - $path = $item[1]; - - if( DEBUG_ENABLED ) - echo $path,"\n"; - $size = filesize($path); - - $_sym = "_binary_".str_replace(array("/","-",".","+"), "_", $path)."_start"; - $gOutput .= "extern Uint8 {$_sym}[];"; - $gSymFiles[] = $path; - $gOutput .= <<<EOF -tVFS_Node {$prefix}_{$i} = { - .NumACLs = 1, - .ACLs = &gVFS_ACL_EveryoneRX, - .Flags = 0, - .Size = $size, - .Inode = {$inode}, - .ImplPtr = $_sym, - .Type = &gInitRD_FileType -}; - -EOF; - } - } -} - -//print_r($lStack); -//exit(1); - -ProcessFolder("gInitRD_Files", $lStack[0][1]); - -$gOutput .= "tInitRD_File gInitRD_Root_Files[] = {\n"; -foreach($lStack[0][1] as $j=>$child) -{ - if($j) $gOutput .= ",\n"; - $gOutput .= "\t{\"".addslashes($child[0])."\",&gInitRD_Files_{$j}}"; -} -$gOutput .= "\n};\n"; -$nRootFiles = count($lStack[0][1]); -$gOutput .= <<<EOF -tVFS_Node gInitRD_RootNode = { - .NumACLs = 1, - .ACLs = &gVFS_ACL_EveryoneRX, - .Flags = VFS_FFLAG_DIRECTORY, - .Size = $nRootFiles, - .ImplPtr = gInitRD_Root_Files, - .Type = &gInitRD_DirType -}; -EOF; - -$gOutput .= <<<EOF - -tVFS_Node * const gInitRD_FileList[] = { -&gInitRD_RootNode -EOF; - -function PutNodePointers($prefix, $items) -{ - global $gOutput; - foreach($items as $i=>$item) - { - $gOutput .= ",&{$prefix}_{$i}"; - if(is_array($item[1])) - { - PutNodePointers("{$prefix}_{$i}", $item[1]); - } - } -} - -PutNodePointers("gInitRD_Files", $lStack[0][1]); - -$gOutput .= <<<EOF -}; -const int giInitRD_NumFiles = sizeof(gInitRD_FileList)/sizeof(gInitRD_FileList[0]); - -EOF; - - -$fp = fopen($gOutputFile, "w"); -fputs($fp, $gOutput); -fclose($fp); - -// - Create options call -$fp = fopen($gOutputLDOptsFile, "w"); -fputs($fp, "--format binary\n"); -foreach($gSymFiles as $sym=>$file) -{ - fputs($fp, "$file\n"); -// fputs($fp, "--defsym $sym=_binary_".$sym_filename."_start\n"); -} -fclose($fp); - -if($gDepFile !== false) -{ - $fp = fopen($gDepFile, "w"); - $line = $gOutputFile.":\t".implode(" ", $gDependencies)."\n"; - fputs($fp, $line); - foreach( $gDependencies as $dep ) - fputs($fp, "$dep: \n"); - fclose($fp); -} - -?> diff --git a/KernelLand/Modules/Filesystems/InitRD/generate_initrd.c b/KernelLand/Modules/Filesystems/InitRD/generate_initrd.c index 49cd41f5cf98c41457acad99b0a1f514cc994af1..a2c12409b29f9d8b163aa225ba8acbcf52e554ef 100644 --- a/KernelLand/Modules/Filesystems/InitRD/generate_initrd.c +++ b/KernelLand/Modules/Filesystems/InitRD/generate_initrd.c @@ -19,11 +19,6 @@ enum eToken { TOK_STRING, }; -struct sPath { - const struct sPath* prev; - const char* name; -}; - struct sLexer { FILE* file; enum eToken last_tok; @@ -34,8 +29,11 @@ typedef struct sLexer tLexer; struct sOutState { unsigned int next_inode_idx; FILE* out_c; - FILE* out_dep; FILE* out_ldopts; + + //FILE* out_dep; + char** dependencies; + unsigned int num_dependencies; }; typedef struct sOutState tOutState; @@ -56,8 +54,9 @@ char* Lex_ConsumeYield(struct sLexer* lex); void Lex_Error(struct sLexer* lex, const char* message); void Lex_Expect(struct sLexer* lex, enum eToken exp); -void ProcessDir(struct sLexer* lex, tOutState* os, unsigned int inode, enum eToken end, const struct sPath* parent_path); -void AddFile(tOutState* os, tDirEnts* dents, bool is_opt, const struct sPath* dir_path, const char* name, const char* path); +void ProcessDir(struct sLexer* lex, tOutState* os, unsigned int inode, enum eToken end); +void AddFile(tOutState* os, tDirEnts* dents, bool is_opt, const char* name, const char* path); +char* strdup(const char* s); int main(int argc, const char *argv[]) { @@ -99,8 +98,9 @@ int main(int argc, const char *argv[]) tOutState os = { 1, fopen(outfile_c, "w"), - fopen(outfile_dep, "w"), fopen(outfile_ldopts, "w"), + //fopen(outfile_dep, "w"), + NULL, 0, }; fprintf(os.out_c, @@ -115,21 +115,32 @@ int main(int argc, const char *argv[]) fprintf(os.out_ldopts, "--format binary\n"); - struct sPath path = {NULL, ""}; - ProcessDir(&lex, &os, 0, TOK_EOF, &path); + ProcessDir(&lex, &os, 0, TOK_EOF); - fprintf(os.out_c, - "tVFS_Node * const gInitRD_FileList[] = {" - //"&gInitRD_RootNode" - ); + // --- Finalize the C file (node list) + fprintf(os.out_c, "tVFS_Node * const gInitRD_FileList[] = {"); for(unsigned int i = 0; i < os.next_inode_idx; i ++ ) fprintf(os.out_c, "&INITRD_%u, ", i); fprintf(os.out_c, "};\n"); + // --- Close running output files fclose(os.out_c); - fclose(os.out_dep); fclose(os.out_ldopts); + // --- Write the dependency file + FILE* depfile = fopen(outfile_dep, "w"); + assert(depfile); + fprintf(depfile, "%s:", outfile_c); + for(unsigned int i = 0; i < os.num_dependencies; i ++) + fprintf(depfile, " %s", os.dependencies[i]); + fprintf(depfile, "\n"); + for(unsigned int i = 0; i < os.num_dependencies; i ++) { + fprintf(depfile, "%s:\n", os.dependencies[i]); + free(os.dependencies[i]); + } + free(os.dependencies); + fclose(depfile); + return 0; } @@ -140,10 +151,11 @@ void add_dir_ent(tDirEnts* dents, const char* name, unsigned int inode) { dents->num_ents += 1; dents->ents = realloc( dents->ents, sizeof(tDirEnt*) * dents->num_ents ); + assert(dents->ents); dents->ents[dents->num_ents-1] = de; } -void ProcessDir(struct sLexer* lex, tOutState* os, unsigned int inode, enum eToken end, const struct sPath* parent_path) +void ProcessDir(struct sLexer* lex, tOutState* os, unsigned int inode, enum eToken end) { tDirEnts dents = { 0, NULL }; while( lex->last_tok != end ) @@ -164,8 +176,7 @@ void ProcessDir(struct sLexer* lex, tOutState* os, unsigned int inode, enum eTok unsigned int child_inode = os->next_inode_idx ++; - struct sPath path = {parent_path, name}; - ProcessDir(lex, os, child_inode, TOK_BRACE_CLOSE, &path); + ProcessDir(lex, os, child_inode, TOK_BRACE_CLOSE); add_dir_ent(&dents, name, child_inode); @@ -187,7 +198,7 @@ void ProcessDir(struct sLexer* lex, tOutState* os, unsigned int inode, enum eTok } Lex_Expect(lex, TOK_NEWLINE); - AddFile(os, &dents, is_optional, parent_path, name, path); + AddFile(os, &dents, is_optional, name, path); free(name); free(path); @@ -296,7 +307,7 @@ size_t ld_mangle(char* out, const char* in) { return rv; } -void AddFile(tOutState* os, tDirEnts* dents, bool is_opt, const struct sPath* dir_path, const char* name, const char* path) +void AddFile(tOutState* os, tDirEnts* dents, bool is_opt, const char* name, const char* path) { char* realpath; { @@ -344,7 +355,12 @@ void AddFile(tOutState* os, tDirEnts* dents, bool is_opt, const struct sPath* di , node_idx, file_size, node_idx, binary_sym ); free(binary_sym); - free(realpath); + + os->num_dependencies += 1; + os->dependencies = realloc( os->dependencies, sizeof(*os->dependencies) * os->num_dependencies ); + assert(os->dependencies); + os->dependencies[os->num_dependencies-1] = realpath; + //free(realpath); add_dir_ent(dents, name, node_idx); } @@ -379,6 +395,7 @@ enum eToken get_token_int(FILE* ifp, char** string) while( isalnum(ch) ) { len += 1; s = realloc(s, len+1); + assert(s); s[len-1] = ch; ch = fgetc(ifp); @@ -393,6 +410,7 @@ enum eToken get_token_int(FILE* ifp, char** string) { len += 1; s = realloc(s, len+1); + assert(s); s[len-1] = ch; } s[len] = '\0'; @@ -445,6 +463,7 @@ char* Lex_ConsumeYield(struct sLexer* lex) } void Lex_Error(struct sLexer* lex, const char* string) { + (void)lex; fprintf(stderr, "Parse error: %s\n", string); exit(1); } @@ -456,3 +475,12 @@ void Lex_Expect(struct sLexer* lex, enum eToken exp) } } +char* strdup(const char* s) +{ + char* rv = malloc(strlen(s) + 1); + if( rv == NULL ) + return NULL; + strcpy(rv, s); + return rv; +} +