<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>UbixOS V2: src/sys/kernel/exec.c Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.4.7 --> <div class="tabs"> <ul> <li><a href="main.html"><span>Main Page</span></a></li> <li><a href="classes.html"><span>Data Structures</span></a></li> <li id="current"><a href="files.html"><span>Files</span></a></li> <li><a href="dirs.html"><span>Directories</span></a></li> <li> <form action="search.php" method="get"> <table cellspacing="0" cellpadding="0" border="0"> <tr> <td><label> <u>S</u>earch for </label></td> <td><input type="text" name="query" value="" size="20" accesskey="s"/></td> </tr> </table> </form> </li> </ul></div> <div class="tabs"> <ul> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>Globals</span></a></li> </ul></div> <div class="nav"> <a class="el" href="dir_897b6a2d7bab147dd1db58381aad3984.html">src</a> » <a class="el" href="dir_832905b1f7f5feaf61a306b40c0ac817.html">sys</a> » <a class="el" href="dir_7efffd2b1fae7bb6f2aa85845c863494.html">kernel</a></div> <h1>exec.c</h1><a href="exec_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*****************************************************************************************</span> <a name="l00002"></a>00002 <span class="comment"> Copyright (c) 2002-2004 The UbixOS Project</span> <a name="l00003"></a>00003 <span class="comment"> All rights reserved.</span> <a name="l00004"></a>00004 <span class="comment"></span> <a name="l00005"></a>00005 <span class="comment"> Redistribution and use in source and binary forms, with or without modification, are</span> <a name="l00006"></a>00006 <span class="comment"> permitted provided that the following conditions are met:</span> <a name="l00007"></a>00007 <span class="comment"></span> <a name="l00008"></a>00008 <span class="comment"> Redistributions of source code must retain the above copyright notice, this list of</span> <a name="l00009"></a>00009 <span class="comment"> conditions, the following disclaimer and the list of authors. Redistributions in binary</span> <a name="l00010"></a>00010 <span class="comment"> form must reproduce the above copyright notice, this list of conditions, the following</span> <a name="l00011"></a>00011 <span class="comment"> disclaimer and the list of authors in the documentation and/or other materials provided</span> <a name="l00012"></a>00012 <span class="comment"> with the distribution. Neither the name of the UbixOS Project nor the names of its</span> <a name="l00013"></a>00013 <span class="comment"> contributors may be used to endorse or promote products derived from this software</span> <a name="l00014"></a>00014 <span class="comment"> without specific prior written permission.</span> <a name="l00015"></a>00015 <span class="comment"></span> <a name="l00016"></a>00016 <span class="comment"> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY</span> <a name="l00017"></a>00017 <span class="comment"> EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF</span> <a name="l00018"></a>00018 <span class="comment"> MERCHANTABILITY AND F</span> <a name="l00019"></a>00019 <span class="comment">ITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL</span> <a name="l00020"></a>00020 <span class="comment"> THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span> <a name="l00021"></a>00021 <span class="comment"> SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT</span> <a name="l00022"></a>00022 <span class="comment"> OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</span> <a name="l00023"></a>00023 <span class="comment"> HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR</span> <a name="l00024"></a>00024 <span class="comment"> TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS</span> <a name="l00025"></a>00025 <span class="comment"> SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span> <a name="l00026"></a>00026 <span class="comment"></span> <a name="l00027"></a>00027 <span class="comment"> $Id: exec_8c-source.html 88 2016-01-12 00:11:29Z reddawg $</span> <a name="l00028"></a>00028 <span class="comment"></span> <a name="l00029"></a>00029 <span class="comment">*****************************************************************************************/</span> <a name="l00030"></a>00030 <a name="l00031"></a>00031 <span class="preprocessor">#include <<a class="code" href="exec_8h.html">ubixos/exec.h</a>></span> <a name="l00032"></a>00032 <span class="preprocessor">#include <<a class="code" href="elf_8h.html">ubixos/elf.h</a>></span> <a name="l00033"></a>00033 <span class="preprocessor">#include <<a class="code" href="ld_8h.html">ubixos/ld.h</a>></span> <a name="l00034"></a>00034 <span class="preprocessor">#include <<a class="code" href="kpanic_8h.html">ubixos/kpanic.h</a>></span> <a name="l00035"></a>00035 <span class="preprocessor">#include <<a class="code" href="endtask_8h.html">ubixos/endtask.h</a>></span> <a name="l00036"></a>00036 <span class="preprocessor">#include <<a class="code" href="vmm_8h.html">vmm/vmm.h</a>></span> <a name="l00037"></a>00037 <span class="preprocessor">#include <<a class="code" href="kmalloc_8h.html">lib/kmalloc.h</a>></span> <a name="l00038"></a>00038 <span class="preprocessor">#include <<a class="code" href="kprintf_8h.html">lib/kprintf.h</a>></span> <a name="l00039"></a>00039 <span class="preprocessor">#include <<a class="code" href="lib_2string_8h.html">lib/string.h</a>></span> <a name="l00040"></a>00040 <span class="preprocessor">#include <<a class="code" href="assert_8h.html">assert.h</a>></span> <a name="l00041"></a>00041 <a name="l00042"></a><a class="code" href="exec_8c.html#d93dccba62fb5241c0b7cebcd097794a">00042</a> <span class="preprocessor">#define STACK_ADDR 0xC800000</span> <a name="l00043"></a>00043 <span class="preprocessor"></span> <a name="l00044"></a>00044 <span class="comment">/*****************************************************************************************</span> <a name="l00045"></a>00045 <span class="comment"></span> <a name="l00046"></a>00046 <span class="comment"> Function: execThread(void (*)(void),int,char *);</span> <a name="l00047"></a>00047 <span class="comment"> Description: This function will create a thread from code in the current memory space</span> <a name="l00048"></a>00048 <span class="comment"></span> <a name="l00049"></a>00049 <span class="comment"> Notes:</span> <a name="l00050"></a>00050 <span class="comment"> </span> <a name="l00051"></a>00051 <span class="comment"> 05/19/04 - This does not work the way I want it to it still makes a copy of kernel space</span> <a name="l00052"></a>00052 <span class="comment"> so do not use out side of kernel space</span> <a name="l00053"></a>00053 <span class="comment"></span> <a name="l00054"></a>00054 <span class="comment">*****************************************************************************************/</span> <a name="l00055"></a><a class="code" href="exec_8c.html#4b86d28d8fd56197042aef174de2fd58">00055</a> <a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a> <a class="code" href="exec_8h.html#e9945e606ad208cb00dc9166d06452b4">execThread</a>(<span class="keywordtype">void</span> (* tproc)(<span class="keywordtype">void</span>),<a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a> stack,<span class="keywordtype">char</span> *arg) { <a name="l00056"></a>00056 <a class="code" href="structtaskStruct.html">kTask_t</a> * newProcess = 0x0; <a name="l00057"></a>00057 <span class="comment">/* Find A New Thread */</span> <a name="l00058"></a>00058 newProcess = <a class="code" href="sched_8h.html#92458df2063761371869cdfe0c9b4ee3">schedNewTask</a>(); <a name="l00059"></a>00059 <a class="code" href="assert_8h.html#d6d5aaa966ca7424f7cb9bd01f2c838b">assert</a>(newProcess); <a name="l00060"></a>00060 <span class="keywordflow">if</span> (stack < 0x100000) <a name="l00061"></a>00061 <a class="code" href="kpanic_8h.html#db9a182aa071791a306163d50d653deb">kpanic</a>(<span class="stringliteral">"exec: stack not in valid area: [0x%X]\n"</span>,stack); <a name="l00062"></a>00062 <a name="l00063"></a>00063 <span class="comment">/* Set All The Correct Thread Attributes */</span> <a name="l00064"></a>00064 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#fecbe8ea2cfebfb4d1a0aa7b6ebcac2c">back_link</a> = 0x0; <a name="l00065"></a>00065 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#1017372aed82d7305586c330fa222b3b">esp0</a> = 0x0; <a name="l00066"></a>00066 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#26d03018de8c122451661bfe9d030541">ss0</a> = 0x0; <a name="l00067"></a>00067 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#d5ef8867200562fd8262f70312beff4d">esp1</a> = 0x0; <a name="l00068"></a>00068 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#6abf05d9a8f6356860a5606ffbadc989">ss1</a> = 0x0; <a name="l00069"></a>00069 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#60c88f3cd3f2110cb24be62444f42cfb">esp2</a> = 0x0; <a name="l00070"></a>00070 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#5a79ace5652b01cc25fc5ba7ff45bfa8">ss2</a> = 0x0; <a name="l00071"></a>00071 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#8d312ed3dd0ea7a0f801c08a8cc4afd0">cr3</a> = (<span class="keywordtype">unsigned</span> int)<a class="code" href="paging_8h.html#4e81de2626825c90dc6bb3cd7c8b344c">kernelPageDirectory</a>; <a name="l00072"></a>00072 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#3e758f2138799d63fc803f7e4db4f5b4">eip</a> = (<span class="keywordtype">unsigned</span> int)tproc; <a name="l00073"></a>00073 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#a85f1fbaf622e0c6a39963da27de0194">eflags</a> = 0x206; <a name="l00074"></a>00074 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#85412a87dbdb8eda612c77bce8055a2c">esp</a> = stack; <a name="l00075"></a>00075 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#c2d32620149e07c40ee87696ef2509c2">ebp</a> = stack; <a name="l00076"></a>00076 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#8beab5808aad776957d4544f6b139d4e">esi</a> = 0x0; <a name="l00077"></a>00077 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#a52b515706cd37e166c8eba348d5e68b">edi</a> = 0x0; <a name="l00078"></a>00078 <a name="l00079"></a>00079 <span class="comment">/* Set these up to be ring 3 tasks */</span> <a name="l00080"></a>00080 <span class="comment">/*</span> <a name="l00081"></a>00081 <span class="comment"> newProcess->tss.es = 0x30+3;</span> <a name="l00082"></a>00082 <span class="comment"> newProcess->tss.cs = 0x28+3;</span> <a name="l00083"></a>00083 <span class="comment"> newProcess->tss.ss = 0x30+3;</span> <a name="l00084"></a>00084 <span class="comment"> newProcess->tss.ds = 0x30+3;</span> <a name="l00085"></a>00085 <span class="comment"> newProcess->tss.fs = 0x30+3;</span> <a name="l00086"></a>00086 <span class="comment"> newProcess->tss.gs = 0x30+3;</span> <a name="l00087"></a>00087 <span class="comment"> */</span> <a name="l00088"></a>00088 <a name="l00089"></a>00089 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#cd97dd6f6eabd83c0b819b6058b7041d">es</a> = 0x10; <a name="l00090"></a>00090 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#6d9085ec5af0fa1fe1de7015ad99c9e3">cs</a> = 0x08; <a name="l00091"></a>00091 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#340a29782d3306ba84176c543725d70a">ss</a> = 0x10; <a name="l00092"></a>00092 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#01ee01c7f45c9b9ee2ad8338c21e6d33">ds</a> = 0x10; <a name="l00093"></a>00093 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#8114a585123181ec835f8db3e029d390">fs</a> = 0x10; <a name="l00094"></a>00094 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#8dfa44423504293405785371d0e7b076">gs</a> = 0x10; <a name="l00095"></a>00095 <a name="l00096"></a>00096 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#d7b6a367e1c2a38e1ee6c8e5dad955f7">ldt</a> = 0x18; <a name="l00097"></a>00097 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#52ac0b54c6b2c71450c62d7fc911f2e2">trace_bitmap</a> = 0x0000; <a name="l00098"></a>00098 newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#611a0a044f99f092ace469ce2381bb33">io_map</a> = 0x8000; <a name="l00099"></a>00099 newProcess-><a class="code" href="structtaskStruct.html#0933c70230d4ac8bc9953640c979f8d7">oInfo</a>.<a class="code" href="structosInfo.html#2833c1fa4a221941b5d1141dfa5beefd">vmStart</a> = 0x6400000; <a name="l00100"></a>00100 <a name="l00101"></a>00101 newProcess-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a> = 0x0; <a name="l00102"></a>00102 <a name="l00103"></a>00103 <span class="comment">/* Set up default stack for thread here filled with arg list 3 times */</span> <a name="l00104"></a>00104 <span class="keyword">asm</span> <span class="keyword">volatile</span>( <a name="l00105"></a>00105 <span class="stringliteral">"pusha \n"</span> <a name="l00106"></a>00106 <span class="stringliteral">"movl %%esp,%%ecx \n"</span> <a name="l00107"></a>00107 <span class="stringliteral">"movl %1,%%eax \n"</span> <a name="l00108"></a>00108 <span class="stringliteral">"movl %%eax,%%esp \n"</span> <a name="l00109"></a>00109 <span class="stringliteral">"pushl %%ebx \n"</span> <a name="l00110"></a>00110 <span class="stringliteral">"pushl %%ebx \n"</span> <a name="l00111"></a>00111 <span class="stringliteral">"pushl %%ebx \n"</span> <a name="l00112"></a>00112 <span class="stringliteral">"movl %%esp,%%eax \n"</span> <a name="l00113"></a>00113 <span class="stringliteral">"movl %%eax,%1 \n"</span> <a name="l00114"></a>00114 <span class="stringliteral">"movl %%ecx,%%esp \n"</span> <a name="l00115"></a>00115 <span class="stringliteral">"popa \n"</span> <a name="l00116"></a>00116 : <a name="l00117"></a>00117 : <span class="stringliteral">"b"</span> (arg),<span class="stringliteral">"m"</span> (newProcess-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#85412a87dbdb8eda612c77bce8055a2c">esp</a>) <a name="l00118"></a>00118 ); <a name="l00119"></a>00119 <a name="l00120"></a>00120 <span class="comment">/* Put new thread into the READY state */</span> <a name="l00121"></a>00121 <a class="code" href="sched_8h.html#51101e12c9236ea1286477695c110482">sched_setStatus</a>(newProcess-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>,<a class="code" href="sched_8h.html#3fb333b67375561d327e9b5a8ffa03b96564f2f3e15be06b670547bbcaaf0798">READY</a>); <a name="l00122"></a>00122 <a name="l00123"></a>00123 <span class="comment">/* Return with the new process ID */</span> <a name="l00124"></a>00124 <span class="keywordflow">return</span>((<a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a>)newProcess); <a name="l00125"></a>00125 } <a name="l00126"></a>00126 <a name="l00127"></a>00127 <span class="comment">/*****************************************************************************************</span> <a name="l00128"></a>00128 <span class="comment"></span> <a name="l00129"></a>00129 <span class="comment"> Function: void execFile(char *file);</span> <a name="l00130"></a>00130 <span class="comment"> Description: This Function Executes A Kile Into A New VM Space With Out</span> <a name="l00131"></a>00131 <span class="comment"> Having To Fork</span> <a name="l00132"></a>00132 <span class="comment"> Notes:</span> <a name="l00133"></a>00133 <span class="comment"></span> <a name="l00134"></a>00134 <span class="comment"> 07/30/02 - I Have Made Some Heavy Changes To This As Well As Fixed A Few</span> <a name="l00135"></a>00135 <span class="comment"> Memory Leaks The Memory Allocated To Load The Binary Into Is</span> <a name="l00136"></a>00136 <span class="comment"> Now Unmapped So It Can Be Used Again And Not Held Onto Until</span> <a name="l00137"></a>00137 <span class="comment"> The Program Exits</span> <a name="l00138"></a>00138 <span class="comment"></span> <a name="l00139"></a>00139 <span class="comment"> 07/30/02 - Now I Have To Make A Better Memory Allocator So We Can Set Up</span> <a name="l00140"></a>00140 <span class="comment"> The Freshly Allocated Pages With The Correct Permissions</span> <a name="l00141"></a>00141 <span class="comment"></span> <a name="l00142"></a>00142 <span class="comment">*****************************************************************************************/</span> <a name="l00143"></a><a class="code" href="exec_8c.html#f80d4412d42ed1b5bf9a1b9774230f33">00143</a> <span class="keywordtype">void</span> <a class="code" href="exec_8h.html#f80d4412d42ed1b5bf9a1b9774230f33">execFile</a>(<span class="keywordtype">char</span> *<a class="code" href="structfile.html">file</a>,<span class="keywordtype">int</span> argc,<span class="keywordtype">char</span> **argv,<span class="keywordtype">int</span> console) { <a name="l00144"></a>00144 <a name="l00145"></a>00145 <span class="keywordtype">int</span> i = 0x0; <a name="l00146"></a>00146 <span class="keywordtype">int</span> x = 0x0; <a name="l00147"></a>00147 <a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a> *tmp = 0x0; <a name="l00148"></a>00148 <a name="l00149"></a>00149 <a class="code" href="structfileDescriptorStruct.html">fileDescriptor</a> *tmpFd = 0x0; <a name="l00150"></a>00150 <a class="code" href="structelfHeader.html">elfHeader</a> *binaryHeader = 0x0; <a name="l00151"></a>00151 <a class="code" href="structelfProgramHeader.html">elfProgramHeader</a> *programHeader = 0x0; <a name="l00152"></a>00152 <a name="l00153"></a>00153 <span class="comment">/* Get A New Task For This Proccess */</span> <a name="l00154"></a>00154 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a> = <a class="code" href="sched_8h.html#92458df2063761371869cdfe0c9b4ee3">schedNewTask</a>(); <a name="l00155"></a>00155 <a class="code" href="assert_8h.html#d6d5aaa966ca7424f7cb9bd01f2c838b">assert</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>); <a name="l00156"></a>00156 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#3cf9920106f9b0d96dff475faf7aa0d6">gid</a> = 0x0; <a name="l00157"></a>00157 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#1f9e02ebf24ff1cd76fab75e4c6b0fe1">uid</a> = 0x0; <a name="l00158"></a>00158 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4563a310626d4f4ea885f4532356abb3">term</a> = <a class="code" href="tty_8h.html#4f96ccac7e60296ef496008d8cbed0ff">tty_find</a>(console); <a name="l00159"></a>00159 <span class="keywordflow">if</span> (<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4563a310626d4f4ea885f4532356abb3">term</a> == 0x0) <a name="l00160"></a>00160 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Error: invalid console\n"</span>); <a name="l00161"></a>00161 <a name="l00162"></a>00162 <span class="comment">/* Set tty ownership */</span> <a name="l00163"></a>00163 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4563a310626d4f4ea885f4532356abb3">term</a>-><a class="code" href="structtty__termNode.html#f8e2ad49f523044768d8e768bfe531e4">owner</a> = <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>; <a name="l00164"></a>00164 <a name="l00165"></a>00165 <span class="comment">/* Now We Must Create A Virtual Space For This Proccess To Run In */</span> <a name="l00166"></a>00166 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#8d312ed3dd0ea7a0f801c08a8cc4afd0">cr3</a> = (<a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a>)<a class="code" href="paging_8h.html#39ac9b6ea58fc8b6f129775642077c99">vmmCreateVirtualSpace</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>); <a name="l00167"></a>00167 <a name="l00168"></a>00168 <span class="comment">/* To Better Load This Application We Will Switch Over To Its VM Space */</span> <a name="l00169"></a>00169 <span class="keyword">asm</span> <span class="keyword">volatile</span>( <a name="l00170"></a>00170 <span class="stringliteral">"movl %0,%%eax \n"</span> <a name="l00171"></a>00171 <span class="stringliteral">"movl %%eax,%%cr3 \n"</span> <a name="l00172"></a>00172 : : <span class="stringliteral">"d"</span> ((<a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a> *)(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#8d312ed3dd0ea7a0f801c08a8cc4afd0">cr3</a>)) <a name="l00173"></a>00173 ); <a name="l00174"></a>00174 <a name="l00175"></a>00175 <span class="comment">/* Lets Find The File */</span> <a name="l00176"></a>00176 tmpFd = <a class="code" href="file_8h.html#d6a41ac88a7d46d574e8a675fdde136c">fopen</a>(file,<span class="stringliteral">"r"</span>); <a name="l00177"></a>00177 <a name="l00178"></a>00178 <span class="comment">/* If We Dont Find the File Return */</span> <a name="l00179"></a>00179 <span class="keywordflow">if</span> (tmpFd == 0x0) { <a name="l00180"></a>00180 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Exec Format Error: Binary File Not Executable.\n"</span>); <a name="l00181"></a>00181 <a class="code" href="file_8h.html#872c22366b4c63f4bdb10cd3b7980b11">fclose</a>(tmpFd); <a name="l00182"></a>00182 <span class="keywordflow">return</span>; <a name="l00183"></a>00183 } <a name="l00184"></a>00184 <span class="keywordflow">if</span> (tmpFd-><a class="code" href="structfileDescriptorStruct.html#11626b5d99a5da968f43bc37d2591c5c">perms</a> == 0x0) { <a name="l00185"></a>00185 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Exec Format Error: Binary File Not Executable.\n"</span>); <a name="l00186"></a>00186 <a class="code" href="file_8h.html#872c22366b4c63f4bdb10cd3b7980b11">fclose</a>(tmpFd); <a name="l00187"></a>00187 <span class="keywordflow">return</span>; <a name="l00188"></a>00188 } <a name="l00189"></a>00189 <a name="l00190"></a>00190 <span class="comment">/* Load ELF Header */</span> <a name="l00191"></a>00191 binaryHeader = (<a class="code" href="structelfHeader.html">elfHeader</a> *)<a class="code" href="kmalloc_8h.html#150eab2ac4ce4553e21ca10e7f441762">kmalloc</a>(<span class="keyword">sizeof</span>(<a class="code" href="structelfHeader.html">elfHeader</a>)); <a name="l00192"></a>00192 <a name="l00193"></a>00193 <a name="l00194"></a>00194 <span class="comment">//kprintf(">a:%i:0x%X:0x%X<",sizeof(elfHeader),binaryHeader,tmpFd);</span> <a name="l00195"></a>00195 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>(binaryHeader,<span class="keyword">sizeof</span>(elfHeader),1,tmpFd); <a name="l00196"></a>00196 <a name="l00197"></a>00197 <a name="l00198"></a>00198 <span class="comment">/* Check If App Is A Real Application */</span> <a name="l00199"></a>00199 <span class="keywordflow">if</span> ((binaryHeader-><a class="code" href="structelfHeader.html#ec74b71d266bdbfaed95a9241343c28c">eIdent</a>[1] != <span class="charliteral">'E'</span>) && (binaryHeader-><a class="code" href="structelfHeader.html#ec74b71d266bdbfaed95a9241343c28c">eIdent</a>[2] != <span class="charliteral">'L'</span>) && (binaryHeader-><a class="code" href="structelfHeader.html#ec74b71d266bdbfaed95a9241343c28c">eIdent</a>[3] != <span class="charliteral">'F'</span>)) { <a name="l00200"></a>00200 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Exec Format Error: Binary File Not Executable.\n"</span>); <a name="l00201"></a>00201 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(binaryHeader); <a name="l00202"></a>00202 <a class="code" href="file_8h.html#872c22366b4c63f4bdb10cd3b7980b11">fclose</a>(tmpFd); <a name="l00203"></a>00203 <span class="keywordflow">return</span>; <a name="l00204"></a>00204 } <a name="l00205"></a>00205 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (binaryHeader-><a class="code" href="structelfHeader.html#34e52f945d79cca21dc50a8aef79f9e8">eType</a> != 2) { <a name="l00206"></a>00206 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Exec Format Error: Binary File Not Executable.\n"</span>); <a name="l00207"></a>00207 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(binaryHeader); <a name="l00208"></a>00208 <a class="code" href="file_8h.html#872c22366b4c63f4bdb10cd3b7980b11">fclose</a>(tmpFd); <a name="l00209"></a>00209 <span class="keywordflow">return</span>; <a name="l00210"></a>00210 } <a name="l00211"></a>00211 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (binaryHeader-><a class="code" href="structelfHeader.html#8ff3dd1b27053bc5a2f01afe5403e53b">eEntry</a> == 0x300000) { <a name="l00212"></a>00212 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Exec Format Error: Binary File Not Executable.\n"</span>); <a name="l00213"></a>00213 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(binaryHeader); <a name="l00214"></a>00214 <a class="code" href="file_8h.html#872c22366b4c63f4bdb10cd3b7980b11">fclose</a>(tmpFd); <a name="l00215"></a>00215 <span class="keywordflow">return</span>; <a name="l00216"></a>00216 } <a name="l00217"></a>00217 <a name="l00218"></a>00218 <span class="comment">/* Load The Program Header(s) */</span> <a name="l00219"></a>00219 programHeader = (<a class="code" href="structelfProgramHeader.html">elfProgramHeader</a> *)<a class="code" href="kmalloc_8h.html#150eab2ac4ce4553e21ca10e7f441762">kmalloc</a>(<span class="keyword">sizeof</span>(<a class="code" href="structelfProgramHeader.html">elfProgramHeader</a>)*binaryHeader-><a class="code" href="structelfHeader.html#4635401868104caa04fcb5bb60840df6">ePhnum</a>); <a name="l00220"></a>00220 <a class="code" href="file_8h.html#80528d8335cd52755f5d6a92e4f08391">fseek</a>(tmpFd,binaryHeader-><a class="code" href="structelfHeader.html#aff1ff2cb64932f1e1a1f6cf3b881787">ePhoff</a>,0); <a name="l00221"></a>00221 <a name="l00222"></a>00222 <span class="comment">//kprintf(">c:%i:0x%X:0x%X<",sizeof(elfProgramHeader)*binaryHeader->ePhnum,programHeader,tmpFd);</span> <a name="l00223"></a>00223 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>(programHeader,(<span class="keyword">sizeof</span>(elfProgramHeader)*binaryHeader-><a class="code" href="structelfHeader.html#4635401868104caa04fcb5bb60840df6">ePhnum</a>),1,tmpFd); <a name="l00224"></a>00224 <span class="comment">//kprintf(">d<");</span> <a name="l00225"></a>00225 <a name="l00226"></a>00226 <span class="comment">/* Loop Through The Header And Load Sections Which Need To Be Loaded */</span> <a name="l00227"></a>00227 <span class="keywordflow">for</span> (i=0;i<binaryHeader-><a class="code" href="structelfHeader.html#4635401868104caa04fcb5bb60840df6">ePhnum</a>;i++) { <a name="l00228"></a>00228 <span class="keywordflow">if</span> (programHeader[i].phType == 1) { <a name="l00229"></a>00229 <span class="comment">/*</span> <a name="l00230"></a>00230 <span class="comment"> Allocate Memory Im Going To Have To Make This Load Memory With Correct</span> <a name="l00231"></a>00231 <span class="comment"> Settings so it helps us in the future</span> <a name="l00232"></a>00232 <span class="comment"> */</span> <a name="l00233"></a>00233 <span class="keywordflow">for</span> (x = 0x0;x < (programHeader[i].<a class="code" href="structelfProgramHeader.html#b5a140ab0f0225a8459f88d905995dd0">phMemsz</a>);x += 0x1000) { <a name="l00234"></a>00234 <span class="comment">/* Make readonly and read/write !!! */</span> <a name="l00235"></a>00235 <span class="keywordflow">if</span> (<a class="code" href="paging_8h.html#a05f8d8947fb5bcec87fc6661f83243e">vmm_remapPage</a>(<a class="code" href="vmm_8h.html#976cf3919bf7c77c868021ec9374593b">vmmFindFreePage</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>),((programHeader[i].<a class="code" href="structelfProgramHeader.html#14f11176e999131fb9be875aeb500447">phVaddr</a> & 0xFFFFF000) + x),<a class="code" href="paging_8h.html#f0fff7a38cd2c7a32d580787423b94ea">PAGE_DEFAULT</a>) == 0x0) <a name="l00236"></a>00236 <a class="code" href="kpanic_8h.html#a5193288597f00c4f8e3b2939aa6c0ce">K_PANIC</a>(<span class="stringliteral">"Remap Page Failed"</span>); <a name="l00237"></a>00237 <a name="l00238"></a>00238 <a class="code" href="lib_2string_8h.html#ce4b911463887af5e748326323e99a23">memset</a>((<span class="keywordtype">void</span> *)((programHeader[i].phVaddr & 0xFFFFF000) + x),0x0,0<a class="code" href="ap-boot_8S.html#f78b91f02427adef14bb8b28aa93baa5">x1000</a>); <a name="l00239"></a>00239 } <a name="l00240"></a>00240 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#0933c70230d4ac8bc9953640c979f8d7">oInfo</a>.<a class="code" href="structosInfo.html#2833c1fa4a221941b5d1141dfa5beefd">vmStart</a> = 0x80000000; <a name="l00241"></a>00241 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#c770300b493b2ea844e634b7c98c4f6a">vm_daddr</a> = (<span class="keywordtype">char</span> *)(programHeader[i].phVaddr & 0xFFFFF000); <a name="l00242"></a>00242 <span class="comment">/* Now Load Section To Memory */</span> <a name="l00243"></a>00243 <a class="code" href="file_8h.html#80528d8335cd52755f5d6a92e4f08391">fseek</a>(tmpFd,programHeader[i].phOffset,0); <a name="l00244"></a>00244 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>((<span class="keywordtype">void</span> *)programHeader[i].phVaddr,programHeader[i].phFilesz,1,tmpFd); <a name="l00245"></a>00245 <span class="keywordflow">if</span> ((programHeader[i].phFlags & 0x2) != 0x2) { <a name="l00246"></a>00246 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"pH: [0x%X]\n"</span>,programHeader[i].phMemsz); <a name="l00247"></a>00247 <span class="keywordflow">for</span> (x = 0x0;x < (programHeader[i].<a class="code" href="structelfProgramHeader.html#b5a140ab0f0225a8459f88d905995dd0">phMemsz</a>);x += 0x1000) { <a name="l00248"></a>00248 <span class="keywordflow">if</span> ((<a class="code" href="paging_8h.html#1913e8607a69ecf446b18fa1cd36c9cc">vmm_setPageAttributes</a>((programHeader[i].phVaddr & 0xFFFFF000) + x,<a class="code" href="paging_8h.html#122dfc414a40e260fd35dbe9743db26f">PAGE_PRESENT</a> | <a class="code" href="paging_8h.html#2d0253527ea5080d6befe0ee3bde473f">PAGE_USER</a>)) != 0x0) <a name="l00249"></a>00249 <a class="code" href="kpanic_8h.html#db9a182aa071791a306163d50d653deb">kpanic</a>(<span class="stringliteral">"Error: vmm_setPageAttributes failed, File: %s, Line: %i\n"</span>,__FILE__,__LINE__); <a name="l00250"></a>00250 } <a name="l00251"></a>00251 } <a name="l00252"></a>00252 } <a name="l00253"></a>00253 } <a name="l00254"></a>00254 <a name="l00255"></a>00255 <span class="comment">/* Set Virtual Memory Start */</span> <a name="l00256"></a>00256 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#0933c70230d4ac8bc9953640c979f8d7">oInfo</a>.<a class="code" href="structosInfo.html#2833c1fa4a221941b5d1141dfa5beefd">vmStart</a> = 0x80000000; <a name="l00257"></a>00257 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#c770300b493b2ea844e634b7c98c4f6a">vm_daddr</a> = (<span class="keywordtype">char</span> *)(programHeader[i].phVaddr & 0xFFFFF000); <a name="l00258"></a>00258 <a name="l00259"></a>00259 <span class="comment">/* Set Up Stack Space */</span> <a name="l00260"></a>00260 <span class="keywordflow">for</span> (x = 1;x < 100;x++) { <a name="l00261"></a>00261 <a class="code" href="paging_8h.html#a05f8d8947fb5bcec87fc6661f83243e">vmm_remapPage</a>(<a class="code" href="vmm_8h.html#976cf3919bf7c77c868021ec9374593b">vmmFindFreePage</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>),<a class="code" href="exec_8c.html#d93dccba62fb5241c0b7cebcd097794a">STACK_ADDR</a> - (x * 0<a class="code" href="ap-boot_8S.html#f78b91f02427adef14bb8b28aa93baa5">x1000</a>),<a class="code" href="paging_8h.html#f0fff7a38cd2c7a32d580787423b94ea">PAGE_DEFAULT</a> | <a class="code" href="paging_8h.html#1532db17068ba8d409b8ffe066414af2">PAGE_STACK</a>); <a name="l00262"></a>00262 } <a name="l00263"></a>00263 <a name="l00264"></a>00264 <span class="comment">/* Kernel Stack 0x2000 bytes long */</span> <a name="l00265"></a>00265 <a class="code" href="paging_8h.html#a05f8d8947fb5bcec87fc6661f83243e">vmm_remapPage</a>(<a class="code" href="vmm_8h.html#976cf3919bf7c77c868021ec9374593b">vmmFindFreePage</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>),0x5BC000,<a class="code" href="paging_8h.html#8b838cda4f0bc79ab8d07eb19dd35420">KERNEL_PAGE_DEFAULT</a> | <a class="code" href="paging_8h.html#1532db17068ba8d409b8ffe066414af2">PAGE_STACK</a>); <a name="l00266"></a>00266 <a class="code" href="paging_8h.html#a05f8d8947fb5bcec87fc6661f83243e">vmm_remapPage</a>(<a class="code" href="vmm_8h.html#976cf3919bf7c77c868021ec9374593b">vmmFindFreePage</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>),0x5BB000,<a class="code" href="paging_8h.html#8b838cda4f0bc79ab8d07eb19dd35420">KERNEL_PAGE_DEFAULT</a> | <a class="code" href="paging_8h.html#1532db17068ba8d409b8ffe066414af2">PAGE_STACK</a>); <a name="l00267"></a>00267 <a name="l00268"></a>00268 <span class="comment">/* Set All The Proper Information For The Task */</span> <a name="l00269"></a>00269 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#fecbe8ea2cfebfb4d1a0aa7b6ebcac2c">back_link</a> = 0x0; <a name="l00270"></a>00270 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#1017372aed82d7305586c330fa222b3b">esp0</a> = 0x5BC000; <a name="l00271"></a>00271 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#26d03018de8c122451661bfe9d030541">ss0</a> = 0x10; <a name="l00272"></a>00272 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#d5ef8867200562fd8262f70312beff4d">esp1</a> = 0x0; <a name="l00273"></a>00273 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#6abf05d9a8f6356860a5606ffbadc989">ss1</a> = 0x0; <a name="l00274"></a>00274 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#60c88f3cd3f2110cb24be62444f42cfb">esp2</a> = 0x0; <a name="l00275"></a>00275 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#5a79ace5652b01cc25fc5ba7ff45bfa8">ss2</a> = 0x0; <a name="l00276"></a>00276 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#3e758f2138799d63fc803f7e4db4f5b4">eip</a> = (long)binaryHeader-><a class="code" href="structelfHeader.html#8ff3dd1b27053bc5a2f01afe5403e53b">eEntry</a>; <a name="l00277"></a>00277 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#a85f1fbaf622e0c6a39963da27de0194">eflags</a> = 0x206; <a name="l00278"></a>00278 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#85412a87dbdb8eda612c77bce8055a2c">esp</a> = <a class="code" href="exec_8c.html#d93dccba62fb5241c0b7cebcd097794a">STACK_ADDR</a> - 12; <a name="l00279"></a>00279 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#c2d32620149e07c40ee87696ef2509c2">ebp</a> = <a class="code" href="exec_8c.html#d93dccba62fb5241c0b7cebcd097794a">STACK_ADDR</a>; <a name="l00280"></a>00280 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#8beab5808aad776957d4544f6b139d4e">esi</a> = 0x0; <a name="l00281"></a>00281 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#a52b515706cd37e166c8eba348d5e68b">edi</a> = 0x0; <a name="l00282"></a>00282 <a name="l00283"></a>00283 <span class="comment">/* Set these up to be ring 3 tasks */</span> <a name="l00284"></a>00284 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#cd97dd6f6eabd83c0b819b6058b7041d">es</a> = 0<a class="code" href="ap-boot_8S.html#c2a218176530ced267bbcc8042da1000">x30</a>+3; <a name="l00285"></a>00285 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#6d9085ec5af0fa1fe1de7015ad99c9e3">cs</a> = 0x28+3; <a name="l00286"></a>00286 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#340a29782d3306ba84176c543725d70a">ss</a> = 0<a class="code" href="ap-boot_8S.html#c2a218176530ced267bbcc8042da1000">x30</a>+3; <a name="l00287"></a>00287 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#01ee01c7f45c9b9ee2ad8338c21e6d33">ds</a> = 0<a class="code" href="ap-boot_8S.html#c2a218176530ced267bbcc8042da1000">x30</a>+3; <a name="l00288"></a>00288 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#8114a585123181ec835f8db3e029d390">fs</a> = 0<a class="code" href="ap-boot_8S.html#c2a218176530ced267bbcc8042da1000">x30</a>+3; <a name="l00289"></a>00289 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#8dfa44423504293405785371d0e7b076">gs</a> = 0<a class="code" href="ap-boot_8S.html#c2a218176530ced267bbcc8042da1000">x30</a>+3; <a name="l00290"></a>00290 <a name="l00291"></a>00291 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#d7b6a367e1c2a38e1ee6c8e5dad955f7">ldt</a> = 0<a class="code" href="start_8S.html#0c48af311abb843beb7bb6c5e295d1db">x18</a>; <a name="l00292"></a>00292 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#52ac0b54c6b2c71450c62d7fc911f2e2">trace_bitmap</a> = 0x0000; <a name="l00293"></a>00293 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#611a0a044f99f092ace469ce2381bb33">io_map</a> = 0x8000; <a name="l00294"></a>00294 <a name="l00295"></a>00295 <a class="code" href="sched_8h.html#51101e12c9236ea1286477695c110482">sched_setStatus</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>,<a class="code" href="sched_8h.html#3fb333b67375561d327e9b5a8ffa03b96564f2f3e15be06b670547bbcaaf0798">READY</a>); <a name="l00296"></a>00296 <a name="l00297"></a>00297 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(binaryHeader); <a name="l00298"></a>00298 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(programHeader); <a name="l00299"></a>00299 <a class="code" href="file_8h.html#872c22366b4c63f4bdb10cd3b7980b11">fclose</a>(tmpFd); <a name="l00300"></a>00300 <a name="l00301"></a>00301 tmp = (<a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a> *)<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#1017372aed82d7305586c330fa222b3b">esp0</a> - 5; <a name="l00302"></a>00302 tmp[0] = binaryHeader-><a class="code" href="structelfHeader.html#8ff3dd1b27053bc5a2f01afe5403e53b">eEntry</a>; <a name="l00303"></a>00303 tmp[3] = <a class="code" href="exec_8c.html#d93dccba62fb5241c0b7cebcd097794a">STACK_ADDR</a> - 12; <a name="l00304"></a>00304 <a name="l00305"></a>00305 tmp = (<a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a> *)<a class="code" href="exec_8c.html#d93dccba62fb5241c0b7cebcd097794a">STACK_ADDR</a> - 2; <a name="l00306"></a>00306 <a name="l00307"></a>00307 <span class="keywordflow">if</span> (<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a> > 4) <a name="l00308"></a>00308 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"argv[0]: [%s]\n"</span>,argv[0]); <a name="l00309"></a>00309 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"argv: [0x%X]\n"</span>,argv); <a name="l00310"></a>00310 tmp[0] = (<a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a>)argv; <a name="l00311"></a>00311 tmp[1] = (<a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a>)argv; <a name="l00312"></a>00312 <a name="l00313"></a>00313 <a name="l00314"></a>00314 <span class="comment">/* Switch Back To The Kernels VM Space */</span> <a name="l00315"></a>00315 <span class="keyword">asm</span> <span class="keyword">volatile</span>( <a name="l00316"></a>00316 <span class="stringliteral">"movl %0,%%eax \n"</span> <a name="l00317"></a>00317 <span class="stringliteral">"movl %%eax,%%cr3 \n"</span> <a name="l00318"></a>00318 : : <span class="stringliteral">"d"</span> ((<a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a> *)(<a class="code" href="paging_8h.html#4e81de2626825c90dc6bb3cd7c8b344c">kernelPageDirectory</a>)) <a name="l00319"></a>00319 ); <a name="l00320"></a>00320 <a name="l00321"></a>00321 <span class="comment">/* Finally Return */</span> <a name="l00322"></a>00322 <span class="keywordflow">return</span>; <a name="l00323"></a>00323 } <a name="l00324"></a>00324 <a name="l00325"></a>00325 <span class="comment">/*****************************************************************************************</span> <a name="l00326"></a>00326 <span class="comment"></span> <a name="l00327"></a>00327 <span class="comment"> Function: void sysExec();</span> <a name="l00328"></a>00328 <span class="comment"> Description: This Is The System Call To Execute A New Task</span> <a name="l00329"></a>00329 <span class="comment"></span> <a name="l00330"></a>00330 <span class="comment"> Notes:</span> <a name="l00331"></a>00331 <span class="comment"> 04-22-03 - It Now Loads Sections Not The Full File</span> <a name="l00332"></a>00332 <span class="comment"></span> <a name="l00333"></a>00333 <span class="comment">*****************************************************************************************/</span> <a name="l00334"></a><a class="code" href="exec_8c.html#219681612352232186a0f568457d851d">00334</a> <span class="keywordtype">void</span> <a class="code" href="syscalls_8h.html#067d373ad2682affb9b8b093b5e5c97a">sysExec</a>(<span class="keywordtype">char</span> *<a class="code" href="structfile.html">file</a>,<span class="keywordtype">char</span> *ap) { <a name="l00335"></a>00335 <span class="keywordtype">int</span> i = 0x0; <a name="l00336"></a>00336 <span class="keywordtype">int</span> x = 0x0; <a name="l00337"></a>00337 <span class="keywordtype">int</span> argc = 0x0; <a name="l00338"></a>00338 <a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a> *tmp = 0x0; <a name="l00339"></a>00339 <a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a> ldAddr = 0x0; <a name="l00340"></a>00340 <a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a> seg_size = 0x0; <a name="l00341"></a>00341 <a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a> seg_addr = 0x0; <a name="l00342"></a>00342 <span class="keywordtype">char</span> *interp = 0x0; <a name="l00343"></a>00343 <span class="keywordtype">char</span> **argv = 0x0; <a name="l00344"></a>00344 <span class="keywordtype">char</span> **argvNew = 0x0; <a name="l00345"></a>00345 <span class="keywordtype">char</span> *args = 0x0; <a name="l00346"></a>00346 <a name="l00347"></a>00347 <a class="code" href="structfileDescriptorStruct.html">fileDescriptor</a> *tmpFd = 0x0; <a name="l00348"></a>00348 <a class="code" href="structelfHeader.html">elfHeader</a> *binaryHeader = 0x0; <a name="l00349"></a>00349 <a class="code" href="structelfProgramHeader.html">elfProgramHeader</a> *programHeader = 0x0; <a name="l00350"></a>00350 <a class="code" href="structelfSectionHeader.html">elfSectionHeader</a> *sectionHeader = 0x0; <a name="l00351"></a>00351 <a class="code" href="structelfDynamic.html">elfDynamic</a> *elfDynamicS = 0x0; <a name="l00352"></a>00352 <span class="keyword">struct </span><a class="code" href="structi386__frame.html">i386_frame</a> *iFrame = 0x0; <a name="l00353"></a>00353 <a name="l00354"></a>00354 <a name="l00355"></a>00355 <span class="keywordflow">if</span> (<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a> > 4) { <a name="l00356"></a>00356 <a class="code" href="exec_8h.html#094c23346b6d226a03866a54b755ed64">sys_exec</a>(file,ap); <a name="l00357"></a>00357 <span class="keywordflow">return</span>; <a name="l00358"></a>00358 } <a name="l00359"></a>00359 <a name="l00360"></a>00360 tmpFd = <a class="code" href="file_8h.html#d6a41ac88a7d46d574e8a675fdde136c">fopen</a>(file,<span class="stringliteral">"r"</span>); <a name="l00361"></a>00361 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a> = tmpFd; <a name="l00362"></a>00362 <span class="comment">/* If We Dont Find the File Return */</span> <a name="l00363"></a>00363 <span class="keywordflow">if</span> (tmpFd == 0x0) { <a name="l00364"></a>00364 <span class="keywordflow">return</span>; <a name="l00365"></a>00365 } <a name="l00366"></a>00366 <span class="keywordflow">if</span> (tmpFd-><a class="code" href="structfileDescriptorStruct.html#11626b5d99a5da968f43bc37d2591c5c">perms</a> == 0) { <a name="l00367"></a>00367 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Exec Format Error: Binary File Not Executable.\n"</span>); <a name="l00368"></a>00368 <a class="code" href="file_8h.html#872c22366b4c63f4bdb10cd3b7980b11">fclose</a>(tmpFd); <a name="l00369"></a>00369 <span class="keywordflow">return</span>; <a name="l00370"></a>00370 } <a name="l00371"></a>00371 <a name="l00372"></a>00372 <span class="comment">/* Load ELF Header */</span> <a name="l00373"></a>00373 <a name="l00374"></a>00374 <span class="keywordflow">if</span> ((binaryHeader = (<a class="code" href="structelfHeader.html">elfHeader</a> *)<a class="code" href="kmalloc_8h.html#150eab2ac4ce4553e21ca10e7f441762">kmalloc</a>(<span class="keyword">sizeof</span>(<a class="code" href="structelfHeader.html">elfHeader</a>))) == 0x0) <a name="l00375"></a>00375 <a class="code" href="endtask_8h.html#152c1859ada097cc21071f471bfa2e67">endTask</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>); <a name="l00376"></a>00376 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>(binaryHeader,<span class="keyword">sizeof</span>(elfHeader),1,tmpFd); <a name="l00377"></a>00377 <span class="comment">/* Set sectionHeader To Point To Loaded Binary To We Can Gather Info */</span> <a name="l00378"></a>00378 <a name="l00379"></a>00379 <span class="comment">/* Check If App Is A Real Application */</span> <a name="l00380"></a>00380 <span class="keywordflow">if</span> ((binaryHeader-><a class="code" href="structelfHeader.html#ec74b71d266bdbfaed95a9241343c28c">eIdent</a>[1] != <span class="charliteral">'E'</span>) && (binaryHeader-><a class="code" href="structelfHeader.html#ec74b71d266bdbfaed95a9241343c28c">eIdent</a>[2] != <span class="charliteral">'L'</span>) && (binaryHeader-><a class="code" href="structelfHeader.html#ec74b71d266bdbfaed95a9241343c28c">eIdent</a>[3] != <span class="charliteral">'F'</span>)) { <a name="l00381"></a>00381 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Exec Format Error: Binary File Not Executable.\n"</span>); <a name="l00382"></a>00382 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(binaryHeader); <a name="l00383"></a>00383 <a class="code" href="file_8h.html#872c22366b4c63f4bdb10cd3b7980b11">fclose</a>(tmpFd); <a name="l00384"></a>00384 <a name="l00385"></a>00385 <span class="keywordflow">return</span>; <a name="l00386"></a>00386 } <a name="l00387"></a>00387 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (binaryHeader-><a class="code" href="structelfHeader.html#34e52f945d79cca21dc50a8aef79f9e8">eType</a> != 2) { <a name="l00388"></a>00388 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Exec Format Error: Binary File Not Executable.\n"</span>); <a name="l00389"></a>00389 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(binaryHeader); <a name="l00390"></a>00390 <a class="code" href="file_8h.html#872c22366b4c63f4bdb10cd3b7980b11">fclose</a>(tmpFd); <a name="l00391"></a>00391 <span class="keywordflow">return</span>; <a name="l00392"></a>00392 } <a name="l00393"></a>00393 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (binaryHeader-><a class="code" href="structelfHeader.html#8ff3dd1b27053bc5a2f01afe5403e53b">eEntry</a> == 0x300000) { <a name="l00394"></a>00394 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Exec Format Error: Binary File Not Executable.\n"</span>); <a name="l00395"></a>00395 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(binaryHeader); <a name="l00396"></a>00396 <a class="code" href="file_8h.html#872c22366b4c63f4bdb10cd3b7980b11">fclose</a>(tmpFd); <a name="l00397"></a>00397 <span class="keywordflow">return</span>; <a name="l00398"></a>00398 } <a name="l00399"></a>00399 <a name="l00400"></a>00400 <span class="comment">/* Load The Program Header(s) */</span> <a name="l00401"></a>00401 <span class="keywordflow">if</span> ((programHeader = (<a class="code" href="structelfProgramHeader.html">elfProgramHeader</a> *)<a class="code" href="kmalloc_8h.html#150eab2ac4ce4553e21ca10e7f441762">kmalloc</a>(<span class="keyword">sizeof</span>(<a class="code" href="structelfProgramHeader.html">elfProgramHeader</a>)*binaryHeader-><a class="code" href="structelfHeader.html#4635401868104caa04fcb5bb60840df6">ePhnum</a>)) == 0x0) <a name="l00402"></a>00402 <a class="code" href="endtask_8h.html#152c1859ada097cc21071f471bfa2e67">endTask</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>); <a name="l00403"></a>00403 <a name="l00404"></a>00404 <a class="code" href="assert_8h.html#d6d5aaa966ca7424f7cb9bd01f2c838b">assert</a>(programHeader); <a name="l00405"></a>00405 <a class="code" href="file_8h.html#80528d8335cd52755f5d6a92e4f08391">fseek</a>(tmpFd,binaryHeader-><a class="code" href="structelfHeader.html#aff1ff2cb64932f1e1a1f6cf3b881787">ePhoff</a>,0); <a name="l00406"></a>00406 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>(programHeader,(<span class="keyword">sizeof</span>(elfProgramHeader)*binaryHeader-><a class="code" href="structelfHeader.html#4635401868104caa04fcb5bb60840df6">ePhnum</a>),1,tmpFd); <a name="l00407"></a>00407 <a name="l00408"></a>00408 <span class="keywordflow">if</span> ((sectionHeader = (<a class="code" href="structelfSectionHeader.html">elfSectionHeader</a> *)<a class="code" href="kmalloc_8h.html#150eab2ac4ce4553e21ca10e7f441762">kmalloc</a>(<span class="keyword">sizeof</span>(<a class="code" href="structelfSectionHeader.html">elfSectionHeader</a>)*binaryHeader-><a class="code" href="structelfHeader.html#a5b9594ecad96ed7448dbcf95da7895f">eShnum</a>)) == 0x0) <a name="l00409"></a>00409 <a class="code" href="endtask_8h.html#152c1859ada097cc21071f471bfa2e67">endTask</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>); <a name="l00410"></a>00410 <a name="l00411"></a>00411 <a class="code" href="assert_8h.html#d6d5aaa966ca7424f7cb9bd01f2c838b">assert</a>(sectionHeader); <a name="l00412"></a>00412 <a class="code" href="file_8h.html#80528d8335cd52755f5d6a92e4f08391">fseek</a>(tmpFd,binaryHeader-><a class="code" href="structelfHeader.html#3d8c518903e5e4db018a336edb6ef204">eShoff</a>,0); <a name="l00413"></a>00413 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>(sectionHeader,<span class="keyword">sizeof</span>(elfSectionHeader)*binaryHeader-><a class="code" href="structelfHeader.html#a5b9594ecad96ed7448dbcf95da7895f">eShnum</a>,1,tmpFd); <a name="l00414"></a>00414 <a name="l00415"></a>00415 <span class="comment">/* Loop Through The Header And Load Sections Which Need To Be Loaded */</span> <a name="l00416"></a>00416 <span class="keywordflow">for</span> (i=0;i<binaryHeader-><a class="code" href="structelfHeader.html#4635401868104caa04fcb5bb60840df6">ePhnum</a>;i++) { <a name="l00417"></a>00417 <span class="keywordflow">switch</span> (programHeader[i].phType) { <a name="l00418"></a>00418 <span class="keywordflow">case</span> <a class="code" href="elf_8h.html#84d7768fd6c6ece599d297090900cf92">PT_LOAD</a>: <a name="l00419"></a>00419 seg_addr = <a class="code" href="paging_8h.html#bd636a9b61ad98f4fc23b1f4a9210d78">trunc_page</a>(programHeader[i].phVaddr); <a name="l00420"></a>00420 seg_size = <a class="code" href="paging_8h.html#2702263fcf2b3b026cb26c6d895cb0ee">round_page</a>(programHeader[i].phMemsz + programHeader[i].phVaddr - seg_addr); <a name="l00421"></a>00421 <a name="l00422"></a>00422 <span class="comment">/*</span> <a name="l00423"></a>00423 <span class="comment"> Allocate Memory Im Going To Have To Make This Load Memory With Correct</span> <a name="l00424"></a>00424 <span class="comment"> Settings so it helps us in the future</span> <a name="l00425"></a>00425 <span class="comment"> */</span> <a name="l00426"></a>00426 <span class="keywordflow">for</span> (x = 0x0;x < (programHeader[i].<a class="code" href="structelfProgramHeader.html#b5a140ab0f0225a8459f88d905995dd0">phMemsz</a>);x += 0x1000) { <a name="l00427"></a>00427 <span class="comment">/* Make readonly and read/write !!! */</span> <a name="l00428"></a>00428 <span class="keywordflow">if</span> (<a class="code" href="paging_8h.html#a05f8d8947fb5bcec87fc6661f83243e">vmm_remapPage</a>(<a class="code" href="vmm_8h.html#976cf3919bf7c77c868021ec9374593b">vmmFindFreePage</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>),((programHeader[i].<a class="code" href="structelfProgramHeader.html#14f11176e999131fb9be875aeb500447">phVaddr</a> & 0xFFFFF000) + x),<a class="code" href="paging_8h.html#f0fff7a38cd2c7a32d580787423b94ea">PAGE_DEFAULT</a>) == 0x0) <a name="l00429"></a>00429 <a class="code" href="kpanic_8h.html#a5193288597f00c4f8e3b2939aa6c0ce">K_PANIC</a>(<span class="stringliteral">"Error: Remap Page Failed"</span>); <a name="l00430"></a>00430 <a class="code" href="lib_2string_8h.html#ce4b911463887af5e748326323e99a23">memset</a>((<span class="keywordtype">void</span> *)((programHeader[i].phVaddr & 0xFFFFF000) + x),0x0,0<a class="code" href="ap-boot_8S.html#f78b91f02427adef14bb8b28aa93baa5">x1000</a>); <a name="l00431"></a>00431 } <a name="l00432"></a>00432 <a name="l00433"></a>00433 <span class="comment">/* Now Load Section To Memory */</span> <a name="l00434"></a>00434 <a class="code" href="file_8h.html#80528d8335cd52755f5d6a92e4f08391">fseek</a>(tmpFd,programHeader[i].phOffset,0); <a name="l00435"></a>00435 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>((<span class="keywordtype">void</span> *)programHeader[i].phVaddr,programHeader[i].phFilesz,1,tmpFd); <a name="l00436"></a>00436 <span class="keywordflow">if</span> ((programHeader[i].phFlags & 0x2) != 0x2) { <a name="l00437"></a>00437 <span class="keywordflow">for</span> (x = 0x0;x < (programHeader[i].<a class="code" href="structelfProgramHeader.html#b5a140ab0f0225a8459f88d905995dd0">phMemsz</a>);x += 0x1000) { <a name="l00438"></a>00438 <span class="keywordflow">if</span> ((<a class="code" href="paging_8h.html#1913e8607a69ecf446b18fa1cd36c9cc">vmm_setPageAttributes</a>((programHeader[i].phVaddr & 0xFFFFF000) + x,<a class="code" href="paging_8h.html#122dfc414a40e260fd35dbe9743db26f">PAGE_PRESENT</a> | <a class="code" href="paging_8h.html#2d0253527ea5080d6befe0ee3bde473f">PAGE_USER</a>)) != 0x0) <a name="l00439"></a>00439 <a class="code" href="kpanic_8h.html#db9a182aa071791a306163d50d653deb">kpanic</a>(<span class="stringliteral">"Error: vmm_setPageAttributes failed, File: %s,Line: %i\n"</span>,__FILE__,__LINE__); <a name="l00440"></a>00440 } <a name="l00441"></a>00441 } <a name="l00442"></a>00442 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"setting daddr\n"</span>); <a name="l00443"></a>00443 <span class="keywordflow">if</span> (binaryHeader-><a class="code" href="structelfHeader.html#8ff3dd1b27053bc5a2f01afe5403e53b">eEntry</a> >= programHeader[i].<a class="code" href="structelfProgramHeader.html#14f11176e999131fb9be875aeb500447">phVaddr</a> && binaryHeader-><a class="code" href="structelfHeader.html#8ff3dd1b27053bc5a2f01afe5403e53b">eEntry</a> < (programHeader[i].<a class="code" href="structelfProgramHeader.html#14f11176e999131fb9be875aeb500447">phVaddr</a> + programHeader[i].<a class="code" href="structelfProgramHeader.html#b5a140ab0f0225a8459f88d905995dd0">phMemsz</a>)) { <a name="l00444"></a>00444 <span class="comment">/* We're suposed to do something here? */</span> <a name="l00445"></a>00445 } <a name="l00446"></a>00446 <span class="keywordflow">else</span> { <a name="l00447"></a>00447 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#4ce0e0e5856efc85e111d2cb8748a0ee">vm_dsize</a> = seg_size >> <a class="code" href="paging_8h.html#850d80ca2291d26b40dc6b25c419f81a">PAGE_SHIFT</a>; <a name="l00448"></a>00448 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#c770300b493b2ea844e634b7c98c4f6a">vm_daddr</a> = (<span class="keywordtype">char</span> *)seg_addr; <a name="l00449"></a>00449 } <a name="l00450"></a>00450 <a name="l00451"></a>00451 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#0933c70230d4ac8bc9953640c979f8d7">oInfo</a>.<a class="code" href="structosInfo.html#2833c1fa4a221941b5d1141dfa5beefd">vmStart</a> = ((programHeader[i].<a class="code" href="structelfProgramHeader.html#14f11176e999131fb9be875aeb500447">phVaddr</a> & 0xFFFFF000) + 0xA900000); <a name="l00452"></a>00452 <span class="keywordflow">break</span>; <a name="l00453"></a>00453 <span class="keywordflow">case</span> <a class="code" href="elf_8h.html#2121a2f01c51e8462bfd4d47725649d8">PT_DYNAMIC</a>: <a name="l00454"></a>00454 <span class="comment">//newLoc = (char *)programHeader[i].phVaddr;</span> <a name="l00455"></a>00455 elfDynamicS = (<a class="code" href="structelfDynamic.html">elfDynamic</a> *)programHeader[i].phVaddr; <a name="l00456"></a>00456 <a class="code" href="file_8h.html#80528d8335cd52755f5d6a92e4f08391">fseek</a>(tmpFd,programHeader[i].phOffset,0); <a name="l00457"></a>00457 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>((<span class="keywordtype">void</span> *)programHeader[i].phVaddr,programHeader[i].phFilesz,1,tmpFd); <a name="l00458"></a>00458 <span class="keywordflow">break</span>; <a name="l00459"></a>00459 <span class="keywordflow">case</span> <a class="code" href="elf_8h.html#bcd3aa15bc567949c1ab6b1abc137710">PT_INTERP</a>: <a name="l00460"></a>00460 interp = (<span class="keywordtype">char</span> *)<a class="code" href="kmalloc_8h.html#150eab2ac4ce4553e21ca10e7f441762">kmalloc</a>(programHeader[i].phFilesz); <a name="l00461"></a>00461 <a class="code" href="file_8h.html#80528d8335cd52755f5d6a92e4f08391">fseek</a>(tmpFd,programHeader[i].phOffset,0); <a name="l00462"></a>00462 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>((<span class="keywordtype">void</span> *)interp,programHeader[i].phFilesz,1,tmpFd); <a name="l00463"></a>00463 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Interp: [%s]\n"</span>,interp); <a name="l00464"></a>00464 ldAddr = <a class="code" href="ld_8h.html#b0622e93915d1824df770950e425875f">ldEnable</a>(); <a name="l00465"></a>00465 <span class="keywordflow">break</span>; <a name="l00466"></a>00466 <span class="keywordflow">default</span>: <a name="l00467"></a>00467 <span class="keywordflow">break</span>; <a name="l00468"></a>00468 } <a name="l00469"></a>00469 } <a name="l00470"></a>00470 <a name="l00471"></a>00471 <span class="comment">/* What is this doing? 11/23/06 */</span> <a name="l00472"></a>00472 <span class="keywordflow">if</span> (elfDynamicS != 0x0) { <a name="l00473"></a>00473 <span class="keywordflow">for</span> (i=0;i<12;i++) { <a name="l00474"></a>00474 <span class="keywordflow">if</span> (elfDynamicS[i].dynVal == 0x3) { <a name="l00475"></a>00475 tmp = (<a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a> *)elfDynamicS[i].dynPtr; <a name="l00476"></a>00476 <span class="keywordflow">if</span> (tmp == 0x0) <a name="l00477"></a>00477 <a class="code" href="kpanic_8h.html#db9a182aa071791a306163d50d653deb">kpanic</a>(<span class="stringliteral">"tmp: NULL\n"</span>); <a name="l00478"></a>00478 tmp[2] = (<a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a>)ldAddr; <a name="l00479"></a>00479 tmp[1] = (<a class="code" href="types_8h.html#5847ea0262a5aa61eee48cbe95544a78">uInt32</a>)tmpFd; <a name="l00480"></a>00480 <span class="keywordflow">break</span>; <a name="l00481"></a>00481 } <a name="l00482"></a>00482 <span class="comment">/*</span> <a name="l00483"></a>00483 <span class="comment"> else {</span> <a name="l00484"></a>00484 <span class="comment"> kprintf("dyn_val: %i",elfDynamicS[i].dynVal);</span> <a name="l00485"></a>00485 <span class="comment"> }</span> <a name="l00486"></a>00486 <span class="comment">*/</span> <a name="l00487"></a>00487 } <a name="l00488"></a>00488 } <a name="l00489"></a>00489 <a name="l00490"></a>00490 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#4ce0e0e5856efc85e111d2cb8748a0ee">vm_dsize</a> = seg_size >> <a class="code" href="paging_8h.html#850d80ca2291d26b40dc6b25c419f81a">PAGE_SHIFT</a>; <a name="l00491"></a>00491 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#c770300b493b2ea844e634b7c98c4f6a">vm_daddr</a> = (<span class="keywordtype">char</span> *)seg_addr; <a name="l00492"></a>00492 <a name="l00493"></a>00493 argv = ap; <a name="l00494"></a>00494 <a name="l00495"></a>00495 <span class="keywordflow">if</span> (argv[1] != 0x0) { <a name="l00496"></a>00496 argc = argv[0]; <a name="l00497"></a>00497 args = (<span class="keywordtype">char</span> *)<a class="code" href="paging_8h.html#4b324672c4b25064eb8db1e3419337b1">vmmGetFreeVirtualPage</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>,1,<a class="code" href="paging_8h.html#59a518704bf2f0b56603476bcb1eebbf">VM_TASK</a>); <a name="l00498"></a>00498 <a class="code" href="lib_2string_8h.html#ce4b911463887af5e748326323e99a23">memset</a>(args,0x0,0<a class="code" href="ap-boot_8S.html#f78b91f02427adef14bb8b28aa93baa5">x1000</a>); <a name="l00499"></a>00499 x = 0x0; <a name="l00500"></a>00500 argvNew = (<span class="keywordtype">char</span> **)<a class="code" href="kmalloc_8h.html#150eab2ac4ce4553e21ca10e7f441762">kmalloc</a>(<span class="keyword">sizeof</span>(<span class="keywordtype">char</span> *) * argc); <a name="l00501"></a>00501 <span class="keywordflow">for</span> (i = 0x0;i < argc;i++) { <a name="l00502"></a>00502 <a class="code" href="strcpy_8S.html#9132520cc79236b654666f4ddc1b516c">strcpy</a>(args + x,argv[i + 1]); <a name="l00503"></a>00503 argvNew[i] = args + x; <a name="l00504"></a>00504 x += <a class="code" href="strlen_8S.html#0bcafbeba7f59f157715cc462036b8d3">strlen</a>(argv[i + 1]) + 1; <a name="l00505"></a>00505 <span class="comment">//args[x] = '\0';</span> <a name="l00506"></a>00506 <span class="comment">//x++;</span> <a name="l00507"></a>00507 } <a name="l00508"></a>00508 argv = argvNew; <a name="l00509"></a>00509 } <a name="l00510"></a>00510 <a name="l00512"></a>00512 <a class="code" href="paging_8c.html#0444c8635648fabdbd6e702137aa1723">vmm_cleanVirtualSpace</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#c770300b493b2ea844e634b7c98c4f6a">vm_daddr</a> + (<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#4ce0e0e5856efc85e111d2cb8748a0ee">vm_dsize</a> << <a class="code" href="paging_8h.html#7d467c1d283fdfa1f2081ba1e0d01b6e">PAGE_SIZE</a>)); <a name="l00513"></a>00513 <a name="l00514"></a>00514 <a name="l00516"></a>00516 iFrame = <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#1017372aed82d7305586c330fa222b3b">esp0</a> - <span class="keyword">sizeof</span>(<span class="keyword">struct </span><a class="code" href="structi386__frame.html">i386_frame</a>); <a name="l00517"></a>00517 iFrame-><a class="code" href="structi386__frame.html#dcf6812a951acee52fce378a3c935b1f">ebp</a> = <a class="code" href="exec_8c.html#d93dccba62fb5241c0b7cebcd097794a">STACK_ADDR</a>; <a name="l00518"></a>00518 iFrame-><a class="code" href="structi386__frame.html#ef87f1d1d6f1ad030c95773e7eedfa16">eip</a> = binaryHeader-><a class="code" href="structelfHeader.html#8ff3dd1b27053bc5a2f01afe5403e53b">eEntry</a>; <a name="l00519"></a>00519 iFrame-><a class="code" href="structi386__frame.html#bbfc7b0ada36bd69608adfa39f5fc133">user_esp</a> = <a class="code" href="exec_8c.html#d93dccba62fb5241c0b7cebcd097794a">STACK_ADDR</a> - 12; <a name="l00520"></a>00520 <a name="l00521"></a>00521 <span class="comment">//if (_current->id > 3) {</span> <a name="l00522"></a>00522 <a name="l00523"></a>00523 iFrame-><a class="code" href="structi386__frame.html#bbfc7b0ada36bd69608adfa39f5fc133">user_esp</a> = ((<a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a>)<a class="code" href="exec_8c.html#d93dccba62fb5241c0b7cebcd097794a">STACK_ADDR</a>) - (<span class="keyword">sizeof</span>(<a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a>) * (argc + 3)); <a name="l00524"></a>00524 tmp = iFrame-><a class="code" href="structi386__frame.html#bbfc7b0ada36bd69608adfa39f5fc133">user_esp</a>; <a name="l00525"></a>00525 <a name="l00527"></a>00527 tmp[0] = argc; <a name="l00528"></a>00528 <span class="keywordflow">for</span> (i = 0;i < argc;i++) { <a name="l00529"></a>00529 tmp[i + 1] = argv[i]; <a name="l00530"></a>00530 } <a name="l00531"></a>00531 tmp[argc + 1] = 0x0; <a name="l00532"></a>00532 tmp[argc + 2] = 0x1; <a name="l00533"></a>00533 <span class="comment">//}</span> <a name="l00534"></a>00534 <span class="comment">//else {</span> <a name="l00535"></a>00535 <span class="comment">//tmp = (u_int32_t *)STACK_ADDR - 2;</span> <a name="l00536"></a>00536 <span class="comment">//tmp[0] = 0x1;</span> <a name="l00537"></a>00537 <span class="comment">//tmp[1] = 0x0;</span> <a name="l00538"></a>00538 <span class="comment">//tmp[1] = (u_int32_t)argv;</span> <a name="l00539"></a>00539 <span class="comment">//}</span> <a name="l00540"></a>00540 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(argvNew); <a name="l00541"></a>00541 <span class="comment">/* Now That We Relocated The Binary We Can Unmap And Free Header Info */</span> <a name="l00542"></a>00542 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(binaryHeader); <a name="l00543"></a>00543 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(programHeader); <a name="l00544"></a>00544 <a name="l00545"></a>00545 <span class="keywordflow">return</span>; <a name="l00546"></a>00546 } <a name="l00547"></a>00547 <a name="l00552"></a><a class="code" href="exec_8c.html#094c23346b6d226a03866a54b755ed64">00552</a> <span class="keywordtype">void</span> <a class="code" href="exec_8h.html#094c23346b6d226a03866a54b755ed64">sys_exec</a>(<span class="keywordtype">char</span> *<a class="code" href="structfile.html">file</a>,<span class="keywordtype">char</span> *ap) { <a name="l00553"></a>00553 <span class="keywordtype">int</span> error = 0x0; <a name="l00554"></a>00554 <span class="keywordtype">int</span> i = 0x0; <a name="l00555"></a>00555 <span class="keywordtype">int</span> x = 0x0; <a name="l00556"></a>00556 <span class="keywordtype">int</span> argc = 0x0; <a name="l00557"></a>00557 <a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a> seg_size = 0x0; <a name="l00558"></a>00558 <a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a> seg_addr = 0x0; <a name="l00559"></a>00559 <a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a> addr = 0x0; <a name="l00560"></a>00560 <a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a> <a class="code" href="structi386__frame.html#ef87f1d1d6f1ad030c95773e7eedfa16">eip</a> = 0x0; <a name="l00561"></a>00561 <a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a> proghdr = 0x0; <a name="l00562"></a>00562 <span class="keywordtype">char</span> *args = 0x0; <a name="l00563"></a>00563 <span class="keywordtype">char</span> *interp = 0x0; <a name="l00564"></a>00564 <span class="keywordtype">char</span> **argv = 0x0; <a name="l00565"></a>00565 <span class="keywordtype">char</span> **argvNew = 0x0; <a name="l00566"></a>00566 <a class="code" href="structelfHeader.html">elfHeader</a> *binaryHeader = 0x0; <a name="l00567"></a>00567 <a class="code" href="structelfProgramHeader.html">elfProgramHeader</a> *programHeader = 0x0; <a name="l00568"></a>00568 <span class="keyword">struct </span><a class="code" href="structi386__frame.html">i386_frame</a> *iFrame = 0x0; <a name="l00569"></a>00569 <a class="code" href="structElf__Auxargs.html">Elf_Auxargs</a> *auxargs = 0x0; <a name="l00570"></a>00570 <a name="l00571"></a>00571 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a> = <a class="code" href="file_8h.html#d6a41ac88a7d46d574e8a675fdde136c">fopen</a>(file,<span class="stringliteral">"r"</span>); <a name="l00572"></a>00572 <span class="keywordflow">if</span> (<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a> == 0x0) <a name="l00573"></a>00573 <span class="keywordflow">return</span>(-1); <a name="l00574"></a>00574 <a name="l00575"></a>00575 <span class="comment">/* Load the ELF header */</span> <a name="l00576"></a>00576 <span class="keywordflow">if</span> ((binaryHeader = (<a class="code" href="structelfHeader.html">elfHeader</a> *)<a class="code" href="kmalloc_8h.html#150eab2ac4ce4553e21ca10e7f441762">kmalloc</a>(<span class="keyword">sizeof</span>(<a class="code" href="structelfHeader.html">elfHeader</a>))) == 0x0) <a name="l00577"></a>00577 <a class="code" href="kpanic_8h.html#a5193288597f00c4f8e3b2939aa6c0ce">K_PANIC</a>(<span class="stringliteral">"malloc failed!"</span>); <a name="l00578"></a>00578 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>(binaryHeader,<span class="keyword">sizeof</span>(elfHeader),1,<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a>); <a name="l00579"></a>00579 <a name="l00580"></a>00580 <span class="comment">/* Check If App Is A Real Application */</span> <a name="l00581"></a>00581 <span class="keywordflow">if</span> (((binaryHeader-><a class="code" href="structelfHeader.html#ec74b71d266bdbfaed95a9241343c28c">eIdent</a>[1] != <span class="charliteral">'E'</span>) && (binaryHeader-><a class="code" href="structelfHeader.html#ec74b71d266bdbfaed95a9241343c28c">eIdent</a>[2] != <span class="charliteral">'L'</span>) && (binaryHeader-><a class="code" href="structelfHeader.html#ec74b71d266bdbfaed95a9241343c28c">eIdent</a>[3] != <span class="charliteral">'F'</span>)) || (binaryHeader-><a class="code" href="structelfHeader.html#34e52f945d79cca21dc50a8aef79f9e8">eType</a> != <a class="code" href="elf_8h.html#942478985eb016311380dee473cc8c3e">ET_EXEC</a>)) { <a name="l00582"></a>00582 <a class="code" href="kmalloc_8h.html#aa9ed6886459604cf73ccdbf6410e487">kfree</a>(binaryHeader); <a name="l00583"></a>00583 <a class="code" href="file_8h.html#872c22366b4c63f4bdb10cd3b7980b11">fclose</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a>); <a name="l00584"></a>00584 <span class="keywordflow">return</span>(-1); <a name="l00585"></a>00585 } <a name="l00586"></a>00586 <a name="l00587"></a>00587 <span class="comment">/* Load The Program Header(s) */</span> <a name="l00588"></a>00588 <span class="keywordflow">if</span> ((programHeader = (<a class="code" href="structelfProgramHeader.html">elfProgramHeader</a> *)<a class="code" href="kmalloc_8h.html#150eab2ac4ce4553e21ca10e7f441762">kmalloc</a>(<span class="keyword">sizeof</span>(<a class="code" href="structelfProgramHeader.html">elfProgramHeader</a>)*binaryHeader-><a class="code" href="structelfHeader.html#4635401868104caa04fcb5bb60840df6">ePhnum</a>)) == 0x0) <a name="l00589"></a>00589 <a class="code" href="kpanic_8h.html#a5193288597f00c4f8e3b2939aa6c0ce">K_PANIC</a>(<span class="stringliteral">"malloc failed!"</span>); <a name="l00590"></a>00590 <a class="code" href="file_8h.html#80528d8335cd52755f5d6a92e4f08391">fseek</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a>,binaryHeader-><a class="code" href="structelfHeader.html#aff1ff2cb64932f1e1a1f6cf3b881787">ePhoff</a>,0); <a name="l00591"></a>00591 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>(programHeader,(<span class="keyword">sizeof</span>(elfProgramHeader)*binaryHeader-><a class="code" href="structelfHeader.html#4635401868104caa04fcb5bb60840df6">ePhnum</a>),1,<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a>); <a name="l00592"></a>00592 <a name="l00593"></a>00593 <span class="comment">/* Loop Through The Header And Load Sections Which Need To Be Loaded */</span> <a name="l00594"></a>00594 <span class="keywordflow">for</span> (i = 0x0;i < binaryHeader-><a class="code" href="structelfHeader.html#4635401868104caa04fcb5bb60840df6">ePhnum</a>;i++) { <a name="l00595"></a>00595 <span class="keywordflow">switch</span> (programHeader[i].phType) { <a name="l00596"></a>00596 <span class="keywordflow">case</span> <a class="code" href="elf_8h.html#84d7768fd6c6ece599d297090900cf92">PT_LOAD</a>: <a name="l00597"></a>00597 seg_addr = <a class="code" href="paging_8h.html#bd636a9b61ad98f4fc23b1f4a9210d78">trunc_page</a>(programHeader[i].phVaddr); <a name="l00598"></a>00598 seg_size = <a class="code" href="paging_8h.html#2702263fcf2b3b026cb26c6d895cb0ee">round_page</a>(programHeader[i].phMemsz + programHeader[i].phVaddr - seg_addr); <a name="l00599"></a>00599 <a name="l00600"></a>00600 <span class="comment">/*</span> <a name="l00601"></a>00601 <span class="comment"> Allocate Memory Im Going To Have To Make This Load Memory With Correct</span> <a name="l00602"></a>00602 <span class="comment"> Settings so it helps us in the future</span> <a name="l00603"></a>00603 <span class="comment"> */</span> <a name="l00604"></a>00604 <span class="keywordflow">for</span> (x = 0x0;x < (programHeader[i].<a class="code" href="structelfProgramHeader.html#b5a140ab0f0225a8459f88d905995dd0">phMemsz</a>);x += 0x1000) { <a name="l00605"></a>00605 <span class="comment">/* Make readonly and read/write !!! */</span> <a name="l00606"></a>00606 <span class="keywordflow">if</span> (<a class="code" href="paging_8h.html#a05f8d8947fb5bcec87fc6661f83243e">vmm_remapPage</a>(<a class="code" href="vmm_8h.html#976cf3919bf7c77c868021ec9374593b">vmmFindFreePage</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>),((programHeader[i].<a class="code" href="structelfProgramHeader.html#14f11176e999131fb9be875aeb500447">phVaddr</a> & 0xFFFFF000) + x),<a class="code" href="paging_8h.html#f0fff7a38cd2c7a32d580787423b94ea">PAGE_DEFAULT</a>) == 0x0) <a name="l00607"></a>00607 <a class="code" href="kpanic_8h.html#a5193288597f00c4f8e3b2939aa6c0ce">K_PANIC</a>(<span class="stringliteral">"Error: Remap Page Failed"</span>); <a name="l00608"></a>00608 <a class="code" href="lib_2string_8h.html#ce4b911463887af5e748326323e99a23">memset</a>((<span class="keywordtype">void</span> *)((programHeader[i].phVaddr & 0xFFFFF000) + x),0x0,0<a class="code" href="ap-boot_8S.html#f78b91f02427adef14bb8b28aa93baa5">x1000</a>); <a name="l00609"></a>00609 } <a name="l00610"></a>00610 <a name="l00611"></a>00611 <span class="comment">/* Now Load Section To Memory */</span> <a name="l00612"></a>00612 <a class="code" href="file_8h.html#80528d8335cd52755f5d6a92e4f08391">fseek</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a>,programHeader[i].<a class="code" href="structelfProgramHeader.html#93a7c0296fe86a429cf58989956d28ff">phOffset</a>,0); <a name="l00613"></a>00613 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>((<span class="keywordtype">void</span> *)programHeader[i].phVaddr,programHeader[i].phFilesz,1,<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a>); <a name="l00614"></a>00614 <span class="keywordflow">if</span> ((programHeader[i].phFlags & 0x2) != 0x2) { <a name="l00615"></a>00615 <span class="keywordflow">for</span> (x = 0x0;x < (programHeader[i].<a class="code" href="structelfProgramHeader.html#b5a140ab0f0225a8459f88d905995dd0">phMemsz</a>);x += 0x1000) { <a name="l00616"></a>00616 <span class="keywordflow">if</span> ((<a class="code" href="paging_8h.html#1913e8607a69ecf446b18fa1cd36c9cc">vmm_setPageAttributes</a>((programHeader[i].phVaddr & 0xFFFFF000) + x,<a class="code" href="paging_8h.html#122dfc414a40e260fd35dbe9743db26f">PAGE_PRESENT</a> | <a class="code" href="paging_8h.html#2d0253527ea5080d6befe0ee3bde473f">PAGE_USER</a>)) != 0x0) <a name="l00617"></a>00617 <a class="code" href="kpanic_8h.html#a5193288597f00c4f8e3b2939aa6c0ce">K_PANIC</a>(<span class="stringliteral">"vmm_setPageAttributes failed"</span>); <a name="l00618"></a>00618 } <a name="l00619"></a>00619 } <a name="l00620"></a>00620 <span class="keywordflow">if</span> (binaryHeader-><a class="code" href="structelfHeader.html#8ff3dd1b27053bc5a2f01afe5403e53b">eEntry</a> >= programHeader[i].<a class="code" href="structelfProgramHeader.html#14f11176e999131fb9be875aeb500447">phVaddr</a> && binaryHeader-><a class="code" href="structelfHeader.html#8ff3dd1b27053bc5a2f01afe5403e53b">eEntry</a> < (programHeader[i].<a class="code" href="structelfProgramHeader.html#14f11176e999131fb9be875aeb500447">phVaddr</a> + programHeader[i].<a class="code" href="structelfProgramHeader.html#b5a140ab0f0225a8459f88d905995dd0">phMemsz</a>)) { <a name="l00621"></a>00621 <span class="comment">/* We're suposed to do something here? */</span> <a name="l00622"></a>00622 } <a name="l00623"></a>00623 <span class="keywordflow">else</span> { <a name="l00624"></a>00624 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#4ce0e0e5856efc85e111d2cb8748a0ee">vm_dsize</a> = seg_size >> <a class="code" href="paging_8h.html#850d80ca2291d26b40dc6b25c419f81a">PAGE_SHIFT</a>; <a name="l00625"></a>00625 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#c770300b493b2ea844e634b7c98c4f6a">vm_daddr</a> = (<span class="keywordtype">char</span> *)seg_addr; <a name="l00626"></a>00626 } <a name="l00627"></a>00627 <a name="l00628"></a>00628 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#0933c70230d4ac8bc9953640c979f8d7">oInfo</a>.<a class="code" href="structosInfo.html#2833c1fa4a221941b5d1141dfa5beefd">vmStart</a> = ((programHeader[i].<a class="code" href="structelfProgramHeader.html#14f11176e999131fb9be875aeb500447">phVaddr</a> & 0xFFFFF000) + 0xA900000); <a name="l00629"></a>00629 <span class="keywordflow">break</span>; <a name="l00630"></a>00630 <span class="keywordflow">case</span> <a class="code" href="elf_8h.html#bcd3aa15bc567949c1ab6b1abc137710">PT_INTERP</a>: <a name="l00631"></a>00631 interp = (<span class="keywordtype">char</span> *)<a class="code" href="kmalloc_8h.html#150eab2ac4ce4553e21ca10e7f441762">kmalloc</a>(programHeader[i].phFilesz); <a name="l00632"></a>00632 <span class="keywordflow">if</span> (interp == 0x0) <a name="l00633"></a>00633 <a class="code" href="kpanic_8h.html#a5193288597f00c4f8e3b2939aa6c0ce">K_PANIC</a>(<span class="stringliteral">"malloc failed"</span>); <a name="l00634"></a>00634 <a name="l00635"></a>00635 <a class="code" href="file_8h.html#80528d8335cd52755f5d6a92e4f08391">fseek</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a>,programHeader[i].<a class="code" href="structelfProgramHeader.html#93a7c0296fe86a429cf58989956d28ff">phOffset</a>,0); <a name="l00636"></a>00636 <a class="code" href="file_8h.html#3b06878a03209e88c008c77234b89359">fread</a>((<span class="keywordtype">void</span> *)interp,programHeader[i].phFilesz,1,<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#7930577bf37a9eb337761a9374def70e">imageFd</a>); <a name="l00637"></a>00637 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"Interp: [%s]\n"</span>,interp); <a name="l00638"></a>00638 <span class="comment">//ldAddr = ldEnable();</span> <a name="l00639"></a>00639 <span class="keywordflow">break</span>; <a name="l00640"></a>00640 <span class="keywordflow">case</span> <a class="code" href="elf_8h.html#58ff00be749ca4000074f9b9066a1056">PT_PHDR</a>: <a name="l00641"></a>00641 proghdr = programHeader[i].<a class="code" href="structelfProgramHeader.html#14f11176e999131fb9be875aeb500447">phVaddr</a>; <a name="l00642"></a>00642 <span class="keywordflow">break</span>; <a name="l00643"></a>00643 <span class="keywordflow">default</span>: <a name="l00644"></a>00644 <span class="keywordflow">break</span>; <a name="l00645"></a>00645 } <a name="l00646"></a>00646 } <a name="l00647"></a>00647 <a name="l00648"></a>00648 addr = <a class="code" href="kmod_8h.html#f4d6f389174a00e0de80e1ea0e23e956">LD_START</a>; <a name="l00649"></a>00649 <a name="l00650"></a>00650 <a name="l00651"></a>00651 <span class="keywordflow">if</span> (interp != 0x0) { <a name="l00652"></a>00652 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"TEST"</span>); <a name="l00653"></a>00653 <a class="code" href="elf_8h.html#f11ec9e50bcff723428b0c911a177fd0">elf_loadfile</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>,interp,&addr,&<a class="code" href="structi386__frame.html#ef87f1d1d6f1ad030c95773e7eedfa16">eip</a>); <a name="l00654"></a>00654 } <a name="l00655"></a>00655 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"[0x%X][0x%X]\n"</span>,<a class="code" href="structi386__frame.html#ef87f1d1d6f1ad030c95773e7eedfa16">eip</a>,addr); <a name="l00656"></a>00656 <a name="l00657"></a>00657 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#4ce0e0e5856efc85e111d2cb8748a0ee">vm_dsize</a> = seg_size >> <a class="code" href="paging_8h.html#850d80ca2291d26b40dc6b25c419f81a">PAGE_SHIFT</a>; <a name="l00658"></a>00658 <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#c770300b493b2ea844e634b7c98c4f6a">vm_daddr</a> = (<span class="keywordtype">char</span> *)seg_addr; <a name="l00659"></a>00659 <a name="l00660"></a>00660 argv = ap; <a name="l00661"></a>00661 <a name="l00662"></a>00662 <span class="keywordflow">if</span> (argv[1] != 0x0) { <a name="l00663"></a>00663 argc = argv[0]; <a name="l00664"></a>00664 args = (<span class="keywordtype">char</span> *)<a class="code" href="paging_8h.html#4b324672c4b25064eb8db1e3419337b1">vmmGetFreeVirtualPage</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#30966587a60db6b40c8be6c387e11d81">id</a>,1,<a class="code" href="paging_8h.html#59a518704bf2f0b56603476bcb1eebbf">VM_TASK</a>); <a name="l00665"></a>00665 <a class="code" href="lib_2string_8h.html#ce4b911463887af5e748326323e99a23">memset</a>(args,0x0,0<a class="code" href="ap-boot_8S.html#f78b91f02427adef14bb8b28aa93baa5">x1000</a>); <a name="l00666"></a>00666 x = 0x0; <a name="l00667"></a>00667 argvNew = (<span class="keywordtype">char</span> **)<a class="code" href="kmalloc_8h.html#150eab2ac4ce4553e21ca10e7f441762">kmalloc</a>(<span class="keyword">sizeof</span>(<span class="keywordtype">char</span> *) * argc); <a name="l00668"></a>00668 <span class="keywordflow">for</span> (i = 0x0;i < argc;i++) { <a name="l00669"></a>00669 <a class="code" href="strcpy_8S.html#9132520cc79236b654666f4ddc1b516c">strcpy</a>(args + x,argv[i + 1]); <a name="l00670"></a>00670 argvNew[i] = args + x; <a name="l00671"></a>00671 x += <a class="code" href="strlen_8S.html#0bcafbeba7f59f157715cc462036b8d3">strlen</a>(argv[i + 1]) + 1; <a name="l00672"></a>00672 } <a name="l00673"></a>00673 argv = argvNew; <a name="l00674"></a>00674 } <a name="l00675"></a>00675 <a name="l00677"></a>00677 <a class="code" href="paging_8c.html#0444c8635648fabdbd6e702137aa1723">vmm_cleanVirtualSpace</a>(<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#c770300b493b2ea844e634b7c98c4f6a">vm_daddr</a> + (<a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#481c2e7084fec272e616d3fb984036e2">td</a>.<a class="code" href="structthread.html#4ce0e0e5856efc85e111d2cb8748a0ee">vm_dsize</a> << <a class="code" href="paging_8h.html#7d467c1d283fdfa1f2081ba1e0d01b6e">PAGE_SIZE</a>)); <a name="l00678"></a>00678 <a name="l00679"></a>00679 <a name="l00681"></a>00681 iFrame = <a class="code" href="sched_8h.html#54397bfe18d5da4d50ff03b15f540858">_current</a>-><a class="code" href="structtaskStruct.html#4c8accd7c0d5bb5ce426dc982bfc8519">tss</a>.<a class="code" href="structtssStruct.html#1017372aed82d7305586c330fa222b3b">esp0</a> - <span class="keyword">sizeof</span>(<span class="keyword">struct </span><a class="code" href="structi386__frame.html">i386_frame</a>); <a name="l00682"></a>00682 iFrame->ebp = <a class="code" href="exec_8c.html#d93dccba62fb5241c0b7cebcd097794a">STACK_ADDR</a>; <a name="l00683"></a>00683 iFrame->eip = <a class="code" href="structi386__frame.html#ef87f1d1d6f1ad030c95773e7eedfa16">eip</a>; <a name="l00684"></a>00684 <a name="l00685"></a>00685 <span class="comment">//if (_current->id > 3) {</span> <a name="l00686"></a>00686 <a name="l00687"></a>00687 iFrame->user_esp = ((<a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a>)<a class="code" href="exec_8c.html#d93dccba62fb5241c0b7cebcd097794a">STACK_ADDR</a>) - (<span class="keyword">sizeof</span>(<a class="code" href="types_8h.html#ba29fd78d95cce0ecb249c24b58d07da">u_int32_t</a>) * (argc + 3 + <span class="keyword">sizeof</span>(<a class="code" href="structElf__Auxargs.html">Elf_Auxargs</a>))); <a name="l00688"></a>00688 args = iFrame->user_esp; <a name="l00689"></a>00689 <a name="l00691"></a>00691 args[0] = argc; <a name="l00692"></a>00692 <span class="keywordflow">for</span> (i = 0;i < argc;i++) { <a name="l00693"></a>00693 args[i + 1] = argv[i]; <a name="l00694"></a>00694 } <a name="l00696"></a>00696 args[argc + 2] = 0x0; <a name="l00697"></a>00697 auxargs = iFrame->user_esp + argc + 2; <a name="l00698"></a>00698 auxargs->execfd = -1; <a name="l00699"></a>00699 auxargs->phdr = proghdr; <a name="l00700"></a>00700 auxargs->phent = binaryHeader->ePhentsize; <a name="l00701"></a>00701 auxargs->phnum = binaryHeader->ePhnum; <a name="l00702"></a>00702 auxargs->pagesz = <a class="code" href="paging_8h.html#7d467c1d283fdfa1f2081ba1e0d01b6e">PAGE_SIZE</a>; <a name="l00703"></a>00703 auxargs->base = addr; <a name="l00704"></a>00704 auxargs->flags = 0x0; <a name="l00705"></a>00705 auxargs->entry = binaryHeader->eEntry; <a name="l00706"></a>00706 auxargs->trace = 0x0; <a name="l00707"></a>00707 <a class="code" href="kprint_8h.html#b2761bdf0cca73ad0fb5880895210cd8">kprintf</a>(<span class="stringliteral">"\n\nDOH\n\n"</span>); <a name="l00708"></a>00708 <a name="l00709"></a>00709 <span class="comment">//while (1);</span> <a name="l00710"></a>00710 <span class="comment">/*</span> <a name="l00711"></a>00711 <span class="comment"> error = elf_loadfile(_current,file,0x0,0x0);</span> <a name="l00712"></a>00712 <span class="comment"> if (error)</span> <a name="l00713"></a>00713 <span class="comment"> K_PANIC("elf_loadfile failed");</span> <a name="l00714"></a>00714 <span class="comment">*/</span> <a name="l00715"></a>00715 <span class="keywordflow">return</span>; <a name="l00716"></a>00716 } <a name="l00717"></a>00717 <a name="l00718"></a>00718 <span class="comment">/***</span> <a name="l00719"></a>00719 <span class="comment"> END</span> <a name="l00720"></a>00720 <span class="comment"> ***/</span> </pre></div><hr size="1"><address style="align: right;"><small>Generated on Fri Dec 15 11:18:55 2006 for UbixOS V2 by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.7 </small></address> </body> </html>