%!PS-Adobe-3.0 %%LanguageLevel: 2 %%DocumentSuppliedResources: (atend) %%DocumentMedia: plain 612 792 0 () () %%BoundingBox: 0 0 612 792 %%Pages: 80 %%EndComments %%BeginDefaults %%PageMedia: plain %%EndDefaults %%BeginProlog %%BeginResource: procset xpdf 3.00 0 %%Copyright: Copyright 1996-2004 Glyph & Cog, LLC /xpdf 75 dict def xpdf begin % PDF special state /pdfDictSize 15 def /pdfSetup { 3 1 roll 2 array astore /setpagedevice where { pop 3 dict begin /PageSize exch def /ImagingBBox null def /Policies 1 dict dup begin /PageSize 3 def end def { /Duplex true def } if currentdict end setpagedevice } { pop pop } ifelse } def /pdfStartPage { pdfDictSize dict begin /pdfFillCS [] def /pdfFillXform {} def /pdfStrokeCS [] def /pdfStrokeXform {} def /pdfFill [0] def /pdfStroke [0] def /pdfFillOP false def /pdfStrokeOP false def /pdfLastFill false def /pdfLastStroke false def /pdfTextMat [1 0 0 1 0 0] def /pdfFontSize 0 def /pdfCharSpacing 0 def /pdfTextRender 0 def /pdfTextRise 0 def /pdfWordSpacing 0 def /pdfHorizScaling 1 def /pdfTextClipPath [] def } def /pdfEndPage { end } def % PDF color state /cs { /pdfFillXform exch def dup /pdfFillCS exch def setcolorspace } def /CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def setcolorspace } def /sc { pdfLastFill not { pdfFillCS setcolorspace } if dup /pdfFill exch def aload pop pdfFillXform setcolor /pdfLastFill true def /pdfLastStroke false def } def /SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if dup /pdfStroke exch def aload pop pdfStrokeXform setcolor /pdfLastStroke true def /pdfLastFill false def } def /op { /pdfFillOP exch def pdfLastFill { pdfFillOP setoverprint } if } def /OP { /pdfStrokeOP exch def pdfLastStroke { pdfStrokeOP setoverprint } if } def /fCol { pdfLastFill not { pdfFillCS setcolorspace pdfFill aload pop pdfFillXform setcolor pdfFillOP setoverprint /pdfLastFill true def /pdfLastStroke false def } if } def /sCol { pdfLastStroke not { pdfStrokeCS setcolorspace pdfStroke aload pop pdfStrokeXform setcolor pdfStrokeOP setoverprint /pdfLastStroke true def /pdfLastFill false def } if } def % build a font /pdfMakeFont { 4 3 roll findfont 4 2 roll matrix scale makefont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /Encoding exch def currentdict end definefont pop } def /pdfMakeFont16 { exch findfont dup length dict begin { 1 index /FID ne { def } { pop pop } ifelse } forall /WMode exch def currentdict end definefont pop } def % graphics state operators /q { gsave pdfDictSize dict begin } def /Q { end grestore /pdfLastFill where { pop pdfLastFill { pdfFillOP setoverprint } { pdfStrokeOP setoverprint } ifelse } if } def /cm { concat } def /d { setdash } def /i { setflat } def /j { setlinejoin } def /J { setlinecap } def /M { setmiterlimit } def /w { setlinewidth } def % path segment operators /m { moveto } def /l { lineto } def /c { curveto } def /re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath } def /h { closepath } def % path painting operators /S { sCol stroke } def /Sf { fCol stroke } def /f { fCol fill } def /f* { fCol eofill } def % clipping operators /W { clip newpath } def /W* { eoclip newpath } def /Ws { strokepath clip newpath } def % text state operators /Tc { /pdfCharSpacing exch def } def /Tf { dup /pdfFontSize exch def dup pdfHorizScaling mul exch matrix scale pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put exch findfont exch makefont setfont } def /Tr { /pdfTextRender exch def } def /Ts { /pdfTextRise exch def } def /Tw { /pdfWordSpacing exch def } def /Tz { /pdfHorizScaling exch def } def % text positioning operators /Td { pdfTextMat transform moveto } def /Tm { /pdfTextMat exch def } def % text string operators /cshow where { pop /cshow2 { dup { pop pop 1 string dup 0 3 index put 3 index exec } exch cshow pop pop } def }{ /cshow2 { currentfont /FontType get 0 eq { 0 2 2 index length 1 sub { 2 copy get exch 1 add 2 index exch get 2 copy exch 256 mul add 2 string dup 0 6 5 roll put dup 1 5 4 roll put 3 index exec } for } { dup { 1 string dup 0 3 index put 3 index exec } forall } ifelse pop pop } def } ifelse /awcp { exch { false charpath 5 index 5 index rmoveto 6 index eq { 7 index 7 index rmoveto } if } exch cshow2 6 {pop} repeat } def /Tj { fCol 1 index stringwidth pdfTextMat idtransform pop sub 1 index length dup 0 ne { div } { pop pop 0 } ifelse pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 pdfTextMat dtransform 6 5 roll Tj1 } def /Tj16 { fCol 2 index stringwidth pdfTextMat idtransform pop sub exch div pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0 pdfTextMat dtransform 6 5 roll Tj1 } def /Tj16V { fCol 2 index stringwidth pdfTextMat idtransform exch pop sub exch div 0 pdfWordSpacing pdfTextMat dtransform 32 4 3 roll pdfCharSpacing add 0 exch pdfTextMat dtransform 6 5 roll Tj1 } def /Tj1 { 0 pdfTextRise pdfTextMat dtransform rmoveto currentpoint 8 2 roll pdfTextRender 1 and 0 eq { 6 copy awidthshow } if pdfTextRender 3 and dup 1 eq exch 2 eq or { 7 index 7 index moveto 6 copy currentfont /FontType get 3 eq { fCol } { sCol } ifelse false awcp currentpoint stroke moveto } if pdfTextRender 4 and 0 ne { 8 6 roll moveto false awcp /pdfTextClipPath [ pdfTextClipPath aload pop {/moveto cvx} {/lineto cvx} {/curveto cvx} {/closepath cvx} pathforall ] def currentpoint newpath moveto } { 8 {pop} repeat } ifelse 0 pdfTextRise neg pdfTextMat dtransform rmoveto } def /TJm { pdfFontSize 0.001 mul mul neg 0 pdfTextMat dtransform rmoveto } def /TJmV { pdfFontSize 0.001 mul mul neg 0 exch pdfTextMat dtransform rmoveto } def /Tclip { pdfTextClipPath cvx exec clip newpath /pdfTextClipPath [] def } def % Level 2 image operators /pdfImBuf 100 string def /pdfIm { image { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pdfImM { fCol imagemask { currentfile pdfImBuf readline not { pop exit } if (%-EOD-) eq { exit } if } loop } def /pr { 2 index 2 index 3 2 roll putinterval 4 add } def /pdfImClip { gsave 0 2 4 index length 1 sub { dup 4 index exch 2 copy get 5 index div put 1 add 3 index exch 2 copy get 3 index div put } for pop pop rectclip } def /pdfImClipEnd { grestore } def % shading operators /colordelta { false 0 1 3 index length 1 sub { dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { pop true } if } for exch pop exch pop } def /funcCol { func n array astore } def /funcSH { dup 0 eq { true } { dup 6 eq { false } { 4 index 4 index funcCol dup 6 index 4 index funcCol dup 3 1 roll colordelta 3 1 roll 5 index 5 index funcCol dup 3 1 roll colordelta 3 1 roll 6 index 8 index funcCol dup 3 1 roll colordelta 3 1 roll colordelta or or or } ifelse } ifelse { 1 add 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch 6 index 6 index 4 index 4 index 4 index funcSH 2 index 6 index 6 index 4 index 4 index funcSH 6 index 2 index 4 index 6 index 4 index funcSH 5 3 roll 3 2 roll funcSH pop pop } { pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul funcCol sc dup 4 index exch mat transform m 3 index 3 index mat transform l 1 index 3 index mat transform l mat transform l pop pop h f* } ifelse } def /axialCol { dup 0 lt { pop t0 } { dup 1 gt { pop t1 } { dt mul t0 add } ifelse } ifelse func n array astore } def /axialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index axialCol 2 index axialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index axialSH exch 3 2 roll axialSH } { pop 2 copy add 0.5 mul axialCol sc exch dup dx mul x0 add exch dy mul y0 add 3 2 roll dup dx mul x0 add exch dy mul y0 add dx abs dy abs ge { 2 copy yMin sub dy mul dx div add yMin m yMax sub dy mul dx div add yMax l 2 copy yMax sub dy mul dx div add yMax l yMin sub dy mul dx div add yMin l h f* } { exch 2 copy xMin sub dx mul dy div add xMin exch m xMax sub dx mul dy div add xMax exch l exch 2 copy xMax sub dx mul dy div add xMax exch l xMin sub dx mul dy div add xMin exch l h f* } ifelse } ifelse } def /radialCol { dup t0 lt { pop t0 } { dup t1 gt { pop t1 } if } ifelse func n array astore } def /radialSH { dup 0 eq { true } { dup 8 eq { false } { 2 index dt mul t0 add radialCol 2 index dt mul t0 add radialCol colordelta } ifelse } ifelse { 1 add 3 1 roll 2 copy add 0.5 mul dup 4 3 roll exch 4 index radialSH exch 3 2 roll radialSH } { pop 2 copy add 0.5 mul dt mul t0 add radialCol sc encl { exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 0 360 arc h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add 360 0 arcn h f } { 2 copy dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arcn dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arcn h dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a1 a2 arc dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add a2 a1 arc h f } ifelse } ifelse } def end %%EndResource %%EndProlog %%BeginSetup xpdf begin %%BeginResource: font YLWBJI+LucidaSans-Typewriter83 %!FontType1-1.0: YLWBJI+LucidaSans-Typewriter83 12 dict begin /FontInfo 10 dict dup begin /Notice (Copyright (c) 1991 Bigelow & Holmes Inc. and Y&Y, Inc. (508) 371-3286. All Rights Reserved.) readonly def /FullName (Lucida Sans Typewriter 83) readonly def /FamilyName (LucidaSansTypewriter83) readonly def /isFixedPitch true def /ItalicAngle 0 def /UnderlinePosition 0 def /UnderlineThickness 0 def end readonly def /FontName /YLWBJI+LucidaSans-Typewriter83 def /PaintType 0 def /FontType 1 def /FontMatrix [0.00083333 0 0 0.00083333 0 0] readonly def /FontBBox [0 -205 602 783] readonly def /StrokeWidth 0 def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 32 /space put dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /minus put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 94 /asciicircum put dup 95 /underscore put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put readonly def currentdict end currentfile eexec 5AA4F71255501637F1A431BAB555283D093E1B588B45B0281559110D21315C62 BD638C6B34BA54AA75227715D9947EBCD51A104CAEA657499E94138F5645BF68 368BB1B1EC8E4776F067FFF2CE9B89FB7E63A7DB304498C1036D399C47A4CB79 BD517EDB02BEB90195FD7DDAF3E839BCE2DB156D9337DBB2305A465B3E0FFB97 1985C79DC71C47E26F9F0F042B2CDEE97B679358059256FB93D662D43C7ECB5B 1A564DFCECB963478373C69F52172F071E0AA6082A3E10D9E1CE2851CFA210EE 7BD5FCB1AAE15E89D1FB339D587D218B89C18A32F47C7451A80CB1FC07CF5EF5 C2A9054AD59AE4D5522D8745045620C9C40EAB675A6FE53511D83C04968F37DE 389C3A7A551DC79580FF1B382205C5951A9F8E7B6CEF33E027D608C14A394033 1E603A09B3061B66BB71AC1D2A232B5F2BC9481D7D44F334ACCBBF6537EF8BC7 075D89E6422C4E0A415BF3A1B001A284566A4DF8C6877CB0C70D67F5E7FA25E1 90435DC2AFD452D1184CEA4CBF9F81F8CD7BE3B6EBA8395A40925FDDEB186DE2 AB0372CF67C17BEE733C73CA29E00C3909E960A0417FCACC7211EBF3DD7225F0 6F4FB7DBA35BF59A21014E1066BF090958F991C2BFD22CCA4189376B0BBFE928 8CE7E8D06A551258E5938EB0F85097E557F3C3BA2C163A2E572B4DF44E90CDF5 0B39625CC6ACE15BC6517F8A12C1B93F074CC50585B9AB7EDD0B9C5C1A62B70D CD8DB8D38BE368A472453A6857C6BD02D53075513414D13BA1A24CE212F22191 07B898A9017A3A99BDADF041BED9A114BD03BB18F7DE5A50740B185E422B8C48 309D6D5FE5EA50CC3F908AFA26EE4DEC39EBC3D70FF3BB8B3A3A944A0DCC6146 32AE70E4FAF468F45769385AA9CE3AEDE458C88F9FE607FF162B8F190654854A F7C4EF574ABFF28A9A3305771590FCC4ABD946870EB84C1936CA19FD940EE6AE 640BC281178A404CC709C437E17C61CABA72E94D3B9BE9F187B807D43F883E55 1AC39D4BE693E7341918F23D76809DFD06A103726057B354B409C08830817659 428E7F09A6016535CA1C526AAE92B7D90B7AD619269EB3A6DEEE48BF53C6C228 C705837B10C2402ED51A306E771911A1016D089DF42372D756E2346265E01962 B0E784394FEA778F473FE994F2CB393B6C04DB967C8F585947A3F30329F66169 59627B9268FDEF0DEDD35B31B7D0345E708C959739676FB4CE239AB72D834D51 E679B4152852C1BA90E23BE472742369FAF00ED1E82BB6ECD8A09CF36B2E57D0 AEAAB95A829A7E793F38C4D0E6A1355BB9C6AE4F0ADF76BBAE901546ECB36D1E 7C5650A7999BAAFD6181C1CFECFEA39A2D51C26CA3CC2BAB6EBEB0D31D3532DD 6A6A565A56A6A01E04ED68112910A0D608024AEEEC0D0F389B5441D0E126935E 2063B9150A40657F1C88FC5F4BE2C06AE21167DA0F59E651CEDA2CB33349FBF4 6F5642DE2B5DDFDCF0C0A172D0D1407FDC7C65FF3814709188F506A53C404A19 02FE1637895E943792E22E22E5D4BCBD766D18D1088F2A11459139D370D4ADBB 8BC75909D8A85C8E2E85948DEFB74401BF22A6DA4C14C09F1C8F0DF829F1970B AE6B468573DC729139A2971EB56517AA6D6525E46B5F9930108C7D4B951EB0C4 707E410574E7195FA7297A29E6D8B5ABD78A15CD0135F3BD612AD12BB0D154CD 86556BACB23743FFE1774040A1C435CF8E4409E75CEE0F028FD12BE41556CC6E 6C850B9053E699C71557FD6B20D83F0BBF57D935CFEDA809B03FD14478C2A8C7 6609217B9F289342990C415257D8CA8A5174589B50AC913FCE33A9F32CF42140 F323ED26DD43970B21107F814F9F2CA21C6A88474BDF5EF924956086CB6BC729 3FBDB874B7A414B14B6BAEACAE671F7944DCC75422E1630F78732131F85ED6BB 3662518EB04A41F4938B1383CFBEDDEED4096C7615CF8D72101D311FCC95D874 2C40F7FA4FB122EA1B1B0746E9D808AC671A21F04F7E76A6778E25FC3844078A A2A7B87206B299A27BAE8A89530B3D46579AAFCD5B03EAE3429E4B4BAC79F41E B68DFBF1ED48C121B7D38C7A51911898175E566ED5D1AF2DBF57EB473BFC8FEA 44362C8E0CD77857D2FAFFEED06A98AE69E0A74B6B876069A460314E5B1847F8 EE66F4931FA02F5E38D6857E8D0DD3550CB0B130B75EA89B02971280911B47D1 A1E387581CF5565A4469BCCED698F1116AB57A4CAE6640E23021B10B62923A87 1E145BDE3052FCB97EA36112168DA1B986E5A524CD3879E3B59550E8311A074E CF7A58F377F7CE22CB1270BA8E009C483D43E9B728D5AD5A124A0D6635F6E9CC 53D52844E932EAC0CE58FF9A8B1A897C8DE57FC82F9C504FA222FA6BD83C7903 8F09D475F15F5AAE7C8EE65F17E580D1A1D2979894C0EA1AAA00FAB3B9CBF68A 67331607E61EADB2D9A24001B7B7E6ECADFC5BA3C8CB741413BA4D7C51A40447 DBEAB6D524D72ADE296EB5E47F416CA680181035E41D14EC6532874F1DA7EAD3 0B3A37E788CF39AF0CE722F67B2FADA9B926EBB32BA5F54651030871E19463EE 3E82753DCB3915636A6851C48B94B7A77943A04BA972A534AF5D6B9CC41330CD 6723F82581091C8121465769FA47055733456232B6DE1765EEF06223687656D5 2170B0F8CE41590BB57C4F7B136A7BCA8A5BDAA982C420FB5749320521C180B7 B8748A630DBD48884C55FCD2E7851E6BA6B81CFE27C7EBCB6D06CCC2E1BEB01D 5D8AA1287BBB1EEF9E55852223A01E2E9A0757FFBF05DCDD6C045C5B322CD9C2 51BDBE086B791721C47351C3D27057013C8600D9C229615DC859D530ED795B0C 27AE86B4E6E7BE747201229D85A77EFD944DD59444C49684CCBF506661144236 B8E38E0C1068600992ED230AF22B0CC5CA4D8BA1E3FF31F03CFC2BA540721674 C3BD926730FBF88FCFD59474EA95D4774D133379355068CBFB5AA84306E52242 467BF66E174CDEAB2CADB5D1B68F8253FDEBB6220A60668B1BCFA2C99B6B0F55 2582D2ED3D88F3E47D51179A8E78B182E7AFD1E9D659DF8AC57747D2E74F5B39 466B53A290657A325B6D6E952C5164AF7AE027914864D086BC0114F33B9D9E56 A2B8A54A0464254F71AA9D975A20CB0AD1A6DCA4290378DDFD9A7118C6AE9ED7 E050E9131C103B88CB27BE540AD84B655BCE04BE98C8B362703EC149B747CF6C 45CE28C3690755EF00A86EA467E5D57954BD85CA993A736EFE0B18AFE53A2B2F 8C7F0318388DFF640FE7D43A5803DBEB8AD80C59AE33EE163B4DBBD47C9EE083 77B76A5E4ABA6DA587687C10984D8B34F6546E8D64468D228B4C2B16BB6370D6 7D3F92714082450543341D53016172B4117C55FF506341215DD7726A6F8A217A E44F09BA273FEF22924706B0F50083C6E27B7AB6F5CE3C3EF4AFA9AE9DF17DDC 53482B05A15A136AEDF71343061C0ECAA8C935E446A5F3CF3211C29CCE5C102C CEFAF415A5B6C411B3B7B01EC97954F0616F3C1AC4740A03C387E6214FCF78B4 DD78208D75482CF9DB59A4B319A256935BE68E2E8351FEC06ED34F0CC6307571 60992C344A45D7B208C9AE1F2880A7AB0366719B029D863A9B6015E29957A5D8 3FC0A9548E25DBEBF728511CB3F4064CCDA0EAB5F7207C9816325A9932C5DC18 7B1878F89994366AB65B02C9272B75E542E6A1AF85B677A74F674B4F1F6DB606 FCF0D54594569ADBB8D98554461DEEA310182F8A42CCAAD24BA155CA17262F42 A23CF3266C925A3B28C632419864E912F5D846F26B2BA8E41680E3E759C47AE6 1F05DA9F88DD697109DE7F47AD90981E285C065CB239BBEAD6E351C936D778D5 ED2F551008D997E8614BAFFA9292F5EC1737BFDDAA3AE5F76949A7CC7A5C9885 9ED1B1FE17E56886B438B5D03198AEEA1483E261602E0ED3DE3476E2A74336B7 4BD5F912224950284A62A476292E310C3623C3FC55642B1226078D8C98B8E258 09BA085A3CBBDE128B69932DDD12C12BEFC96F698FB73C120C7E6C49196C063D AC8A0D23B3CC73770A99EF977EF93544099172992239AB7B6BF47E7EF8E0AA92 1504B4FCC0C8447257BF63808C56467228A651714BB73C36D87F135A2365F9A4 FDD65073CB982B77A2C8E583327B16681CDB8178502BF35600D063996718888A F3489512F4E33DC64E324FFCAD4396AB424A2FD8231D885379B0692386776FFE AC1242C735E7EE5CA55E3162044A430BBB5F1D5D23E8F09C883B38C653F81D3B 48922522123301079AF07E412B0D8B1B388FEC2956DBFC267711619D1B58DFAC 0D769E5551BE1D806EE8D98483F5F2B390D9B3835602EB2822C3E373016231B7 C98C540796CFA5029769A9990A4AEE3EAF11C642E57DB4F8094AE067A8743538 5D75E78C3DF3609A799195FABE087539BF9016802C8D9822E0DC3F054711DE70 3422E701C6CB98FC04550D5F22C8729650313F56BF47919DE140861C50E71133 937669C56BD769CF23003964C7364F6E2F18E3BD5E14191DD018785C13A3F687 8CE0AC2577B5E66823F19F4F67799953E8C90E0B2A57C80C0EDA7F7BAD896039 F8278D20AE307B9E6998FB1A20D8B35CC49BE10CDD1D8BCF23DB47DD4ABF0580 34E7334431E4CF87DE972E4A007FDE2BFEE70D66CBC85D0D9574264659EFB7F8 E02B5E5C655DCE6FFD54EDD844FDEFC4B39D072C188CB5A8F43CD6B2467BC9BE B44320B057A90B6A82EDCED67932DA29670662F1FE94E6D2EE1A562D19AD02B9 D8E23529EAD2627260E56CAD7951B2C982E9CCBA68F9C8B95821E470ACB9C55B 0A6C23D6E50A02F9E1D7B8C51CB20792638D0C24EEEF6F4BF271608B24A8AC96 A7D536F1D40B0B85916E2B5325A1FC7000229C8E87ED5BF56D611BBD40A42C94 4BE0B0CE264D65D2A47BB72E2B242F95157DC15A888CE0C15A8D12DC3EDCE489 53059B5D2A04FFCC2D234CFF8A16D50E7EF7C95C808ADB52B3656392CFAA2892 CEA1ADD997F67AF3526815CF1445F57856DEC918A3EF50D9634BDD22C007F0DB FEBA17DFDEFD9B60477142D7ABA06FBC976270EBD2FA9CDDA30C9994BC285FB8 1B38EC16B08B7ABAF390FDDA2561B779A03D576A8C289784442A2A8E15BDB1B2 2F26F1E0D9BD6DFF68E352D572978437DD65B882CB2720B27A782EE902A65B32 C7DF2CCEC2C3D1AE1B62BB1E506C7C4CD6F09EBFE5FA1E3A42F9D2D40CC0EF66 88D3C3BA56BD4E830FB4B096A342C82C97A13DA50908338989413607F7BD2E67 52E219C6C3954C4737BC9026DBA18FEF07A79E1CDA6820465EDB5DF4366EE92B 867E158B761270C04E3923B3DE5FCDD9D87832FF9482868A7A7EF14F4E626C5D A94903E4D8FCACBA2A8D65789D5425F3D3C77573DC2EDD7F98C9740B702A80CC F5408142674DD50707FAA48BFD1EF1DA182634E497B0D02ADA4031ECA6013E86 1D56FEA51AD28D2A6CD5D39E7D89D1609DF2A5AC3DA3CD28E99E2CE638042213 2E150804BF8190FE02A6695209C54185EE91F5FDD2DF9C71F6C8DDBA6D0A0EA6 C8CAFA0CAEAF4385B08287FF18B02F1EC6507991832DE49B691B205D937D79F1 6D1DC6C6261AFDED7539322A9F0D9A8C6DF31EF96E3D9A712ECB757E30AE7F15 39F6747AC5CA8F284238E72F143EAF13413DB8FBFC3D41445B66BF6C4741CA91 E37D58DCA65095B473EB7C726B0DCDB8E17D245BB551EE26B2DFD03F7CFA606B C14AE7CA384F7846DAE2FF9DA4C16C355BD03C40C89B162B21A4FFC8ECEE0992 A7B283B43FE8F745161D079566B92500B33C4E13792666EFB12247F9F42DE42D C587786E1C20D501968A6DDFBF4CC6A9D1A589EDEDA93C54E82D355383963B42 CD996AA920BC5956CFFD2DB72EA6BCD845A04CD09A31A9FFE1F35A68C47A157B 6C12E69C4AE9AE4F5E68E6922A714A78210DC84570CAE10C507562D952DC5F78 1A47C7ED427E8A66441F48E66DEA872F63FF179922A3AA0DD210932CE9D35A71 955DC4C50A441A813F27958519DE45E46D4D3AAC80AD068E934C4CECEDC2AB39 5B587CC0B2B80816173569E9EF949F0121DC6A34E8D221CD6A6B97355A226B45 98416C68AC75C066DE8A8C1DB4D333F63F0C04CA10D17334BAE0A17E1668FA3B 436F49D2DC0B432DBB8431CB2901894B2824D8FEBA7D2F9B451A1ED8F6C9336F 3C09AEBD5868D4967E2BBB76E547A545F8D84956BB6CB1EA251E70147A44525D 461BCDAD0EFCD4AE86B75D941517E5E0BD47AD461620C8468A45B50D42FD338B 9383611A437DA474AACCEE3258F88508290E656F32D04A25509C4067982027C1 1E1AEDE2DAFB02594436027791D0353FAEDB4E999C53A433E2659F339C4E8350 3374648805CD7684E83BD6F870F50CD8C5C9460A85E271746B3928F7960C2A33 45B45DABA86F0467201818F2747C2F2C1B1261DAC00A56CDB4C6607734C4BCDD 75C51AACF65AE8681C20E74796ECB1275952CF50C0E2E44DF9B6CA7E617F4B16 9D3796FCC53FD6AA4715E25904CDD9D99D39F3ACA8E0EE2CB32DBCD45E8DB835 100F7AF3C6355E9D1794A16C53414073403A65500F157F8A2CAF72D76200B903 A50F371BFBB8EBDCE0C3ACA4185BB2CBB90F0A2ECB48ADEDCB365FCC670B15DF 2211A605908A650FF1ECF8327D0C02C44EEFA0CA2119ECC94D8AEB9F7A3DDBC0 FFD77AB26C91753A83C9C6A199CD1522631FEFBEC1B7CD1879C234919E5065D1 6EADEA7F2DF4EE627412145049488E1439840804248BACA669B34EBFB9A37C39 8483F48CCF0D45874DB079767167FC78F690904527722737493E5A457B739D23 8B667D7D6C62F74DE846CFD1D493428F93D0D77FD4F31B8E869FEDDF44812F7F 7B2A8ABB8D6D009DE8673E9D6289B642520080E1ECD3212D74C9AEEFDAD6F03B 3AD829DDA8B769F5516989E741861FF3D74909A734FA2AC954D761E0A49E4E54 D2EAEF07200CBA1C4DBE1F07321D61D3895B3049BADC895B28E2E676F5714C6C 4C1E3F18DB8C335E20E1C110F792338FCDFBBB31E66C71DBD8EE6AFE6A040AFE A36193635100707ABCE2396A5AF4AE02651F9E392F61CAC64F82E7BBF9AA0D41 590B4D80CBCF01CB1C0D41AFB880B8F2A643BC14D4FF06395EB7DC8E2296BBB3 D31DE0F896E4C76289808EB079D78234728A58B92706029590297F2FC8D8ACFC E2DB33BC6F51F7557CF8E90379A2CBB9F4C52E9E440E16B998C05E8B8A04E21C F92A2D7BA5279F8E439D52348E1BD36155FEBDDF2A0589D38E71CF550543873F DB3BD7E1C9EEB005E3555D1A8F4E160D40EF5AA2CDDF80E166AA987F5A7FA5CC 73B806A3466D65A0E94CC58D23D1E5DFFDACF8EE27BCFF552B8AADAB5CB845A0 4D2C22EC0C2D19F51156631FB0D030852DCB7F9E18BD6289677CCD792EAAE163 79735AF1C25B78EDC53792BE2C2A9C77C59C9C0B255A59A204AA5EE07BD78B5A 5C323322B23C6CC2C552EAA869F3EB4EA925953E7F296BB0D66C6ADDE6364B67 9D52C3B2587DCE7173220D2CB724F4327E28CDE23C49069937E378480DF331F3 7297CDEED6934BC0722B686E00741D6DD42C8625F7AEF1E32ECC9092F30B1686 C3830F242FEB01E5D5B755826FFDE99AA0E64357C8CB46A496319698DE316CA7 EAD6B7CE11ED36A842B277FE5084BE46ED6D00F5C85E2D35E37286A46F160684 001428657F3218DC8787DE1057B453E3982F116F67945D95CF79E1306C85B1F2 31C70F21F396BB88A3B05FDAD770B9E805C5C487418BEED6807577FDC12EA1C9 05B318F199D1C5E7179870599468BFD878920A465686259E09A1E3FB37EBB3F8 864F9EA6A798A95B97C564D49E74D62B9E7F44562AE0B1326FE6622E87683704 7340422EEAC561024936949561885388C54D9B7E2F923CD3A293558F26DA3F55 CF41450CE22E16C1DC1959D640448E9D9259090D4F96CC138AFB8F090782F383 4D4280A45EDAEDBC77E1012D22976B790F1C2FB9D12A49D30A67025DD0D14200 D662983D56E91429542BD121A844A47AE91BA21F797DABC1AB56825CEFA4EA47 00ECC341886D69103F1C4D8799A9DFFDE99FD4FFF8F99D5B6ED3CBAFAEB2066B 460E23885E34DE13B81B4C41B714AA2FC0BE165947C05B14C0E0B3139AF95380 5A9CC7AFA523DE5635871D9D54557F13737AF20D5255819D47781E82F65E6AEE 68839872B2E47951631A799A99731F8F274F1F2ADE086F4E1AC74BA387D7DEBB 22415882BA7918008CC13877D1D1B4B25BC78A8B176D6E23B0C0CBF431361AF5 1D4F56CBFFBCF4C7EE0DCB8362D9020F2A6A235D664938E2C8DBD19FAB7DE364 AC43A835F59DFE26771E94F4659C0509D7B3EA4516544F348A70E4B7B397FD8B 9EEA50A08C89E565C498F9A4943F71812DB77267C54AA8C10B675965AEE05F12 5B695F7AA5881027F90D331DA8FCAD97EF697A6C31268BC16FF89CF6DD673F15 FC1310CA106A37E48D75762611D0AE67496FD1FCB7C6172946A12A2F8B1AA55C 250C84EE34937F21CC86922AF593B6BDFD56E729B89011F2955EB91644D81E6C 96AE28F4EE38FE0E0A4B0AAFD38E87710E7F41FECB53B01A9A7100A701449A72 AA865D3DE7BA1A73FC51FF314C5F5C66A1CA2F6DA71E013191D3299EB9BAEDD1 A8FC1AAC9073E9C4688E79A433B455A2172398384B616578F730A7052AFF9682 0BB5054358E6B86B59EE70F3F9C554598B761568A0A06B35035E25120DEB6CB2 5510E48C460D6D16F535AAD19B5B0BFB1F0D2BE5A8B3DD363D6A62119A1492B1 586C78570904F5D65490EB8B3DEB6D8EB0FCCBC6F64210107F713F4D8B34C169 FB1D5BACFAE963A16D377A0CD1D92C3B9B2CD465AFAB34C6D3F76CAF715533AF 45CB193201C3E13F37B13C1CAF9ED0D03F9D28A933D67ED22AFFA09D665A20A9 6973D0E58F372C8E482AB45A87FEC96161C1555C87EA868E68C033EDF1113192 081630EEEEFE87DDFCE00EF4C82EB623CA3E59675E178F741837B9A1129EFE02 41BE0F26EABF3F36D6B74B470D64AB075A96F6771975767BBE4F106DD54219A3 1998C6A9F83A50C429CD10A61F045EDE780CB8612E9B8C0C1F38B72EA72C6C4A 085F168B91CB48E3774AAFCCC3FDF06EC61CF177D143CA5B0DAA83243F62B5A5 EC7E2566C23548593BA6713281F6268754FBFC91E3439B3849138BB49C0250F2 B30E9B84A473AF0AFC95B25771FB26A643EC68A382FC9EC7A0177FFAC3F14957 39A81E48D79C93283561A6627CD0B4E2CF45C083E715C5F52FD634CC68BDC701 174436C2BE178ED7868E2ACC190EAD2406BF320181FE634092B29056ECE846AF F336A067A7B451CB8A55B3B926B6CA7757E1CC945CF4A9EB8C136D5B3387FB08 384521854B48B8FEFB033815F1DD7B7A598E944929EAD7764F1B1DB3AD44D8A8 48038369F3B389C6144D25CF5FB0AF7F02DE65AC63636CA934B6E8483B8E68FD 6B9342641BB38BD805A3ACEEA44C5DACC0A897D442D69D29EDFCC5C2CAD38A56 213EEC8AD86B4B11090004A934D4E20E1AAB9B7BC8BE606973521A40D7851C1A 1140D0686C707B65E3119EBC55E38F64BC747C55CED35B56E3A00080AAD828AB 9210A55A338598291A97F9D79670E059AEBEA965875ED976E91335E2A8DEF713 95EF33DBCA3056B2769201833AEADA1432628366A890222C37D95375DFEDCDD3 B08B9AF49D44CD70BD34D860998C42A09B59B871866C04BCA813ED8C5ED37A57 665390ADD192FEA179E6E521015FE24BFAE1CA89F35ED0B53B4DAAF495D9416C FEAFA696991DE7FC317756F0D10B701149AD55B83C9AAB8487E76804B5971E79 034ECC1BBF32D4AF9DECEA1A54E466CFDE1DC58CA90812E980FF86F9FB7BD1E4 B8F7C3EDBAF7C31FB6E460485A478136B8C609B676700EF13F6853EDD1769DAA 485CACE85CBA98FB2AEB34A8B649B37C26A3450D79F1A4BBE346F9DC6E5A9EAE 7FFD045428526DFF8D7BC5038288AF6AB80EC30EEA5C667F7089EA341981E030 521FAA7605F39029A8B07A0795E203689BF8401D88E0B378DF54E62F91666563 1975E1603CF51FDC3DED1325FBACB587B818CFDE077F47BCEA90EA96CA54E077 A589A30D8E26A29683B978E7B7805C0A611578951FA17EBA1FAEDE4532FDB4F2 8CBB70249E07C261E9C805A16C32D7B97273D44D7093AA7223F4AF8FF327CC05 8B5D7352680BFDF70BC067B29749FD58595C4D855108B8AC91C39A46B94CCBF9 BF5D421A6BBD1D2FCC90181DE02C3D9676E5761B244F36CD35154F5931BF4507 018903F6D7AF6A82FACF9A00A9C59DF208CC717683B7D14B65F1BF37A652AAFD BDB1005ECAF203DDD78F5BA80C0C356521F085DE00CC9168EE261F76CBA3E2AD 6F83DAC1827844C18784730E874B98D26A39AB76B4DE23BE7B30A88287ECABE2 A054A8B240821FB70935C5A1626387F5FB7AD1280F99A09D0819A43E314E6CA1 C541549D1EBEC7DE52AB56270B2EE2BB2797A2F042DFDB4EB3F7B307C4593480 C107F5ADF09A7522C5F3F0B2C839E2BDD2991F61F563EA9CFCF449BE280DD6DE 55CB2D6313A7328B8653D8D4A9A105278BC36C452D8DA31A9B834D6A65EEE6C8 F4168DBF9C3E147A84EE59732AD16AB366381F0B00441999EE78AEDFDA0536E7 C9A3B4BA7618441904F5DE8958BDA2E2ED9EF15270E3BDE83EED920BA2284CD5 D5DFFF6820916C7345CE48E9EFDD6D268B4C1EDB957A0DB904EBFC13690A3B25 2A5D46FC0878E2E58FD82D9ED0AA1406684CE709B24BD19AA0D4F0EE12BCC63D 978A3F55E6DC9C578EAEDB9C0F4F29507472E2DAB275E7E02978DD8B9426810D 297060B76959F88CF7725DAFE51CF079DE00B057398B0519BDDBE4EDA857BAA6 42D18A19EC754F332592B2F6553B0B2BB6E03AB0F35D923430E46B09EF345931 9C56818E650C6BC6CCC18A6F7BE90659EC2169A6C626D4397348268E8206B864 19415C7FBA73C0F417A7A80F15584548C1E9241C45BCA2B10840123A3A223D40 2A5471845853D355900420D36C6D7AD494BF4EB21E98970C835041A9667C4CC3 FCC136FBFF820FFB5F598D5205CA910B6B30582D7621415CA0797C86D2ADB4B1 9ADC12710EA65979C5735D2D933D1D8AE021D67F0712E0B4EB85A5026F03B7FF 8ECCBAEED4F82C4D9F7CC47FC560BC70BE3CD8FE9E338DF601111A5E1E3C5189 0EEBD61164E7190DB788E267A25E6070885E36FB7873747E82B5E7109C07DB09 B65CD0B5549CAC0FD173F67061A8461700967DF9AB3A7A3552A4901D2E25A1DD 115B6B6825219F33CEE41710FD4CED40D8FFC0BEBFE0BE3E21F61010B173408D 7D62AC6247B95FC3E60B90088CD552D8204D3B8938A7452C0F7B90088F03492F BA1E74FDDE953CF9D99078261DCFFA4EF2A6405F9A6E0A3B4B40F839C3F023D3 05F2E9F43A08D7A11FF9848784783293BB35E69382A34FA65618E3E387DC394D 0A3945AEA9106CF74329A9059C5750C168C244099C075841FDE9EE67A860CC5B 5F4C467790F9ACDAE23D9021C7170F679BB6650FBCBC1F2FC2FE12E0E812DAB4 FA60AE6A0E20696CF707EEEA5A4F4D7317275B876FF709F01E162DD5B7E825A5 CD42E805396A85D4A6262F5C948A319C9F55D0FF1BD365DB784ED0A3B612003B 32FD02363DF3E34E9066E9BD587FECEB62E7A95FD4B3AB1C2CCE5A23B727EB0F 0EDC41FFF1386FDFD8D7D266F176B9F8A772B3BD81605CF7CD1E5562F63C403A 62153D6CB14214C999D48F8350338CDE3827BE088A4F8CBC0050D80E3F4FCBDD FE18FAEDA58E3B5004B8B5CC759E14F59832512506F2DB7EE702ADDDD81622D6 4B559372245F0AACC6863CFCDBBB43C4BA2DA5E2A749C4FFE06884CA4EB8AEF9 2C9605DCAD529946BEE9B8D916A509837F0DB35B56A9FEE6B950E65880C4D9E5 5B2AEA822C3CD924271438683DCC71222A253AD16CEEF78ECFD41CCFCC4DAB19 F698FDC2B9A0B50E9C91F278C6EF0A3AB894B88F9DF87BCE655105350DA0AE65 8C18CB46B1B8CC4DD922E0E0A8880B4D9CA3AE96546166429948292E582C27C7 58C8E7A1FAD01232EBFF57ABABC70A2D9B27983C0306F89FA693FA5D0D8E59CF C353E7262AC562858BD2ED80D2746537E5C6C848A6440F094235DC81D8E6AFF1 C80E344A89B8339A9FC337740EEEA92A658F4322CFAFE1FE0238E865B813DA33 F75DC912EE95AB560C6AC5EA4FE53A63ADD8CAFEA74E4CA92F13EED378ED5D51 05B522074C605CECB84468AFF0D7AD57CFA4576EDFCE0F45709E03E724FF88B5 A04BAA6AAE30B0A3CA0EF28342FC28945086D50A978BEF307A9EF787FE7F30C0 6E7275227D01D5FBD055F7CFCC8A46AFE69F7B036751044829A3A8A23F0172D7 D5F45E9E671287A93C2E13567669AAF409DAB427A68D3CF2184D76F95AE960AD 7426D2C8A3D5B22D288F369CD3633318291A6470DD9C453A95BC281C79A26602 C376BFB27C1B4C1A211FE252C615365883BC41163252920971A83D0A5E3BDBC7 DA9161FD6846220B144D92F194D718E62A17074A3137382DBA54BE70C418946E FACB7B6F87BC1133F5AEABB4416A29A586971E0E0CE3A2523CF46A7233873EE5 4701C9E0F40D70CE8782DBA7A30378D0CE3EC44905B94879EEF4A9B99173B2D5 BD31ECF9A7D0F1641AC0CF5F3AD5A6B0E5364AC0596E349E99729EE93AF80E18 6FCF51075083394DE6A7E5D9F8046FD09287AAFD06E93C844935D732914F7AFE 1ECA0D3E09419DA3032BEDB9B77F802198121AF72DCBF718D33760AB5E795A36 A6B141214195FF215E551F218D43FF7A31DE11DA6EDACA9DE896938B111D9950 8CF881637E36C32AA229A6C92ED4C86D272EC85837373D1F2570506C7BFF633A 87D399697BD741A8F11309130ED1914968DE74C66CCA509B332985B594454F3F 819F43255D89D001FAD93C86BB79384BBABA6B113E3D48EEDCA3CC501A52C0C6 7CF3FA3CB9FE0FD257D9F4DD1E346E2D7F6CE0CD45CEEB8739DA798F1B7DC021 6E2B4F910E64EDB9DAFC17D177BD72C73983141BA943E0D1E5183B10B97FC3F3 5891B4A975D2D5F4739010E24659530CDE1A21B4C5372F7C101CD93F2C4919D7 345892778924FEAEEB9EA7EF9095D520832C4029B9439EC6F6EE9BBD2B09C3E3 C4C116C52888BAE3B32757F2C5DFAEC1B385715D58106F6A858ABF0319C96A9E 18FBEEEC6D10135CC392C8F6F40E458AEBFBE3C86AF26D20A67617BFA4F6C4D9 71CA38DF06855457D01DFD9829E46442661616246B8F8C108FD3C0703D1FBD37 683BF60059B4792AC240E437D9E94498A248F8E2CE05701632F6C0462C28676F E38EC5BEE0339540D387035DE9716D53790C3185EB64D180AE2A3C1209CA6A6B D2631D59A2FC3A339BE9F0486418B7970DF40FEB32DD043D51E09336AC63CAFC D1231EA3C77114E60FE2A3B1CEBE7630387F32A9C8C6B8AC0800F421FE95C3AB 86DDE37060B43E12469A69E88EB98AAC80D95CB202A0806B1D47227814362AC5 9C658B2C1D3CE3885D691F2F9CC3209155B45464234443ADC78430B1A98EEFD6 E5070982520A877293BAEF958B03217E3CDF36BABFE7D1F225C1F621453CBCF8 5D06089A6D09EDF4D4D2FC940F8FDEF1F78190A7B9C497E677E099EC8527C49D 3F3D1C264878A32F1B92FD4B1F3AFF06AE36180F6893F6E9CD1DBA888A3FF6A4 DD4DC730B7C3E100E84506CBCC1647C4D37657654F84D4FDFFC8014AF9F139DA 442BF6E53DC92241CB5E8FF3FBC55057A31C78FE07EF09CDA8C5701FF65EEEBD AFFA2E8E24C0694A816A37CCF63AA0D515DF32149BC462EF16942EEF3F8CA2BB D2EEB9164D01F92D5597F0C1FFDE270565759AB2662482B99EB1CE8763BCB8D8 D035E0085440443674BC0DB76BE317599E2E120F69E2BCF40C20F5F225D8336B CDA75789949C71580F54A229F96CDCFB0E5A4B5BF702F758D4FE9A5DB382EBCD DB77FC39DF9E900C29F84CC9CCACE86756AA03AAD2481F918858EF246554DEC9 28868CA6C26E1DC96D5C6EC62615442F1FF35980D77091AE953488401A263E53 0879E8AAA44555C4543E914543567340870FB4C408BB4F2133F1BC782D2E9E84 B31494DC916E661DADE54E396001ABE568AAF549CC1977B312C646D84014F5BF 40A48E53DFCD37AC9D6512F0FACB21A2563EC83244ACA4FA526FA8A851FBFBA0 1EDE61C21238401113DCE80C8BFC413ACB05C380FBED416B4D12CA44995CE106 08501BF288EFD93BDD2F77E959B32A196D59209E987DA55764F59EAE90E3D049 4842862ABA2C852DEEA8D0145E67EAB9828292D895D2A44C408F0ED06B98E30A 5857994DFEE2D36021268DFFDF92B482CFBDD79DF3B0AB7FE6E2AF33BFADAB8E D80B54A1A4E3A9CBF4EEAB86E1B68369C8E918601E061B8B76ACBCFC8EE83FD6 BB9070B61205EA1F73041D9F7FEE1AEC1C17F89D1ED90B6E0AE33D2FE94157C3 740E56C12BDD55CF274EE181FF17B8CC6C977C7A023AAA6DFACE7843592F0B77 487660E3E9E18DF91AD9D4FBC487729F6707B4EF7E2AEE6B58BC9B5ACA16E24C C849EAFDCE7C2CFC29E9723FED876F6CB28A360F0D15D08E6E59E865486A14BA 067424003AC7E4E26266AB48881662877C3B4A3CF66DC09BE0E5201E6366AF68 16FCEB60875767EA6C41D785F76CEAA55BA4D5EE2EA89DEE68E78C4DB15DB077 660AE121989032C6A9BE22B1245BCB6A909D4F128367D0C6F0C33AFFE8187A5A 9838981235051BC3017F0511DFD89143FFAD0D845FAA300FF94B264B6AB61A54 BDECDB15DFBBA0CB7CEDD533CDA9889C1EBBB0679610927ADA384B1A4008DA22 E2CCE4B5427FD57BEC44124730CC8F956910EC035C3DFD599B5726043555B493 FB00F363F20F322388001B06250CFA9BCD41D969C012F264A0A373A7E49A60B5 D17A59AA21F6B5E00D9B1318E2A7DBE53895F59635D293A1F006955F9131A2C0 54FD3CDDB9835031B443B60A18DBC2BDF1542E408C11E08433C5B83CE5C9EF08 01758BEBDDA0C5C0A8A6C878D79423E8845D613230BE8DC2FCA1510DE9248087 CF1ABE53C77F7364F2853012EE1C0B5DA7F4B3C52D474CEE1064B8DAE82073A9 C3A32D04658D3317DD8CC3A2F4379DCD22783CE461860BB379841AF0FDC98694 554015E6A246D822818C2D3F341DC3B892BFC715D14C16437F5FA4EB988D8EA1 DD18F3D5D6ECE2EDB660D746396EDDE7C1A1A34439759E7AE592E6C126330260 A8371F7EC8F634C729B39E4B1C30335E96E80E33C300097D7F3A044BCEBD053D 02B99ABE2DE748B036CC9C8C4D5D183066983F026D5AECFBDCB6B911487ED20E 40F8EAA86B8F73C36BF3E1C6DA2E60429DE261BC91061BB7939BC344CC642A04 0C75DD191714BC52278A8E889952C6A3 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark %%EndResource /F8_0 /YLWBJI+LucidaSans-Typewriter83 1 1 [ /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright /parenleft/parenright/asterisk/plus/comma/minus/period/slash /zero/one/two/three/four/five/six/seven /eight/nine/colon/semicolon/less/equal/greater/question /at/A/B/C/D/E/F/G /H/I/J/K/L/M/N/O /P/Q/R/S/T/U/V/W /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore /quoteleft/a/b/c/d/e/f/g /h/i/j/k/l/m/n/o /p/q/r/s/t/u/v/w /x/y/z/braceleft/bar/braceright/asciitilde/bullet /Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl /circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet /bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash /tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis /space/exclamdown/cent/sterling/currency/yen/brokenbar/section /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron /degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered /cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown /Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis /Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply /Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls /agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide /oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] pdfMakeFont 612 792 false pdfSetup %%EndSetup %%Page: 1 1 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 README Page 1) 144.161 Tj 0 -28.4801 Td (xv6 is a re-implementation of Dennis Ritchie's and Ken Thompson\ 's Unix) 305.796 Tj 0 -37.9735 Td (Version 6 \(v6\). xv6 loosely follows the structure and style \ of v6,) 292.6905 Tj 0 -47.4668 Td (but is implemented for a modern x86-based multiprocessor using \ ANSI C.) 305.796 Tj 0 -66.4535 Td (ACKNOWLEDGMENTS) 65.5277 Tj 0 -85.4402 Td (xv6 is inspired by John Lions's Commentary on UNIX 6th Edition \ \(Peer) 297.059 Tj 0 -94.9336 Td (to Peer Communications; ISBN: 1-57398-013-7; 1st edition \(June\ 14,) 288.322 Tj 0 -104.4269 Td (2000\)\). See also http://pdos.csail.mit.edu/6.828/2007/v6.html\ , which) 297.059 Tj 0 -113.9203 Td (provides pointers to on-line resources for v6.) 200.9517 Tj 0 -132.907 Td (xv6 borrows code from the following sources:) 192.2146 Tj 17.4613 -142.4004 Td (JOS \(asm.h, elf.h, mmu.h, bootasm.S, ide.c, console.c, and oth\ ers\)) 288.322 Tj 17.4613 -151.8937 Td (Plan 9 \(bootother.S, mp.h, mp.c, lapic.c\)) 179.1091 Tj 17.4613 -161.3871 Td (FreeBSD \(ioapic.c\)) 78.6333 Tj 17.4613 -170.8804 Td (NetBSD \(console.c\)) 78.6333 Tj 0 -189.8667 Td (The following people made contributions:) 174.7406 Tj 17.4613 -199.3601 Td (Russ Cox \(context switching, locking\)) 161.635 Tj 17.4613 -208.8535 Td (Cliff Frey \(MP\)) 65.5277 Tj 17.4613 -218.3468 Td (Xiao Yu \(MP\)) 52.4222 Tj 0 -237.3335 Td (The code in the files that constitute xv6 is) 192.2146 Tj 0 -246.8269 Td (Copyright 2006-2007 Frans Kaashoek, Robert Morris, and Russ Cox\ .) 279.5849 Tj 0 -265.8136 Td (ERROR REPORTS) 56.7907 Tj 0 -284.8003 Td (If you spot errors or have suggestions for improvement, please \ send) 292.6905 Tj 0 -294.2936 Td (email to Frans Kaashoek and Robert Morris \(kaashoek,rtm@csail.\ mit.edu\). ) 314.533 Tj 0 -313.2803 Td (BUILDING AND RUNNING XV6) 104.8443 Tj 0 -332.267 Td (To build xv6 on an x86 ELF machine \(like Linux or FreeBSD\), r\ un "make".) 310.1645 Tj 0 -341.7604 Td (On non-x86 or non-ELF machines \(like OS X, even on x86\), you \ will) 283.9534 Tj 0 -351.2538 Td (need to install a cross-compiler gcc suite capable of producing\ x86 ELF) 310.1645 Tj 0 -360.7471 Td (binaries. See http://pdos.csail.mit.edu/6.828/2007/tools.html.) 275.2164 Tj 0 -370.2405 Td (Then run "make TOOLPREFIX=i386-jos-elf-".) 179.1091 Tj 0 -389.2272 Td (To run xv6, you can use Bochs or QEMU, both PC simulators.) 253.3738 Tj 0 -398.7205 Td (Bochs makes debugging easier, but QEMU is much faster. ) 240.2683 Tj 0 -408.2139 Td (To run in Bochs, run "make bochs" and then type "c" at the boch\ s prompt.) 314.533 Tj 0 -417.7073 Td (To run in QEMU, run "make qemu". Both log the xv6 screen outpu\ t to ) 297.059 Tj 0 -427.2006 Td (standard output.) 69.8962 Tj 0 -446.1873 Td (To create a typeset version of the code, run "make xv6.pdf".) 262.1109 Tj 0 -455.6807 Td (This requires the "mpage" text formatting utility.) 218.4257 Tj 0 -465.174 Td (See http://www.mesa.nl/pub/mpage/.) 148.5295 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 table of contents Page 1) 192.2146 Tj 0 -28.4801 Td (The numbers to the left of the file names in the table are shee\ t numbers.) 318.9016 Tj 0 -37.9735 Td (The source code has been printed in a double column format with\ fifty) 301.4275 Tj 0 -47.4668 Td (lines per column, giving one hundred lines per sheet \(or page\)\ .) 275.2164 Tj 0 -56.9602 Td (Thus there is a convenient relationship between line numbers an\ d sheet numbers.) 345.1126 Tj 0 -85.4403 Td (# basic headers) 65.5277 Tj -4514.2 TJm (# system calls) 61.1592 Tj -5015.87 TJm (# pipes) 30.5796 Tj 0 -94.9336 Td (01 types.h) 43.6851 Tj -7022.54 TJm (23 traps.h) 43.6851 Tj -7022.54 TJm (51 pipe.c) 39.3166 Tj 0 -104.427 Td (01 param.h) 43.6851 Tj -7022.54 TJm (24 vectors.pl) 56.7907 Tj 0 -113.9204 Td (02 defs.h) 39.3166 Tj -7524.2 TJm (24 trapasm.S) 52.4222 Tj -6019.2 TJm (# string operations) 83.0018 Tj 0 -123.4137 Td (03 x86.h) 34.9481 Tj -8025.87 TJm (25 trap.c) 39.3166 Tj -7524.2 TJm (53 string.c) 48.0537 Tj 0 -132.9071 Td (05 asm.h) 34.9481 Tj -8025.87 TJm (26 syscall.h) 52.4222 Tj 0 -142.4004 Td (06 mmu.h) 34.9481 Tj -8025.87 TJm (26 syscall.c) 52.4222 Tj -6019.2 TJm (# low-level hardware) 87.3703 Tj 0 -151.8938 Td (08 elf.h) 34.9481 Tj -8025.87 TJm (28 sysproc.c) 52.4222 Tj -6019.2 TJm (54 mp.h) 30.5796 Tj 209.536 -161.3872 Td (55 mp.c) 30.5796 Tj 0 -170.8805 Td (# startup) 39.3166 Tj -7524.2 TJm (# file system) 56.7907 Tj -5517.54 TJm (56 lapic.c) 43.6851 Tj 0 -180.3739 Td (09 bootasm.S) 52.4222 Tj -6019.2 TJm (29 buf.h) 34.9481 Tj -8025.87 TJm (58 ioapic.c) 48.0537 Tj 0 -189.8672 Td (10 bootother.S) 61.1592 Tj -5015.87 TJm (29 dev.h) 34.9481 Tj -8025.87 TJm (59 picirq.c) 48.0537 Tj 0 -199.3606 Td (11 bootmain.c) 56.7907 Tj -5517.54 TJm (30 fcntl.h) 43.6851 Tj -7022.54 TJm (60 kbd.h) 34.9481 Tj 0 -208.854 Td (12 main.c) 39.3166 Tj -7524.2 TJm (30 stat.h) 39.3166 Tj -7524.2 TJm (62 kbd.c) 34.9481 Tj 104.768 -218.3473 Td (31 file.h) 39.3166 Tj -7524.2 TJm (62 console.c) 52.4222 Tj 0 -227.8407 Td (# locks) 30.5796 Tj -8527.54 TJm (31 fs.h) 30.5796 Tj -8527.54 TJm (66 timer.c) 43.6851 Tj 0 -237.334 Td (13 spinlock.h) 56.7907 Tj -5517.54 TJm (32 fsvar.h) 43.6851 Tj 0 -246.8274 Td (13 spinlock.c) 56.7907 Tj -5517.54 TJm (33 ide.c) 34.9481 Tj -8025.87 TJm (# user-level) 52.4222 Tj 104.768 -256.3208 Td (35 bio.c) 34.9481 Tj -8025.87 TJm (67 initcode.S) 56.7907 Tj 0 -265.8141 Td (# processes) 48.0537 Tj -6520.87 TJm (36 fs.c) 30.5796 Tj -8527.54 TJm (67 init.c) 39.3166 Tj 0 -275.3075 Td (15 proc.h) 39.3166 Tj -7524.2 TJm (44 file.c) 39.3166 Tj -7524.2 TJm (68 usys.S) 39.3166 Tj 0 -284.8008 Td (16 proc.c) 39.3166 Tj -7524.2 TJm (45 sysfile.c) 52.4222 Tj -6019.2 TJm (68 sh.c) 30.5796 Tj 0 -294.2942 Td (21 swtch.S) 43.6851 Tj -7022.54 TJm (50 exec.c) 39.3166 Tj 0 -303.7876 Td (22 kalloc.c) 48.0537 Tj 0 -341.7606 Td (The source listing is preceded by a cross-reference that lists \ every defined ) 336.3756 Tj 0 -351.2539 Td (constant, struct, global variable, and function in xv6. Each e\ ntry gives,) 323.2701 Tj 0 -360.7473 Td (on the same line as the name, the line number \(or, in a few ca\ ses, numbers\)) 327.6386 Tj 0 -370.2406 Td (where the name is defined. Successive lines in an entry list t\ he line) 305.796 Tj 0 -379.734 Td (numbers where the name is used. For example, this entry:) 249.0053 Tj 17.4613 -398.7207 Td (swtch 2256) 43.6851 Tj 34.9226 -408.2141 Td (0311 1928 1962 2255) 83.0018 Tj 34.9226 -417.7074 Td (2256) 17.4741 Tj -0 -436.6941 Td (indicates that swtch is defined on line 2256 and is mentioned o\ n five lines) 327.6386 Tj -0 -446.1875 Td (on sheets 03, 19, and 22.) 109.2129 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 2 2 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 1) 187.8461 Tj 0 -28.4801 Td (acquire 1375) 52.4222 Tj -14045.3 TJm (0210 1224 3538) 61.1592 Tj 17.4613 -37.9735 Td (0311 1375 1379 1632) 83.0018 Tj -6520.6 TJm (bmap 4010) 39.3166 Tj 17.4613 -47.4664 Td (1820 1871 1918 1933) 83.0018 Tj -8527.14 TJm (4010 4047 4119 4169) 83.0018 Tj 17.4613 -56.9594 Td (1967 1980 2023 2058) 83.0018 Tj -8527.14 TJm (4222) 17.4741 Tj 17.4613 -66.4524 Td (2265 2312 2549 2870) 83.0018 Tj -6520.6 TJm (bootmain 1116) 56.7907 Tj 17.4613 -75.9453 Td (3406 3465 3569 3629) 83.0018 Tj -8527.14 TJm (0975 1116) 39.3166 Tj 17.4613 -85.4383 Td (3807 3840 3860 3889) 83.0018 Tj -6520.6 TJm (bootothers 1267) 65.5277 Tj 17.4613 -94.9313 Td (3904 3914 4423 4440) 83.0018 Tj -8527.14 TJm (1207 1236 1267) 61.1592 Tj 17.4613 -104.4243 Td (4456 5217 5255 5277) 83.0018 Tj -6520.6 TJm (BPB 3193) 34.9481 Tj 17.4613 -113.9172 Td (6385 6440 6466 6508) 83.0018 Tj -8527.14 TJm (3193 3196 3712 3714) 83.0018 Tj 0 -123.4106 Td (allocproc 1627) 61.1592 Tj -13042 TJm (3740) 17.4741 Tj 17.4613 -132.9039 Td (1627 1715) 39.3166 Tj -11537.3 TJm (bread 3602) 43.6851 Tj 0 -142.3973 Td (alltraps 2456) 56.7907 Tj -13543.7 TJm (0211 3602 3683 3694) 83.0018 Tj 17.4613 -151.8907 Td (2410 2418 2432 2437) 83.0018 Tj -8527.14 TJm (3713 3739 3867 3961) 83.0018 Tj 17.4613 -161.3836 Td (2455 2456) 39.3166 Tj -13543.8 TJm (3982 4032 4066 4119) 83.0018 Tj 0 -170.877 Td (ALT 6060) 34.9481 Tj -16052 TJm (4169 4222) 39.3166 Tj 17.4613 -180.3703 Td (6060 6088 6090) 61.1592 Tj -9028.94 TJm (brelse 3624) 48.0537 Tj 0 -189.8633 Td (argfd 4564) 43.6851 Tj -15048.7 TJm (0212 3624 3627 3685) 83.0018 Tj 17.4613 -199.3567 Td (4564 4607 4619 4630) 83.0018 Tj -8527.14 TJm (3697 3719 3723 3746) 83.0018 Tj 17.4613 -208.8497 Td (4644 4656) 39.3166 Tj -13543.8 TJm (3875 3967 3970 3991) 83.0018 Tj 0 -218.343 Td (argint 2694) 48.0537 Tj -14547 TJm (4037 4043 4072 4122) 83.0018 Tj 17.4613 -227.8364 Td (0329 2694 2708 2724) 83.0018 Tj -8527.14 TJm (4173 4233 4237) 61.1592 Tj 17.4613 -237.3293 Td (2837 2856 2868 4569) 83.0018 Tj -6520.6 TJm (BSIZE 3157) 43.6851 Tj 17.4613 -246.8223 Td (4607 4619 4858 4909) 83.0018 Tj -8527.14 TJm (3157 3169 3187 3193) 83.0018 Tj 17.4613 -256.3153 Td (4910 4957) 39.3166 Tj -13543.8 TJm (3695 4119 4120 4121) 83.0018 Tj 0 -265.8086 Td (argptr 2704) 48.0537 Tj -14547 TJm (4165 4166 4169 4170) 83.0018 Tj 17.4613 -275.302 Td (0330 2704 4607 4619) 83.0018 Tj -8527.14 TJm (4171 4221 4222 4224) 83.0018 Tj 17.4613 -284.795 Td (4656 4982) 39.3166 Tj -11537.3 TJm (buf 2900) 34.9481 Tj 0 -294.2883 Td (argstr 2721) 48.0537 Tj -14547 TJm (0200 0211 0212 0213) 83.0018 Tj 17.4613 -303.7817 Td (0331 2721 4668 4758) 83.0018 Tj -8527.14 TJm (0253 2900 2904 2905) 83.0018 Tj 17.4613 -313.2747 Td (4858 4908 4923 4935) 83.0018 Tj -8527.14 TJm (2906 3310 3325 3375) 83.0018 Tj 17.4613 -322.7676 Td (4957) 17.4741 Tj -16052.1 TJm (3404 3454 3456 3459) 83.0018 Tj 0 -332.2606 Td (BACK 6861) 39.3166 Tj -15550.3 TJm (3527 3529 3535 3540) 83.0018 Tj 17.4613 -341.754 Td (6861 6974 7120 7389) 83.0018 Tj -8527.14 TJm (3553 3564 3567 3577) 83.0018 Tj 0 -351.2473 Td (backcmd 6896 7114) 74.2647 Tj -11537 TJm (3601 3604 3614 3624) 83.0018 Tj 17.4613 -360.7407 Td (6896 6909 6975 7114) 83.0018 Tj -8527.14 TJm (3639 3669 3681 3692) 83.0018 Tj 17.4613 -370.2337 Td (7116 7242 7355 7390) 83.0018 Tj -8527.14 TJm (3707 3732 3854 3955) 83.0018 Tj 0 -379.727 Td (BACKSPACE 6266) 61.1592 Tj -13042 TJm (3979 4013 4055 4105) 83.0018 Tj 17.4613 -389.2204 Td (6266 6284 6313 6476) 83.0018 Tj -8527.14 TJm (4155 4215 6354 6366) 83.0018 Tj 17.4613 -398.7133 Td (6482) 17.4741 Tj -16052.1 TJm (6369 6372 6435 6442) 83.0018 Tj 0 -408.2067 Td (balloc 3704) 48.0537 Tj -14547 TJm (6453 6474 6487 6518) 83.0018 Tj 17.4613 -417.7001 Td (3704 3725 4019 4030) 83.0018 Tj -8527.14 TJm (6984 6987 6988 6989) 83.0018 Tj 17.4613 -427.193 Td (4040) 17.4741 Tj -16052.1 TJm (7003 7015 7016 7019) 83.0018 Tj 0 -436.6864 Td (BBLOCK 3196) 48.0537 Tj -14547 TJm (7020 7021 7025) 61.1592 Tj 17.4613 -446.1798 Td (3196 3713 3739) 61.1592 Tj -9028.94 TJm (bufhead 3535) 52.4222 Tj 0 -455.6731 Td (bfree 3730) 43.6851 Tj -15048.7 TJm (3535 3551 3552 3554) 83.0018 Tj 17.4613 -465.1665 Td (3730 4060 4070) 61.1592 Tj -11035.5 TJm (3555 3556 3557 3573) 83.0018 Tj 0 -474.6594 Td (bget 3565) 39.3166 Tj -15550.3 TJm (3587 3633 3634 3635) 83.0018 Tj 17.4613 -484.1528 Td (3565 3596 3606) 61.1592 Tj -11035.5 TJm (3636) 17.4741 Tj 0 -493.6462 Td (binit 3538) 43.6851 Tj -13042.1 TJm (buf_table_lock 3530) 83.0018 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 2) 187.8461 Tj 17.4613 -28.4801 Td (3530 3542 3569 3577) 83.0018 Tj -8527.14 TJm (7248 7250 7253 7255) 83.0018 Tj 17.4613 -37.9735 Td (3581 3592 3629 3641) 83.0018 Tj -8527.14 TJm (7258 7260 7263 7264) 83.0018 Tj 0 -47.4664 Td (bwrite 3614) 48.0537 Tj -14547 TJm (7275 7278 7281 7285) 83.0018 Tj 17.4613 -56.9598 Td (0213 3614 3617 3696) 83.0018 Tj -8527.14 TJm (7300 7303 7308 7312) 83.0018 Tj 17.4613 -66.4531 Td (3718 3745 3966 3990) 83.0018 Tj -8527.14 TJm (7313 7316 7321 7322) 83.0018 Tj 17.4613 -75.9465 Td (4041 4172) 39.3166 Tj -13543.8 TJm (7328 7337 7338 7344) 83.0018 Tj 0 -85.4399 Td (bzero 3690) 43.6851 Tj -15048.7 TJm (7345 7351 7352 7361) 83.0018 Tj 17.4613 -94.9332 Td (3690 3736) 39.3166 Tj -13543.8 TJm (7364 7366 7372 7373) 83.0018 Tj 0 -104.4266 Td (B_BUSY 2909) 48.0537 Tj -14547 TJm (7378 7384 7390 7391) 83.0018 Tj 17.4613 -113.9199 Td (2909 3458 3574 3576) 83.0018 Tj -8527.14 TJm (7394) 17.4741 Tj 17.4613 -123.4133 Td (3580 3588 3589 3616) 83.0018 Tj -6520.6 TJm (CONSOLE 2957) 52.4222 Tj 17.4613 -132.9067 Td (3626 3638) 39.3166 Tj -13543.8 TJm (2957 6556 6557) 61.1592 Tj 0 -142.4 Td (B_DIRTY 2911) 52.4222 Tj -12038.8 TJm (console_init 6551) 74.2647 Tj 17.4613 -151.8934 Td (2911 3387 3413 3418) 83.0018 Tj -8527.14 TJm (0216 1231 6551) 61.1592 Tj 17.4613 -161.3867 Td (3460 3479 3618) 61.1592 Tj -9028.94 TJm (console_intr 6462) 74.2647 Tj 0 -170.8801 Td (B_VALID 2910) 52.4222 Tj -14045.3 TJm (0218 6248 6462) 61.1592 Tj 17.4613 -180.3735 Td (2910 3417 3460 3479) 83.0018 Tj -6520.6 TJm (console_lock 6270) 74.2647 Tj 17.4613 -189.8668 Td (3574 3607) 39.3166 Tj -13543.8 TJm (6270 6385 6431 6440) 83.0018 Tj 0 -199.3602 Td (C 6081 6459) 48.0537 Tj -14547 TJm (6443 6553) 39.3166 Tj 17.4613 -208.8535 Td (6081 6129 6154 6155) 83.0018 Tj -6520.6 TJm (console_read 6501) 74.2647 Tj 17.4613 -218.3469 Td (6156 6157 6158 6160) 83.0018 Tj -8527.14 TJm (6501 6557) 39.3166 Tj 17.4613 -227.8403 Td (6459 6469 6472 6479) 83.0018 Tj -6520.6 TJm (console_write 6435) 78.6333 Tj 17.4613 -237.3336 Td (6489 6519) 39.3166 Tj -13543.8 TJm (6435 6556) 39.3166 Tj 0 -246.827 Td (CAPSLOCK 6062) 56.7907 Tj -11537.1 TJm (cons_putc 6333) 61.1592 Tj 17.4613 -256.3203 Td (6062 6095 6236) 61.1592 Tj -11035.5 TJm (6333 6372 6396 6414) 83.0018 Tj 0 -265.8137 Td (cga_putc 6301) 56.7907 Tj -13543.7 TJm (6417 6421 6422 6442) 83.0018 Tj 17.4613 -275.3071 Td (6301 6342) 39.3166 Tj -13543.8 TJm (6476 6482 6488) 61.1592 Tj 0 -284.8004 Td (cli 0464) 34.9481 Tj -14045.5 TJm (context 1515) 52.4222 Tj 17.4613 -294.2938 Td (0464 0466 0914 1028) 83.0018 Tj -8527.14 TJm (0201 0308 1515 1540) 83.0018 Tj 17.4613 -303.7871 Td (1460 6336 6570) 61.1592 Tj -11035.5 TJm (1560 1746 1747 1748) 83.0018 Tj 0 -313.2805 Td (cmd 6865) 34.9481 Tj -16052 TJm (1832 1864 2129) 61.1592 Tj 17.4613 -322.7739 Td (6865 6877 6886 6887) 83.0018 Tj -6520.6 TJm (copyproc 1709) 56.7907 Tj 17.4613 -332.2672 Td (6892 6893 6898 6902) 83.0018 Tj -8527.14 TJm (0292 1709 1762 2812) 83.0018 Tj 17.4613 -341.7606 Td (6906 6915 6918 6923) 83.0018 Tj -6520.6 TJm (cp 1573) 30.5796 Tj 17.4613 -351.2539 Td (6931 6937 6941 6951) 83.0018 Tj -8527.14 TJm (1573 1657 1660 1661) 83.0018 Tj 17.4613 -360.7473 Td (6975 6977 7052 7055) 83.0018 Tj -8527.14 TJm (1662 1663 1664 1665) 83.0018 Tj 17.4613 -370.2407 Td (7057 7058 7059 7060) 83.0018 Tj -8527.14 TJm (1666 1857 1864 1872) 83.0018 Tj 17.4613 -379.734 Td (7063 7064 7066 7068) 83.0018 Tj -8527.14 TJm (1886 1905 1923 1924) 83.0018 Tj 17.4613 -389.2274 Td (7069 7070 7071 7072) 83.0018 Tj -8527.14 TJm (1928 2009 2014 2015) 83.0018 Tj 17.4613 -398.7207 Td (7073 7074 7075 7076) 83.0018 Tj -8527.14 TJm (2016 2020 2021 2026) 83.0018 Tj 17.4613 -408.2141 Td (7079 7080 7082 7084) 83.0018 Tj -8527.14 TJm (2030 2038 2039 2066) 83.0018 Tj 17.4613 -417.7075 Td (7085 7086 7087 7088) 83.0018 Tj -8527.14 TJm (2084 2090 2537 2539) 83.0018 Tj 17.4613 -427.2008 Td (7089 7100 7101 7103) 83.0018 Tj -8527.14 TJm (2541 2571 2579 2580) 83.0018 Tj 17.4613 -436.6942 Td (7105 7106 7107 7108) 83.0018 Tj -8527.14 TJm (2586 2591 2696 2710) 83.0018 Tj 17.4613 -446.1875 Td (7109 7110 7113 7114) 83.0018 Tj -8527.14 TJm (2712 2726 2778 2780) 83.0018 Tj 17.4613 -455.6809 Td (7116 7118 7119 7120) 83.0018 Tj -8527.14 TJm (2783 2784 2812 2845) 83.0018 Tj 17.4613 -465.1743 Td (7121 7122 7212 7213) 83.0018 Tj -8527.14 TJm (2873 4361 4571 4588) 83.0018 Tj 17.4613 -474.6676 Td (7214 7215 7217 7221) 83.0018 Tj -8527.14 TJm (4589 4646 4943 4944) 83.0018 Tj 17.4613 -484.161 Td (7224 7230 7231 7234) 83.0018 Tj -8527.14 TJm (4963 4969 4989 5097) 83.0018 Tj 17.4613 -493.6543 Td (7237 7239 7242 7246) 83.0018 Tj -8527.14 TJm (5101 5102 5103 5104) 83.0018 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 3 3 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 3) 187.8461 Tj 17.4613 -28.4801 Td (5105 5106 5258 5279) 83.0018 Tj -8527.14 TJm (4327 4328 4391 4665) 83.0018 Tj 17.4613 -37.9735 Td (6511) 17.4741 Tj -16052.1 TJm (4755 4805) 39.3166 Tj 0 -47.4664 Td (cprintf 6377) 52.4222 Tj -12038.8 TJm (disk_1_present 3327) 83.0018 Tj 17.4613 -56.9598 Td (0217 1221 1255 1262) 83.0018 Tj -8527.14 TJm (3327 3364 3462) 61.1592 Tj 17.4613 -66.4531 Td (2127 2131 2133 2235) 83.0018 Tj -6520.6 TJm (DPL_USER 0664) 56.7907 Tj 17.4613 -75.9465 Td (2328 2565 2573 2578) 83.0018 Tj -8527.14 TJm (0664 1690 1691 1767) 83.0018 Tj 17.4613 -85.4399 Td (2782 5637 5761 5912) 83.0018 Tj -8527.14 TJm (1768 2522 2586) 61.1592 Tj 17.4613 -94.9332 Td (6377 6572 6573 6574) 83.0018 Tj -6520.6 TJm (E0ESC 6066) 43.6851 Tj 17.4613 -104.4266 Td (6577) 17.4741 Tj -16052.1 TJm (6066 6220 6224 6225) 83.0018 Tj 0 -113.9199 Td (cpu 1557 5751) 56.7907 Tj -13543.7 TJm (6227 6230) 39.3166 Tj 17.4613 -123.4133 Td (0256 0269 1221 1255) 83.0018 Tj -6520.6 TJm (elfhdr 0805) 48.0537 Tj 17.4613 -132.9067 Td (1257 1258 1260 1262) 83.0018 Tj -8527.14 TJm (0805 1118 1122 5014) 83.0018 Tj 17.4613 -142.4 Td (1271 1279 1306 1367) 83.0018 Tj -6520.6 TJm (ELF_MAGIC 0802) 61.1592 Tj 17.4613 -151.8934 Td (1391 1408 1442 1461) 83.0018 Tj -8527.14 TJm (0802 1128 5029) 61.1592 Tj 17.4613 -161.3867 Td (1462 1470 1472 1557) 83.0018 Tj -6520.6 TJm (ELF_PROG_LOAD 0836) 78.6333 Tj 17.4613 -170.8801 Td (1568 1674 1677 1794) 83.0018 Tj -8527.14 TJm (0836 5034 5061) 61.1592 Tj 17.4613 -180.3735 Td (1811 1814 1861 1864) 83.0018 Tj -6520.6 TJm (EOI 5663) 34.9481 Tj 17.4613 -189.8668 Td (2548 2565 2566 2573) 83.0018 Tj -8527.14 TJm (5663 5734 5775) 61.1592 Tj 17.4613 -199.3602 Td (2574 2578 2579 5512) 83.0018 Tj -6520.6 TJm (ERROR 5681) 43.6851 Tj 17.4613 -208.8535 Td (5513 5751 5761 6572) 83.0018 Tj -8527.14 TJm (5681 5727) 39.3166 Tj 0 -218.3469 Td (create 4801) 48.0537 Tj -12540.5 TJm (ESR 5666) 34.9481 Tj 17.4613 -227.8403 Td (4801 4843 4862 4911) 83.0018 Tj -8527.14 TJm (5666 5730 5731) 61.1592 Tj 17.4613 -237.3336 Td (4923) 17.4741 Tj -14045.6 TJm (EXEC 6857) 39.3166 Tj 0 -246.827 Td (CRTPORT 6264) 52.4222 Tj -14045.3 TJm (6857 6922 7059 7365) 83.0018 Tj 17.4613 -256.3203 Td (6264 6306 6307 6308) 83.0018 Tj -6520.6 TJm (execcmd 6869 7053) 74.2647 Tj 17.4613 -265.8137 Td (6309 6325 6326 6327) 83.0018 Tj -8527.14 TJm (6869 6910 6923 7053) 83.0018 Tj 17.4613 -275.3071 Td (6328) 17.4741 Tj -16052.1 TJm (7055 7321 7327 7328) 83.0018 Tj 0 -284.8004 Td (CTL 6059) 34.9481 Tj -16052 TJm (7356 7366) 39.3166 Tj 17.4613 -294.2938 Td (6059 6085 6089 6235) 83.0018 Tj -6520.6 TJm (exit 2004) 39.3166 Tj 0 -303.7871 Td (curproc 1789) 52.4222 Tj -14045.3 TJm (0294 2004 2041 2538) 83.0018 Tj 17.4613 -313.2805 Td (0293 1559 1573 1789) 83.0018 Tj -8527.14 TJm (2542 2587 2822 6715) 83.0018 Tj 17.4613 -322.7739 Td (1794 1829 1836) 61.1592 Tj -11035.5 TJm (6718 6776 6781 6811) 83.0018 Tj 0 -332.2668 Td (devsw 2950) 43.6851 Tj -15048.7 TJm (6916 6925 6935 6980) 83.0018 Tj 17.4613 -341.7602 Td (2950 2955 4108 4110) 83.0018 Tj -8527.14 TJm (7028 7035) 39.3166 Tj 17.4613 -351.2536 Td (4158 4160 4407 6556) 83.0018 Tj -6520.6 TJm (fdalloc 4583) 52.4222 Tj 17.4613 -360.7469 Td (6557) 17.4741 Tj -16052.1 TJm (4583 4632 4874 4987) 83.0018 Tj 0 -370.2403 Td (dinode 3173) 48.0537 Tj -12540.5 TJm (fetchint 2666) 56.7907 Tj 17.4613 -379.7336 Td (3173 3187 3855 3868) 83.0018 Tj -8527.14 TJm (0332 2666 2696 4963) 83.0018 Tj 17.4613 -389.227 Td (3956 3962 3980 3983) 83.0018 Tj -6520.6 TJm (fetchstr 2678) 56.7907 Tj 0 -398.7204 Td (dirent 3203) 48.0537 Tj -14547 TJm (0333 2678 2726 4969) 83.0018 Tj 17.4613 -408.2137 Td (3203 4216 4223 4224) 83.0018 Tj -6520.6 TJm (file 3100) 39.3166 Tj 17.4613 -417.7071 Td (4255 4705 4754) 61.1592 Tj -11035.5 TJm (0202 0225 0226 0227) 83.0018 Tj 0 -427.2004 Td (dirlink 4252) 52.4222 Tj -14045.3 TJm (0229 0230 0231 0286) 83.0018 Tj 17.4613 -436.6938 Td (0234 4252 4267 4275) 83.0018 Tj -8527.14 TJm (1538 3100 4403 4409) 83.0018 Tj 17.4613 -446.1872 Td (4684 4831 4842) 61.1592 Tj -11035.5 TJm (4418 4425 4426 4427) 83.0018 Tj 0 -455.6805 Td (dirlookup 4212) 61.1592 Tj -13042 TJm (4429 4437 4438 4452) 83.0018 Tj 17.4613 -465.1739 Td (0235 4212 4219 4259) 83.0018 Tj -8527.14 TJm (4454 4478 4502 4522) 83.0018 Tj 17.4613 -474.6672 Td (4374 4770 4811) 61.1592 Tj -11035.5 TJm (4558 4564 4567 4583) 83.0018 Tj 0 -484.1606 Td (DIRSIZ 3201) 48.0537 Tj -14547 TJm (4603 4615 4627 4642) 83.0018 Tj 17.4613 -493.654 Td (3201 3205 4205 4272) 83.0018 Tj -8527.14 TJm (4653 4855 4979 5155) 83.0018 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 4) 187.8461 Tj 17.4613 -28.4801 Td (5170 6878 6933 6934) 83.0018 Tj -8527.14 TJm (0236 3952 3972 4821) 83.0018 Tj 17.4613 -37.9735 Td (7064 7072 7272) 61.1592 Tj -9028.94 TJm (IBLOCK 3190) 48.0537 Tj 0 -47.4664 Td (filealloc 4419) 61.1592 Tj -13042 TJm (3190 3867 3961 3982) 83.0018 Tj 17.4613 -56.9598 Td (0225 4419 4874 5176) 83.0018 Tj -6520.6 TJm (ICRHI 5674) 43.6851 Tj 0 -66.4531 Td (fileclose 4452) 61.1592 Tj -13042 TJm (5674 5737 5821 5833) 83.0018 Tj 17.4613 -75.9465 Td (0226 2015 4452 4458) 83.0018 Tj -6520.6 TJm (ICRLO 5667) 43.6851 Tj 17.4613 -85.4399 Td (4473 4647 4876 4990) 83.0018 Tj -8527.14 TJm (5667 5738 5739 5822) 83.0018 Tj 17.4613 -94.9332 Td (4991 5205 5209) 61.1592 Tj -11035.5 TJm (5824 5834) 39.3166 Tj 0 -104.4266 Td (filedup 4438) 52.4222 Tj -12038.8 TJm (ID 5660) 30.5796 Tj 17.4613 -113.9199 Td (0227 1741 4438 4442) 83.0018 Tj -8527.14 TJm (5660 5693 5766) 61.1592 Tj 17.4613 -123.4133 Td (4634) 17.4741 Tj -14045.6 TJm (IDE_BSY 3312) 52.4222 Tj 0 -132.9067 Td (fileinit 4412) 56.7907 Tj -13543.7 TJm (3312 3336) 39.3166 Tj 17.4613 -142.4 Td (0228 1229 4412) 61.1592 Tj -9028.94 TJm (IDE_CMD_READ 3317) 74.2647 Tj 0 -151.8934 Td (fileread 4502) 56.7907 Tj -13543.7 TJm (3317 3391) 39.3166 Tj 17.4613 -161.3867 Td (0229 4502 4517 4609) 83.0018 Tj -6520.6 TJm (IDE_CMD_WRITE 3318) 78.6333 Tj 0 -170.8801 Td (filestat 4478) 56.7907 Tj -13543.7 TJm (3318 3388) 39.3166 Tj 17.4613 -180.3735 Td (0230 4478 4658) 61.1592 Tj -9028.94 TJm (IDE_DF 3314) 48.0537 Tj 0 -189.8664 Td (filewrite 4522) 61.1592 Tj -13042 TJm (3314 3338) 39.3166 Tj 17.4613 -199.3598 Td (0231 4522 4537 4621) 83.0018 Tj -6520.6 TJm (IDE_DRDY 3313) 56.7907 Tj 0 -208.8532 Td (file_table_lock 4408) 87.3703 Tj -10032 TJm (3313 3336) 39.3166 Tj 17.4613 -218.3465 Td (4408 4414 4423 4428) 83.0018 Tj -6520.6 TJm (IDE_ERR 3315) 52.4222 Tj 17.4613 -227.8399 Td (4432 4440 4444 4456) 83.0018 Tj -8527.14 TJm (3315 3338) 39.3166 Tj 17.4613 -237.3332 Td (4460 4466) 39.3166 Tj -11537.3 TJm (ide_init 3351) 56.7907 Tj 0 -246.8266 Td (FL_IF 0610) 43.6851 Tj -15048.7 TJm (0251 1232 3351) 61.1592 Tj 17.4613 -256.32 Td (0610 1462 1468 1771) 83.0018 Tj -6520.6 TJm (ide_intr 3402) 56.7907 Tj 17.4613 -265.8133 Td (1855 5758) 39.3166 Tj -13543.8 TJm (0252 2557 3402) 61.1592 Tj 0 -275.3067 Td (fork1 7039) 43.6851 Tj -13042.1 TJm (ide_lock 3324) 56.7907 Tj 17.4613 -284.8 Td (6900 6942 6954 6961) 83.0018 Tj -8527.14 TJm (3324 3355 3406 3408) 83.0018 Tj 17.4613 -294.2934 Td (6976 7024 7039) 61.1592 Tj -11035.5 TJm (3425 3465 3480 3482) 83.0018 Tj 0 -303.7868 Td (forkret 1880) 52.4222 Tj -12038.8 TJm (ide_rw 3454) 48.0537 Tj 17.4613 -313.2801 Td (1614 1747 1880) 61.1592 Tj -11035.5 TJm (0253 3454 3459 3461) 83.0018 Tj 0 -322.7735 Td (forkret1 2484) 56.7907 Tj -13543.7 TJm (3608 3619) 39.3166 Tj 17.4613 -332.2664 Td (1615 1886 2483 2484) 83.0018 Tj -6520.6 TJm (ide_start_request 3375) 96.1073 Tj 0 -341.7598 Td (gatedesc 0751) 56.7907 Tj -13543.7 TJm (3328 3375 3378 3423) 83.0018 Tj 17.4613 -351.2532 Td (0414 0417 0751 2510) 83.0018 Tj -8527.14 TJm (3475) 17.4741 Tj 0 -360.7465 Td (getcallerpcs 1422) 74.2647 Tj -9530.47 TJm (ide_wait_ready 3332) 83.0018 Tj 17.4613 -370.2399 Td (0312 1392 1422 2129) 83.0018 Tj -8527.14 TJm (3332 3358 3380 3413) 83.0018 Tj 17.4613 -379.7332 Td (6575) 17.4741 Tj -14045.6 TJm (idtinit 2528) 52.4222 Tj 0 -389.2266 Td (getcmd 6984) 48.0537 Tj -14547 TJm (0340 1256 2528) 61.1592 Tj 17.4613 -398.72 Td (6984 7015) 39.3166 Tj -11537.3 TJm (idup 3838) 39.3166 Tj 0 -408.2133 Td (gettoken 7156) 56.7907 Tj -13543.7 TJm (0237 1742 3838 4361) 83.0018 Tj 17.4613 -417.7067 Td (7156 7241 7245 7257) 83.0018 Tj -6520.6 TJm (iget 3803) 39.3166 Tj 17.4613 -427.2 Td (7270 7271 7307 7311) 83.0018 Tj -8527.14 TJm (3803 3823 3968 4234) 83.0018 Tj 17.4613 -436.6934 Td (7333) 17.4741 Tj -16052.1 TJm (4359) 17.4741 Tj 0 -446.1868 Td (growproc 1653) 56.7907 Tj -11537.1 TJm (iinit 3789) 43.6851 Tj 17.4613 -455.6801 Td (0295 1653 2858) 61.1592 Tj -11035.5 TJm (0238 1230 3789) 61.1592 Tj 0 -465.1735 Td (holding 1440) 52.4222 Tj -12038.8 TJm (ilock 3852) 43.6851 Tj 17.4613 -474.6665 Td (0313 1378 1404 1440) 83.0018 Tj -8527.14 TJm (0239 3852 3858 3878) 83.0018 Tj 17.4613 -484.1598 Td (1859) 17.4741 Tj -16052.1 TJm (4364 4481 4511 4531) 83.0018 Tj 0 -493.6532 Td (ialloc 3952) 48.0537 Tj -14547 TJm (4672 4683 4693 4762) 83.0018 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 4 4 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 5) 187.8461 Tj 17.4613 -28.4801 Td (4774 4809 4813 4825) 83.0018 Tj -8527.14 TJm (5932) 17.4741 Tj 17.4613 -37.9735 Td (4867 4937 5020 6444) 83.0018 Tj -6520.6 TJm (IO_PIC1 5957) 52.4222 Tj 17.4613 -47.4668 Td (6513 6533) 39.3166 Tj -13543.8 TJm (5957 5970 5985 5994) 83.0018 Tj 0 -56.9602 Td (inb 0353) 34.9481 Tj -16052 TJm (5997 6002 6012 6026) 83.0018 Tj 17.4613 -66.4535 Td (0353 0928 0936 1154) 83.0018 Tj -8527.14 TJm (6027) 17.4741 Tj 17.4613 -75.9469 Td (3336 3363 5646 6214) 83.0018 Tj -6520.6 TJm (IO_PIC2 5958) 52.4222 Tj 17.4613 -85.4403 Td (6217 6282 6307 6309) 83.0018 Tj -8527.14 TJm (5958 5971 5986 6015) 83.0018 Tj 0 -94.9336 Td (INDIRECT 3168) 56.7907 Tj -13543.7 TJm (6016 6017 6020 6029) 83.0018 Tj 17.4613 -104.427 Td (3168 4027 4030 4065) 83.0018 Tj -8527.14 TJm (6030) 17.4741 Tj 17.4613 -113.9203 Td (4066 4073) 39.3166 Tj -11537.3 TJm (IO_RTC 5800) 48.0537 Tj 0 -123.4137 Td (initlock 1363) 56.7907 Tj -13543.7 TJm (5800 5813 5814) 61.1592 Tj 17.4613 -132.9071 Td (0314 1363 1620 2231) 83.0018 Tj -6520.6 TJm (IO_TIMER1 6609) 61.1592 Tj 17.4613 -142.4004 Td (2524 3355 3542 3791) 83.0018 Tj -8527.14 TJm (6609 6618 6628 6629) 83.0018 Tj 17.4613 -151.8938 Td (4414 5184 6553 6554) 83.0018 Tj -6520.6 TJm (IPB 3187) 34.9481 Tj 0 -161.3871 Td (inode 3252) 43.6851 Tj -15048.7 TJm (3187 3190 3196 3868) 83.0018 Tj 17.4613 -170.8805 Td (0203 0234 0235 0236) 83.0018 Tj -8527.14 TJm (3962 3983) 39.3166 Tj 17.4613 -180.3739 Td (0237 0239 0240 0241) 83.0018 Tj -6520.6 TJm (iput 3902) 39.3166 Tj 17.4613 -189.8672 Td (0242 0243 0245 0246) 83.0018 Tj -8527.14 TJm (0240 2020 3902 3908) 83.0018 Tj 17.4613 -199.3606 Td (0247 0248 0249 1539) 83.0018 Tj -8527.14 TJm (3927 4260 4382 4471) 83.0018 Tj 17.4613 -208.8539 Td (2951 2952 3106 3252) 83.0018 Tj -8527.14 TJm (4687 4943) 39.3166 Tj 17.4613 -218.3473 Td (3675 3785 3802 3805) 83.0018 Tj -6520.6 TJm (IRQ_ERROR 2384) 61.1592 Tj 17.4613 -227.8407 Td (3811 3837 3838 3852) 83.0018 Tj -8527.14 TJm (2384 5727) 39.3166 Tj 17.4613 -237.334 Td (3884 3902 3924 3951) 83.0018 Tj -6520.6 TJm (IRQ_IDE 2383) 52.4222 Tj 17.4613 -246.8274 Td (3977 4010 4052 4082) 83.0018 Tj -8527.14 TJm (2383 2556 3356 3357) 83.0018 Tj 17.4613 -256.3207 Td (4102 4152 4211 4212) 83.0018 Tj -6520.6 TJm (IRQ_KBD 2382) 52.4222 Tj 17.4613 -265.8141 Td (4252 4256 4353 4356) 83.0018 Tj -8527.14 TJm (2382 2560 6560 6561) 83.0018 Tj 17.4613 -275.3075 Td (4388 4395 4666 4702) 83.0018 Tj -6520.6 TJm (IRQ_OFFSET 2379) 65.5277 Tj 17.4613 -284.8008 Td (4753 4800 4804 4856) 83.0018 Tj -8527.14 TJm (2379 2547 2556 2560) 83.0018 Tj 17.4613 -294.2942 Td (4903 4921 4933 5015) 83.0018 Tj -8527.14 TJm (2564 2591 5707 5714) 83.0018 Tj 17.4613 -303.7875 Td (6435 6501) 39.3166 Tj -13543.8 TJm (5727 5917 5931 5997) 83.0018 Tj 0 -313.2809 Td (INPUT_BUF 6450) 61.1592 Tj -13042 TJm (6016) 17.4741 Tj 17.4613 -322.7743 Td (6450 6453 6474 6486) 83.0018 Tj -6520.6 TJm (IRQ_SLAVE 5960) 61.1592 Tj 17.4613 -332.2676 Td (6487 6489 6518) 61.1592 Tj -11035.5 TJm (5960 5964 6002 6017) 83.0018 Tj 0 -341.761 Td (insl 0362) 39.3166 Tj -13543.8 TJm (IRQ_SPURIOUS 2385) 74.2647 Tj 17.4613 -351.2543 Td (0362 1173 3414) 61.1592 Tj -11035.5 TJm (2385 2564 5707) 61.1592 Tj 0 -360.7477 Td (INT_DISABLED 5869) 74.2647 Tj -9530.47 TJm (IRQ_TIMER 2381) 61.1592 Tj 17.4613 -370.2411 Td (5869 5917) 39.3166 Tj -13543.8 TJm (2381 2547 2591 5714) 83.0018 Tj 0 -379.7344 Td (IOAPIC 5858) 48.0537 Tj -14547 TJm (6630) 17.4741 Tj 17.4613 -389.2278 Td (5858 5908) 39.3166 Tj -11537.3 TJm (isdirempty 4702) 65.5277 Tj 0 -398.7211 Td (ioapic_enable 5923) 78.6333 Tj -11035.3 TJm (4702 4709 4778) 61.1592 Tj 17.4613 -408.2145 Td (0256 3357 5923 6561) 83.0018 Tj -6520.6 TJm (ismp 5514) 39.3166 Tj 0 -417.7079 Td (ioapic_id 5516) 61.1592 Tj -13042 TJm (0276 1233 5514 5613) 83.0018 Tj 17.4613 -427.2012 Td (0257 5516 5628 5911) 83.0018 Tj -8527.14 TJm (5905 5925) 39.3166 Tj 17.4613 -436.6946 Td (5912) 17.4741 Tj -14045.6 TJm (itrunc 4052) 48.0537 Tj 0 -446.1879 Td (ioapic_init 5901) 69.8962 Tj -12038.7 TJm (3675 3911 4052) 61.1592 Tj 17.4613 -455.6813 Td (0258 1226 5901 5912) 83.0018 Tj -6520.6 TJm (iunlock 3884) 52.4222 Tj 0 -465.1747 Td (ioapic_read 5884) 69.8962 Tj -12038.7 TJm (0241 3884 3887 3926) 83.0018 Tj 17.4613 -474.6676 Td (5884 5909 5910) 61.1592 Tj -11035.5 TJm (4371 4483 4514 4534) 83.0018 Tj 0 -484.161 Td (ioapic_write 5891) 74.2647 Tj -11537 TJm (4679 4880 4942 6439) 83.0018 Tj 17.4613 -493.6543 Td (5891 5917 5918 5931) 83.0018 Tj -8527.14 TJm (6506) 17.4741 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 6) 187.8461 Tj 0 -28.4801 Td (iunlockput 3924) 65.5277 Tj -10533.8 TJm (KEY_RT 6074) 48.0537 Tj 17.4613 -37.9735 Td (0242 3924 4366 4375) 83.0018 Tj -8527.14 TJm (6074 6117 6139 6163) 83.0018 Tj 17.4613 -47.4664 Td (4378 4674 4686 4692) 83.0018 Tj -6520.6 TJm (KEY_UP 6071) 48.0537 Tj 17.4613 -56.9594 Td (4696 4766 4771 4779) 83.0018 Tj -8527.14 TJm (6071 6115 6137 6161) 83.0018 Tj 17.4613 -66.4524 Td (4780 4787 4791 4812) 83.0018 Tj -6520.6 TJm (kfree 2255) 43.6851 Tj 17.4613 -75.9453 Td (4815 4822 4833 4834) 83.0018 Tj -8527.14 TJm (0262 1662 1731 2069) 83.0018 Tj 17.4613 -85.4383 Td (4845 4869 4877 4913) 83.0018 Tj -8527.14 TJm (2070 2236 2255 2260) 83.0018 Tj 17.4613 -94.9313 Td (4925 4939 5069 5112) 83.0018 Tj -8527.14 TJm (5101 5111 5202 5228) 83.0018 Tj 0 -104.4246 Td (iupdate 3977) 52.4222 Tj -12038.8 TJm (kill 1976) 39.3166 Tj 17.4613 -113.918 Td (0243 3913 3977 4077) 83.0018 Tj -8527.14 TJm (0296 1976 2578 2839) 83.0018 Tj 17.4613 -123.411 Td (4178 4678 4695 4790) 83.0018 Tj -8527.14 TJm (6817) 17.4741 Tj 17.4613 -132.9039 Td (4829 4840) 39.3166 Tj -11537.3 TJm (kinit 2225) 43.6851 Tj 0 -142.3973 Td (I_BUSY 3266) 48.0537 Tj -14547 TJm (0263 1227 2225) 61.1592 Tj 17.4613 -151.8907 Td (3266 3861 3863 3886) 83.0018 Tj -6520.6 TJm (KSTACKSIZE 0152) 65.5277 Tj 17.4613 -161.3836 Td (3890 3907 3909 3915) 83.0018 Tj -8527.14 TJm (0152 1283 1284 1680) 83.0018 Tj 0 -170.877 Td (I_VALID 3267) 52.4222 Tj -14045.3 TJm (1719 1723 1731 2070) 83.0018 Tj 17.4613 -180.3703 Td (3267 3866 3876 3905) 83.0018 Tj -6520.6 TJm (lapicw 5690) 48.0537 Tj 0 -189.8633 Td (kalloc 2304) 48.0537 Tj -14547 TJm (5690 5707 5713 5714) 83.0018 Tj 17.4613 -199.3567 Td (0261 1283 1657 1719) 83.0018 Tj -8527.14 TJm (5715 5718 5719 5724) 83.0018 Tj 17.4613 -208.8497 Td (1730 1764 2231 2304) 83.0018 Tj -8527.14 TJm (5727 5730 5731 5734) 83.0018 Tj 17.4613 -218.3426 Td (2310 2328 5052 5178) 83.0018 Tj -8527.14 TJm (5737 5738 5743 5775) 83.0018 Tj 0 -227.836 Td (kalloc_lock 2212) 69.8962 Tj -12038.7 TJm (5821 5822 5824 5833) 83.0018 Tj 17.4613 -237.3293 Td (2212 2231 2265 2293) 83.0018 Tj -8527.14 TJm (5834) 17.4741 Tj 17.4613 -246.8223 Td (2312 2316 2322 2326) 83.0018 Tj -6520.6 TJm (lapic_eoi 5772) 61.1592 Tj 0 -256.3157 Td (KBDATAP 6054) 52.4222 Tj -14045.3 TJm (0271 2554 2558 2562) 83.0018 Tj 17.4613 -265.809 Td (6054 6217) 39.3166 Tj -13543.8 TJm (2567 5772) 39.3166 Tj 0 -275.3024 Td (kbd_getc 6206) 56.7907 Tj -11537.1 TJm (lapic_init 5701) 65.5277 Tj 17.4613 -284.7958 Td (6206 6248) 39.3166 Tj -13543.8 TJm (0272 1220 1258 5701) 83.0018 Tj 0 -294.2891 Td (kbd_intr 6246) 56.7907 Tj -11537.1 TJm (lapic_startap 5805) 78.6333 Tj 17.4613 -303.7825 Td (0266 2561 6246) 61.1592 Tj -11035.5 TJm (0273 1286 5805) 61.1592 Tj 0 -313.2758 Td (KBSTATP 6052) 52.4222 Tj -12038.8 TJm (lgdt 0403) 39.3166 Tj 17.4613 -322.7692 Td (6052 6214) 39.3166 Tj -13543.8 TJm (0403 0411 0954 1054) 83.0018 Tj 0 -332.2622 Td (KBS_DIB 6053) 52.4222 Tj -14045.3 TJm (1700) 17.4741 Tj 17.4613 -341.7555 Td (6053 6215) 39.3166 Tj -11537.3 TJm (lidt 0417) 39.3166 Tj 0 -351.2489 Td (KEY_DEL 6078) 52.4222 Tj -14045.3 TJm (0417 0425 2530) 61.1592 Tj 17.4613 -360.7422 Td (6078 6119 6141 6165) 83.0018 Tj -6520.6 TJm (LINT0 5679) 43.6851 Tj 0 -370.2356 Td (KEY_DN 6072) 48.0537 Tj -14547 TJm (5679 5718) 39.3166 Tj 17.4613 -379.729 Td (6072 6115 6137 6161) 83.0018 Tj -6520.6 TJm (LINT1 5680) 43.6851 Tj 0 -389.2223 Td (KEY_END 6070) 52.4222 Tj -14045.3 TJm (5680 5719) 39.3166 Tj 17.4613 -398.7157 Td (6070 6118 6140 6164) 83.0018 Tj -6520.6 TJm (LIST 6860) 39.3166 Tj 0 -408.209 Td (KEY_HOME 6069) 56.7907 Tj -13543.7 TJm (6860 6940 7107 7383) 83.0018 Tj 17.4613 -417.7024 Td (6069 6118 6140 6164) 83.0018 Tj -6520.6 TJm (listcmd 6890 7101) 74.2647 Tj 0 -427.1958 Td (KEY_INS 6077) 52.4222 Tj -14045.3 TJm (6890 6911 6941 7101) 83.0018 Tj 17.4613 -436.6891 Td (6077 6119 6141 6165) 83.0018 Tj -8527.14 TJm (7103 7246 7357 7384) 83.0018 Tj 0 -446.1825 Td (KEY_LF 6073) 48.0537 Tj -12540.5 TJm (LPTPORT 6265) 52.4222 Tj 17.4613 -455.6758 Td (6073 6117 6139 6163) 83.0018 Tj -8527.14 TJm (6265 6282 6286 6287) 83.0018 Tj 0 -465.1692 Td (KEY_PGDN 6076) 56.7907 Tj -13543.7 TJm (6288) 17.4741 Tj 17.4613 -474.6622 Td (6076 6116 6138 6162) 83.0018 Tj -6520.6 TJm (lpt_putc 6278) 56.7907 Tj 0 -484.1555 Td (KEY_PGUP 6075) 56.7907 Tj -13543.7 TJm (6278 6341) 39.3166 Tj 17.4613 -493.6489 Td (6075 6116 6138 6162) 83.0018 Tj -6520.6 TJm (ltr 0429) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 5 5 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 7) 187.8461 Tj 17.4613 -28.4801 Td (0429 0431 1701) 61.1592 Tj -11035.5 TJm (5638) 17.4741 Tj 0 -37.9735 Td (MAXARGS 6863) 52.4222 Tj -12038.8 TJm (mp_search 5556) 61.1592 Tj 17.4613 -47.4664 Td (6863 6871 6872 7340) 83.0018 Tj -8527.14 TJm (5556 5585) 39.3166 Tj 0 -56.9598 Td (MAXFILE 3170) 52.4222 Tj -12038.8 TJm (mp_search1 5537) 65.5277 Tj 17.4613 -66.4531 Td (3170 4165 4166) 61.1592 Tj -11035.5 TJm (5537 5564 5568 5571) 83.0018 Tj 0 -75.9465 Td (memcmp 5315) 48.0537 Tj -12540.5 TJm (NADDRS 3166) 48.0537 Tj 17.4613 -85.4399 Td (0320 5315 5543 5588) 83.0018 Tj -8527.14 TJm (3166 3179 3263) 61.1592 Tj 0 -94.9332 Td (memmove 5331) 52.4222 Tj -12038.8 TJm (namecmp 4203) 52.4222 Tj 17.4613 -104.4266 Td (0321 1276 1660 1727) 83.0018 Tj -8527.14 TJm (0244 4203 4228 4765) 83.0018 Tj 17.4613 -113.9199 Td (1737 1780 3684 3874) 83.0018 Tj -6520.6 TJm (namei 4389) 43.6851 Tj 17.4613 -123.4133 Td (3989 4121 4171 4328) 83.0018 Tj -8527.14 TJm (0245 1765 4389 4670) 83.0018 Tj 17.4613 -132.9067 Td (4330 5080 5331 6320) 83.0018 Tj -8527.14 TJm (4865 4935 5018) 61.1592 Tj 0 -142.4 Td (memset 5303) 48.0537 Tj -12540.5 TJm (nameiparent 4396) 69.8962 Tj 17.4613 -151.8934 Td (0322 1217 1661 1746) 83.0018 Tj -8527.14 TJm (0246 4396 4681 4760) 83.0018 Tj 17.4613 -161.3867 Td (1766 2263 3695 3964) 83.0018 Tj -8527.14 TJm (4807) 17.4741 Tj 17.4613 -170.8801 Td (4784 4959 5055 5067) 83.0018 Tj -6520.6 TJm (NBUF 0156) 39.3166 Tj 17.4613 -180.3735 Td (5303 6322 6987 7058) 83.0018 Tj -8527.14 TJm (0156 3529 3553) 61.1592 Tj 17.4613 -189.8668 Td (7069 7085 7106 7119) 83.0018 Tj -6520.6 TJm (NCPU 0153) 39.3166 Tj 0 -199.3602 Td (microdelay 5781) 65.5277 Tj -12540.3 TJm (0153 1568 5512) 61.1592 Tj 17.4613 -208.8535 Td (5781 5823 5825 5835) 83.0018 Tj -6520.6 TJm (NDEV 0158) 39.3166 Tj 0 -218.3469 Td (min 3674) 34.9481 Tj -16052 TJm (0158 4108 4158 4407) 83.0018 Tj 17.4613 -227.8403 Td (3674 4120 4170) 61.1592 Tj -9028.94 TJm (NDIRECT 3167) 52.4222 Tj 0 -237.3336 Td (mp 5402) 30.5796 Tj 174.613 -237.3336 Td (3166 3167 3170 4015) 83.0018 Tj 17.461 -246.827 Td (5402 5507 5536 5542) 83.0018 Tj -8527.14 TJm (4023 4058) 39.3166 Tj 17.461 -256.3203 Td (5543 5544 5555 5560) 83.0018 Tj -6520.6 TJm (NELEM 0346) 43.6851 Tj 17.461 -265.8137 Td (5564 5565 5568 5569) 83.0018 Tj -8527.14 TJm (0346 2123 2779 4961) 83.0018 Tj 17.461 -275.3071 Td (5580 5583 5585 5587) 83.0018 Tj -6520.6 TJm (NFILE 0155) 43.6851 Tj 17.461 -284.8004 Td (5594 5604 5610 5642) 83.0018 Tj -8527.14 TJm (0155 4409 4424) 61.1592 Tj -0.0003 -294.2938 Td (MPBUS 5452) 43.6851 Tj -13042.1 TJm (NINDIRECT 3169) 61.1592 Tj 17.461 -303.7871 Td (5452 5631) 39.3166 Tj -13543.8 TJm (3169 3170 4025 4068) 83.0018 Tj -0.0003 -313.2805 Td (mpconf 5413) 48.0537 Tj -12540.5 TJm (NINODE 0157) 48.0537 Tj 17.461 -322.7739 Td (5413 5579 5582 5587) 83.0018 Tj -8527.14 TJm (0157 3785 3811) 61.1592 Tj 17.461 -332.2672 Td (5605) 17.4741 Tj -14045.6 TJm (NO 6056) 30.5796 Tj -0.0003 -341.7606 Td (mpioapic 5439) 56.7907 Tj -13543.7 TJm (6056 6102 6105 6107) 83.0018 Tj 17.461 -351.2539 Td (5439 5607 5627 5629) 83.0018 Tj -8527.14 TJm (6108 6109 6110 6112) 83.0018 Tj -0.0003 -360.7473 Td (MPIOINTR 5454) 56.7907 Tj -13543.7 TJm (6124 6127 6129 6130) 83.0018 Tj 17.461 -370.2407 Td (5454 5632) 39.3166 Tj -13543.8 TJm (6131 6132 6134 6152) 83.0018 Tj -0.0003 -379.734 Td (MPLINTR 5455) 52.4222 Tj -14045.3 TJm (6153 6155 6156 6157) 83.0018 Tj 17.461 -389.2274 Td (5455 5633) 39.3166 Tj -13543.8 TJm (6158) 17.4741 Tj -0.0003 -398.7207 Td (mpmain 1253) 48.0537 Tj -12540.5 TJm (NOFILE 0154) 48.0537 Tj 17.461 -408.2141 Td (1208 1239 1253 1255) 83.0018 Tj -8527.14 TJm (0154 1538 1739 2013) 83.0018 Tj 17.461 -417.7075 Td (1285) 17.4741 Tj -16052.1 TJm (4571 4587) 39.3166 Tj -0.0003 -427.2008 Td (mpproc 5428) 48.0537 Tj -12540.5 TJm (NPROC 0150) 43.6851 Tj 17.461 -436.6942 Td (5428 5606 5619 5624) 83.0018 Tj -8527.14 TJm (0150 1610 1633 1821) 83.0018 Tj -0.0003 -446.1875 Td (mp_bcpu 5519) 52.4222 Tj -14045.3 TJm (1957 1981 2029 2062) 83.0018 Tj 17.461 -455.6809 Td (0277 1220 1257 5519) 83.0018 Tj -8527.14 TJm (2119) 17.4741 Tj -0.0003 -465.1743 Td (mp_config 5580) 61.1592 Tj -11035.5 TJm (NSEGS 1506) 43.6851 Tj 17.461 -474.6672 Td (5580 5610) 39.3166 Tj -13543.8 TJm (1506 1562) 39.3166 Tj -0.0003 -484.1606 Td (mp_init 5601) 52.4222 Tj -12038.8 TJm (nulterminate 7352) 74.2647 Tj 17.461 -493.654 Td (0278 1219 5601 5637) 83.0018 Tj -8527.14 TJm (7215 7230 7352 7373) 83.0018 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 8) 187.8461 Tj 17.4613 -28.4801 Td (7379 7380 7385 7386) 83.0018 Tj -8527.14 TJm (6901 6920 6953 7032) 83.0018 Tj 17.4613 -37.9735 Td (7391) 17.4741 Tj -16052.1 TJm (7045 7228 7272 7306) 83.0018 Tj 0 -47.4664 Td (NUMLOCK 6063) 52.4222 Tj -14045.3 TJm (7310 7336 7341) 61.1592 Tj 17.4613 -56.9598 Td (6063 6096) 39.3166 Tj -11537.3 TJm (parseblock 7301) 65.5277 Tj 0 -66.4531 Td (outb 0371) 39.3166 Tj -15550.3 TJm (7301 7306 7325) 61.1592 Tj 17.4613 -75.9465 Td (0371 0933 0941 1164) 83.0018 Tj -6520.6 TJm (parsecmd 7218) 56.7907 Tj 17.4613 -85.4399 Td (1165 1166 1167 1168) 83.0018 Tj -8527.14 TJm (6902 7025 7218) 61.1592 Tj 17.4613 -94.9332 Td (1169 3361 3370 3381) 83.0018 Tj -6520.6 TJm (parseexec 7317) 61.1592 Tj 17.4613 -104.4266 Td (3382 3383 3384 3385) 83.0018 Tj -8527.14 TJm (7214 7255 7317) 61.1592 Tj 17.4613 -113.9199 Td (3386 3388 3391 5645) 83.0018 Tj -6520.6 TJm (parseline 7235) 61.1592 Tj 17.4613 -123.4133 Td (5646 5813 5814 5970) 83.0018 Tj -8527.14 TJm (7212 7224 7235 7246) 83.0018 Tj 17.4613 -132.9067 Td (5971 5985 5986 5994) 83.0018 Tj -8527.14 TJm (7308) 17.4741 Tj 17.4613 -142.4 Td (5997 6002 6012 6015) 83.0018 Tj -6520.6 TJm (parsepipe 7251) 61.1592 Tj 17.4613 -151.8934 Td (6016 6017 6020 6026) 83.0018 Tj -8527.14 TJm (7213 7239 7251 7258) 83.0018 Tj 17.4613 -161.3867 Td (6027 6029 6030 6286) 83.0018 Tj -6520.6 TJm (parseredirs 7264) 69.8962 Tj 17.4613 -170.8801 Td (6287 6288 6306 6308) 83.0018 Tj -8527.14 TJm (7264 7312 7331 7342) 83.0018 Tj 17.4613 -180.3735 Td (6325 6326 6327 6328) 83.0018 Tj -6520.6 TJm (PCINT 5678) 43.6851 Tj 17.4613 -189.8668 Td (6627 6628 6629) 61.1592 Tj -11035.5 TJm (5678 5724) 39.3166 Tj 0 -199.3602 Td (outsl 0383) 43.6851 Tj -13042.1 TJm (peek 7201) 39.3166 Tj 17.4613 -208.8535 Td (0383 3389) 39.3166 Tj -13543.8 TJm (7201 7225 7240 7244) 83.0018 Tj 0 -218.3469 Td (outw 0377) 39.3166 Tj -15550.3 TJm (7256 7269 7305 7309) 83.0018 Tj 17.4613 -227.8403 Td (0377 1143 1144) 61.1592 Tj -11035.5 TJm (7324 7332) 39.3166 Tj 0 -237.3336 Td (O_CREATE 3003) 56.7907 Tj -11537.1 TJm (pic_enable 5975) 65.5277 Tj 17.4613 -246.827 Td (3003 4861 7278 7281) 83.0018 Tj -8527.14 TJm (0282 3356 5975 6560) 83.0018 Tj 0 -256.3203 Td (O_RDONLY 3000) 56.7907 Tj -13543.7 TJm (6630) 17.4741 Tj 17.4613 -265.8137 Td (3000 7275) 39.3166 Tj -11537.3 TJm (pic_init 5982) 56.7907 Tj 0 -275.3071 Td (O_RDWR 3002) 48.0537 Tj -14547 TJm (0283 1225 5982) 61.1592 Tj 17.4613 -284.8004 Td (3002 4868 4886 6764) 83.0018 Tj -6520.6 TJm (pic_setmask 5967) 69.8962 Tj 17.4613 -294.2938 Td (6766 7007) 39.3166 Tj -13543.8 TJm (5967 5977 6033) 61.1592 Tj 0 -303.7871 Td (O_WRONLY 3001) 56.7907 Tj -11537.1 TJm (pinit 1618) 43.6851 Tj 17.4613 -313.2805 Td (3001 4868 4885 4886) 83.0018 Tj -8527.14 TJm (0297 1223 1618) 61.1592 Tj 17.4613 -322.7739 Td (7278 7281) 39.3166 Tj -11537.3 TJm (pipe 5160) 39.3166 Tj 0 -332.2668 Td (PAGE 0151) 39.3166 Tj -15550.3 TJm (0204 0287 0288 0289) 83.0018 Tj 17.4613 -341.7602 Td (0151 0152 1763 2233) 83.0018 Tj -8527.14 TJm (3105 4469 4509 4529) 83.0018 Tj 17.4613 -351.2536 Td (2235 2236 2259 2309) 83.0018 Tj -8527.14 TJm (5160 5172 5178 5184) 83.0018 Tj 17.4613 -360.7469 Td (5049 5051 5178 5202) 83.0018 Tj -8527.14 TJm (5188 5192 5215 5251) 83.0018 Tj 17.4613 -370.2403 Td (5228) 17.4741 Tj -16052.1 TJm (5273 6813 6952 6953) 83.0018 Tj 0 -379.7336 Td (panic 6565 7032) 65.5277 Tj -10533.8 TJm (pipealloc 5170) 61.1592 Tj 17.4613 -389.227 Td (0219 1379 1405 1469) 83.0018 Tj -8527.14 TJm (0286 4984 5170) 61.1592 Tj 17.4613 -398.7204 Td (1471 1856 1858 1860) 83.0018 Tj -6520.6 TJm (pipeclose 5215) 61.1592 Tj 17.4613 -408.2137 Td (1862 1906 1909 2010) 83.0018 Tj -8527.14 TJm (0287 4469 5215) 61.1592 Tj 17.4613 -417.7071 Td (2041 2260 2271 2310) 83.0018 Tj -6520.6 TJm (pipecmd 6884 7080) 74.2647 Tj 17.4613 -427.2004 Td (2575 3378 3459 3461) 83.0018 Tj -8527.14 TJm (6884 6912 6951 7080) 83.0018 Tj 17.4613 -436.6938 Td (3463 3596 3617 3627) 83.0018 Tj -8527.14 TJm (7082 7258 7358 7378) 83.0018 Tj 17.4613 -446.1872 Td (3725 3743 3823 3858) 83.0018 Tj -6520.6 TJm (piperead 5273) 56.7907 Tj 17.4613 -455.6805 Td (3878 3887 3908 3972) 83.0018 Tj -8527.14 TJm (0288 4509 5273) 61.1592 Tj 17.4613 -465.1739 Td (4047 4219 4267 4275) 83.0018 Tj -6520.6 TJm (PIPESIZE 5158) 56.7907 Tj 17.4613 -474.6672 Td (4442 4458 4473 4517) 83.0018 Tj -8527.14 TJm (5158 5166 5257 5265) 83.0018 Tj 17.4613 -484.1606 Td (4537 4709 4777 4786) 83.0018 Tj -8527.14 TJm (5288) 17.4741 Tj 17.4613 -493.654 Td (4843 5638 6565 6572) 83.0018 Tj -6520.6 TJm (pipewrite 5251) 61.1592 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 6 6 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 9) 187.8461 Tj 17.4613 -28.4801 Td (0289 4529 5251) 61.1592 Tj -11035.5 TJm (5758) 17.4741 Tj 0 -37.9735 Td (popcli 1466) 48.0537 Tj -12540.5 TJm (REDIR 6858) 43.6851 Tj 17.4613 -47.4664 Td (0317 1417 1466 1469) 83.0018 Tj -8527.14 TJm (6858 6930 7070 7371) 83.0018 Tj 17.4613 -56.9598 Td (1471 1702 1795) 61.1592 Tj -9028.94 TJm (redircmd 6875 7064) 78.6333 Tj 0 -66.4531 Td (printint 6351) 56.7907 Tj -13543.7 TJm (6875 6913 6931 7064) 83.0018 Tj 17.4613 -75.9465 Td (6351 6403 6407) 61.1592 Tj -11035.5 TJm (7066 7275 7278 7281) 83.0018 Tj 0 -85.4399 Td (proc 1529) 39.3166 Tj -15550.3 TJm (7359 7372) 39.3166 Tj 17.4613 -94.9332 Td (0205 0292 0293 0300) 83.0018 Tj -6520.6 TJm (REG_ID 5860) 48.0537 Tj 17.4613 -104.4266 Td (0332 0333 1204 1357) 83.0018 Tj -8527.14 TJm (5860 5910) 39.3166 Tj 17.4613 -113.9199 Td (1529 1535 1559 1605) 83.0018 Tj -6520.6 TJm (REG_TABLE 5862) 61.1592 Tj 17.4613 -123.4133 Td (1610 1611 1626 1630) 83.0018 Tj -8527.14 TJm (5862 5917 5918 5931) 83.0018 Tj 17.4613 -132.9067 Td (1634 1672 1708 1709) 83.0018 Tj -8527.14 TJm (5932) 17.4741 Tj 17.4613 -142.4 Td (1712 1759 1788 1791) 83.0018 Tj -6520.6 TJm (REG_VER 5861) 52.4222 Tj 17.4613 -151.8934 Td (1810 1822 1955 1957) 83.0018 Tj -8527.14 TJm (5861 5909) 39.3166 Tj 17.4613 -161.3867 Td (1978 1981 2006 2029) 83.0018 Tj -6520.6 TJm (release 1402) 52.4222 Tj 17.4613 -170.8801 Td (2055 2063 2115 2120) 83.0018 Tj -8527.14 TJm (0315 1402 1405 1638) 83.0018 Tj 17.4613 -180.3735 Td (2504 2578 2654 2666) 83.0018 Tj -8527.14 TJm (1642 1839 1874 1883) 83.0018 Tj 17.4613 -189.8668 Td (2678 2804 2810 3306) 83.0018 Tj -8527.14 TJm (1919 1932 1969 1987) 83.0018 Tj 17.4613 -199.3602 Td (3667 4555 5003 5154) 83.0018 Tj -8527.14 TJm (1991 2076 2085 2293) 83.0018 Tj 17.4613 -208.8535 Td (5510 5606 5619 5620) 83.0018 Tj -8527.14 TJm (2316 2322 2326 2552) 83.0018 Tj 17.4613 -218.3469 Td (5621 6261) 39.3166 Tj -13543.8 TJm (2874 2879 3408 3425) 83.0018 Tj 0 -227.8403 Td (procdump 2104) 56.7907 Tj -13543.7 TJm (3482 3581 3592 3641) 83.0018 Tj 17.4613 -237.3336 Td (0298 2104 6470) 61.1592 Tj -11035.5 TJm (3814 3830 3842 3864) 83.0018 Tj 0 -246.827 Td (proc_table_lock 1608) 87.3703 Tj -10032 TJm (3892 3910 3919 4428) 83.0018 Tj 17.4613 -256.3203 Td (1608 1620 1632 1638) 83.0018 Tj -8527.14 TJm (4432 4444 4460 4466) 83.0018 Tj 17.4613 -265.8137 Td (1642 1820 1839 1859) 83.0018 Tj -8527.14 TJm (5225 5259 5268 5280) 83.0018 Tj 17.4613 -275.3071 Td (1860 1871 1874 1883) 83.0018 Tj -8527.14 TJm (5291 6431 6443 6497) 83.0018 Tj 17.4613 -284.8004 Td (1917 1918 1931 1932) 83.0018 Tj -8527.14 TJm (6512 6532) 39.3166 Tj 17.4613 -294.2938 Td (1967 1969 1980 1987) 83.0018 Tj -6520.6 TJm (ROOTDEV 0159) 52.4222 Tj 17.4613 -303.7871 Td (1991 2023 2058 2076) 83.0018 Tj -8527.14 TJm (0159 4359) 39.3166 Tj 17.4613 -313.2805 Td (2085 2090) 39.3166 Tj -11537.3 TJm (run 2214) 34.9481 Tj 0 -322.7739 Td (proghdr 0824) 52.4222 Tj -14045.3 TJm (2111 2214 2215 2218) 83.0018 Tj 17.4613 -332.2668 Td (0824 1119 1132 5016) 83.0018 Tj -8527.14 TJm (2257 2266 2267 2269) 83.0018 Tj 0 -341.7602 Td (pushcli 1455) 52.4222 Tj -14045.3 TJm (2307) 17.4741 Tj 17.4613 -351.2536 Td (0316 1377 1455 1676) 83.0018 Tj -6520.6 TJm (runcmd 6906) 48.0537 Tj 17.4613 -360.7469 Td (1793) 17.4741 Tj -16052.1 TJm (6906 6920 6937 6943) 83.0018 Tj 0 -370.2403 Td (readi 4102) 43.6851 Tj -15048.7 TJm (6945 6959 6966 6977) 83.0018 Tj 17.4613 -379.7336 Td (0247 4102 4266 4512) 83.0018 Tj -8527.14 TJm (7025) 17.4741 Tj 17.4613 -389.227 Td (4708 4709 5027 5032) 83.0018 Tj -6520.6 TJm (RUNNING 1526) 52.4222 Tj 17.4613 -398.7204 Td (5059 5065) 39.3166 Tj -13543.8 TJm (1526 1831 1857 2111) 83.0018 Tj 0 -408.2137 Td (readsb 3679) 48.0537 Tj -14547 TJm (2591) 17.4741 Tj 17.4613 -417.7071 Td (3679 3711 3738 3959) 83.0018 Tj -6520.6 TJm (safestrcpy 5375) 65.5277 Tj 0 -427.2004 Td (readsect 1160) 56.7907 Tj -13543.7 TJm (0323 1781 5097 5375) 83.0018 Tj 17.4613 -436.6938 Td (1160 1195) 39.3166 Tj -11537.3 TJm (sched 1853) 43.6851 Tj 0 -446.1872 Td (readseg 1179) 52.4222 Tj -14045.3 TJm (1853 1856 1858 1860) 83.0018 Tj 17.4613 -455.6805 Td (1113 1125 1135 1179) 83.0018 Tj -8527.14 TJm (1862 1873 1925 2040) 83.0018 Tj 0 -465.1739 Td (read_ebp 0392) 56.7907 Tj -11537.1 TJm (scheduler 1808) 61.1592 Tj 17.4613 -474.6668 Td (0392 5762) 39.3166 Tj -13543.8 TJm (0299 1263 1808) 61.1592 Tj 0 -484.1602 Td (read_eflags 0435) 69.8962 Tj -10032.1 TJm (SCROLLLOCK 6064) 65.5277 Tj 17.4613 -493.6536 Td (0435 1459 1468 1855) 83.0018 Tj -8527.14 TJm (6064 6097) 39.3166 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 10) 192.2146 Tj 0 -28.4801 Td (SECTSIZE 1111) 56.7907 Tj -13543.7 TJm (5156 5165 6258 6270) 83.0018 Tj 17.4613 -37.9735 Td (1111 1125 1173 1186) 83.0018 Tj -8527.14 TJm (6452) 17.4741 Tj 17.4613 -47.4664 Td (1189 1194) 39.3166 Tj -11537.3 TJm (start 0912 1026 6707) 87.3703 Tj 0 -56.9598 Td (SEG 0654) 34.9481 Tj -16052 TJm (0911 0912 0974 1025) 83.0018 Tj 17.4613 -66.4531 Td (0654 1685 1686 1690) 83.0018 Tj -8527.14 TJm (1026 1073 1074 2229) 83.0018 Tj 17.4613 -75.9461 Td (1691) 17.4741 Tj -16052.1 TJm (2232 2233 2236 6706) 83.0018 Tj 0 -85.4395 Td (SEG16 0659) 43.6851 Tj -15048.7 TJm (6707) 17.4741 Tj 17.4613 -94.9328 Td (0659 1687) 39.3166 Tj -11537.3 TJm (stat 3050) 39.3166 Tj 0 -104.4262 Td (segdesc 0627) 52.4222 Tj -14045.3 TJm (0207 0230 0248 3050) 83.0018 Tj 17.4613 -113.9196 Td (0400 0403 0627 0651) 83.0018 Tj -8527.14 TJm (3665 4082 4478 4553) 83.0018 Tj 17.4613 -123.4125 Td (0654 0659 1562) 61.1592 Tj -11035.5 TJm (4654 6753) 39.3166 Tj 0 -132.9059 Td (SEG_ASM 0558) 52.4222 Tj -12038.8 TJm (stati 4082) 43.6851 Tj 17.4613 -142.3992 Td (0558 0985 0986 1081) 83.0018 Tj -8527.14 TJm (0248 4082 4482) 61.1592 Tj 17.4613 -151.8922 Td (1082) 17.4741 Tj -14045.6 TJm (STA_R 0567 0671) 65.5277 Tj 0 -161.3856 Td (SEG_KCODE 1501) 61.1592 Tj -13042 TJm (0567 0671 0985 1081) 83.0018 Tj 17.4613 -170.8789 Td (1501 1685 2521 2522) 83.0018 Tj -8527.14 TJm (1685 1690) 39.3166 Tj 0 -180.3723 Td (SEG_KDATA 1502) 61.1592 Tj -11035.5 TJm (STA_W 0566 0670) 65.5277 Tj 17.4613 -189.8653 Td (1502 1678 1686) 61.1592 Tj -11035.5 TJm (0566 0670 0986 1082) 83.0018 Tj 0 -199.3586 Td (SEG_NULL 0651) 56.7907 Tj -13543.7 TJm (1686 1691) 39.3166 Tj 17.4613 -208.852 Td (0651 1684 1693 1694) 83.0018 Tj -6520.6 TJm (STA_X 0563 0667) 65.5277 Tj 0 -218.3453 Td (SEG_NULLASM 0554) 69.8962 Tj -12038.7 TJm (0563 0667 0985 1081) 83.0018 Tj 17.4613 -227.8387 Td (0554 0984 1080) 61.1592 Tj -11035.5 TJm (1685 1690) 39.3166 Tj 0 -237.3321 Td (SEG_TSS 1505) 52.4222 Tj -12038.8 TJm (sti 0470) 34.9481 Tj 17.4613 -246.8254 Td (1505 1687 1688 1701) 83.0018 Tj -8527.14 TJm (0470 0472 1473 1817) 83.0018 Tj 0 -256.3188 Td (SEG_UCODE 1503) 61.1592 Tj -11035.5 TJm (strlen 5389) 48.0537 Tj 17.4613 -265.8121 Td (1503 1690 1693 1767) 83.0018 Tj -8527.14 TJm (0324 5044 5078 5389) 83.0018 Tj 0 -275.3055 Td (SEG_UDATA 1504) 61.1592 Tj -13042 TJm (7019 7223) 39.3166 Tj 17.4613 -284.7989 Td (1504 1691 1694 1768) 83.0018 Tj -6520.6 TJm (strncmp 5351) 52.4222 Tj 0 -294.2922 Td (SETGATE 0771) 52.4222 Tj -14045.3 TJm (0325 4205 5351) 61.1592 Tj 17.4613 -303.7856 Td (0771 2521 2522) 61.1592 Tj -9028.94 TJm (strncpy 5361) 52.4222 Tj 0 -313.2789 Td (setupsegs 1672) 61.1592 Tj -13042 TJm (0326 4272 5361) 61.1592 Tj 17.4613 -322.7723 Td (0300 1259 1665 1672) 83.0018 Tj -6520.6 TJm (STS_IG32 0685) 56.7907 Tj 17.4613 -332.2653 Td (1830 1837 5106) 61.1592 Tj -11035.5 TJm (0685 0777) 39.3166 Tj 0 -341.7586 Td (SHIFT 6058) 43.6851 Tj -13042.1 TJm (STS_T32A 0682) 56.7907 Tj 17.4613 -351.252 Td (6058 6086 6087 6235) 83.0018 Tj -8527.14 TJm (0682 1687) 39.3166 Tj 0 -360.7454 Td (skipelem 4314) 56.7907 Tj -11537.1 TJm (STS_TG32 0686) 56.7907 Tj 17.4613 -370.2387 Td (4314 4363) 39.3166 Tj -13543.8 TJm (0686 0777) 39.3166 Tj 0 -379.7321 Td (sleep 1903) 43.6851 Tj -13042.1 TJm (STUB 6803 6810 6811 6812 6813 6814) 148.5295 Tj 17.4613 -389.2254 Td (0301 1903 1906 1909) 83.0018 Tj -8527.14 TJm (6810 6811 6812 6813) 83.0018 Tj 17.4613 -398.7184 Td (2090 2109 2877 3480) 83.0018 Tj -8527.14 TJm (6814 6815 6816 6817) 83.0018 Tj 17.4613 -408.2114 Td (3577 3862 5263 5283) 83.0018 Tj -8527.14 TJm (6818 6819 6820 6821) 83.0018 Tj 17.4613 -417.7043 Td (6516 6829) 39.3166 Tj -13543.8 TJm (6822 6823 6824 6825) 83.0018 Tj 0 -427.1977 Td (spinlock 1301) 56.7907 Tj -13543.7 TJm (6826 6827 6828 6829) 83.0018 Tj 17.4613 -436.6911 Td (0206 0301 0311 0313) 83.0018 Tj -6520.6 TJm (sum 5525) 34.9481 Tj 17.4613 -446.184 Td (0314 0315 0343 1301) 83.0018 Tj -8527.14 TJm (5525 5527 5529 5531) 83.0018 Tj 17.4613 -455.677 Td (1358 1363 1375 1402) 83.0018 Tj -8527.14 TJm (5532 5543 5592) 61.1592 Tj 17.4613 -465.17 Td (1440 1606 1608 1903) 83.0018 Tj -6520.6 TJm (superblock 3160) 65.5277 Tj 17.4613 -474.663 Td (2210 2212 2507 2512) 83.0018 Tj -8527.14 TJm (3160 3679 3708 3733) 83.0018 Tj 17.4613 -484.1559 Td (3309 3324 3526 3530) 83.0018 Tj -8527.14 TJm (3957) 17.4741 Tj 17.4613 -493.6489 Td (3668 3784 4404 4408) 83.0018 Tj -6520.6 TJm (SVR 5664) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 7 7 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 11) 192.2146 Tj 17.4613 -28.4801 Td (5664 5707) 39.3166 Tj -11537.3 TJm (ticks 2513) 43.6851 Tj 0 -37.9735 Td (swtch 2156) 43.6851 Tj -15048.7 TJm (0341 2513 2550 2551) 83.0018 Tj 17.4613 -47.4664 Td (0308 1832 1864 2155) 83.0018 Tj -8527.14 TJm (2871 2872 2877) 61.1592 Tj 17.4613 -56.9598 Td (2156) 17.4741 Tj -14045.6 TJm (tickslock 2512) 61.1592 Tj 0 -66.4531 Td (syscall 2774) 52.4222 Tj -14045.3 TJm (0343 2512 2524 2549) 83.0018 Tj 17.4613 -75.9465 Td (0334 2540 2656 2774) 83.0018 Tj -8527.14 TJm (2552 2870 2874 2877) 83.0018 Tj 0 -85.4399 Td (SYS_chdir 2616) 61.1592 Tj -13042 TJm (2879) 17.4741 Tj 17.4613 -94.9332 Td (2616 2751) 39.3166 Tj -11537.3 TJm (TICR 5683) 39.3166 Tj 0 -104.4266 Td (SYS_close 2607) 61.1592 Tj -13042 TJm (5683 5715) 39.3166 Tj 17.4613 -113.9199 Td (2607 2752) 39.3166 Tj -11537.3 TJm (TIMER 5675) 43.6851 Tj 0 -123.4133 Td (SYS_dup 2617) 52.4222 Tj -14045.3 TJm (5675 5714) 39.3166 Tj 17.4613 -132.9067 Td (2617 2753) 39.3166 Tj -11537.3 TJm (TIMER_16BIT 6621) 69.8962 Tj 0 -142.4 Td (SYS_exec 2609) 56.7907 Tj -13543.7 TJm (6621 6627) 39.3166 Tj 17.4613 -151.8934 Td (2609 2754 6711) 61.1592 Tj -9028.94 TJm (TIMER_DIV 6616) 61.1592 Tj 0 -161.3867 Td (SYS_exit 2602) 56.7907 Tj -13543.7 TJm (6616 6628 6629) 61.1592 Tj 17.4613 -170.8801 Td (2602 2755 6716) 61.1592 Tj -9028.94 TJm (TIMER_FREQ 6615) 65.5277 Tj 0 -180.3735 Td (SYS_fork 2601) 56.7907 Tj -13543.7 TJm (6615 6616) 39.3166 Tj 17.4613 -189.8664 Td (2601 2756) 39.3166 Tj -11537.3 TJm (timer_init 6624) 65.5277 Tj 0 -199.3598 Td (SYS_fstat 2613) 61.1592 Tj -13042 TJm (0337 1234 6624) 61.1592 Tj 17.4613 -208.8532 Td (2613 2757) 39.3166 Tj -11537.3 TJm (TIMER_MODE 6618) 65.5277 Tj 0 -218.3465 Td (SYS_getpid 2618) 65.5277 Tj -12540.3 TJm (6618 6627) 39.3166 Tj 17.4613 -227.8399 Td (2618 2758) 39.3166 Tj -11537.3 TJm (TIMER_RATEGEN 6620) 78.6333 Tj 0 -237.3332 Td (SYS_kill 2608) 56.7907 Tj -13543.7 TJm (6620 6627) 39.3166 Tj 17.4613 -246.8266 Td (2608 2759) 39.3166 Tj -11537.3 TJm (TIMER_SEL0 6619) 65.5277 Tj 0 -256.32 Td (SYS_link 2614) 56.7907 Tj -13543.7 TJm (6619 6627) 39.3166 Tj 17.4613 -265.8133 Td (2614 2760) 39.3166 Tj -11537.3 TJm (TPR 5662) 34.9481 Tj 0 -275.3067 Td (SYS_mkdir 2615) 61.1592 Tj -13042 TJm (5662 5743) 39.3166 Tj 17.4613 -284.8 Td (2615 2761) 39.3166 Tj -11537.3 TJm (trap 2534) 39.3166 Tj 0 -294.2934 Td (SYS_mknod 2611) 61.1592 Tj -13042 TJm (2402 2404 2469 2534) 83.0018 Tj 17.4613 -303.7868 Td (2611 2762) 39.3166 Tj -13543.8 TJm (2573 2575 2578) 61.1592 Tj 0 -313.2801 Td (SYS_open 2610) 56.7907 Tj -11537.1 TJm (trapframe 0477) 61.1592 Tj 17.4613 -322.7735 Td (2610 2763) 39.3166 Tj -13543.8 TJm (0477 1541 1615 1723) 83.0018 Tj 0 -332.2664 Td (SYS_pipe 2604) 56.7907 Tj -13543.7 TJm (2534) 17.4741 Tj 17.4613 -341.7598 Td (2604 2764) 39.3166 Tj -11537.3 TJm (trapret 2474) 52.4222 Tj 0 -351.2532 Td (SYS_read 2606) 56.7907 Tj -13543.7 TJm (2473 2474 2486) 61.1592 Tj 17.4613 -360.7465 Td (2606 2765) 39.3166 Tj -11537.3 TJm (tvinit 2516) 48.0537 Tj 0 -370.2399 Td (SYS_sbrk 2619) 56.7907 Tj -13543.7 TJm (0342 1228 2516) 61.1592 Tj 17.4613 -379.7332 Td (2619 2766) 39.3166 Tj -11537.3 TJm (T_DEV 3184) 43.6851 Tj 0 -389.2266 Td (SYS_sleep 2620) 61.1592 Tj -13042 TJm (3184 4107 4157 4911) 83.0018 Tj 17.4613 -398.72 Td (2620 2767) 39.3166 Tj -11537.3 TJm (T_DIR 3182) 43.6851 Tj 0 -408.2133 Td (SYS_unlink 2612) 65.5277 Tj -12540.3 TJm (3182 4218 4365 4673) 83.0018 Tj 17.4613 -417.7067 Td (2612 2768) 39.3166 Tj -13543.8 TJm (4778 4838 4868 4923) 83.0018 Tj 0 -427.2 Td (SYS_wait 2603) 56.7907 Tj -13543.7 TJm (4938) 17.4741 Tj 17.4613 -436.6934 Td (2603 2769) 39.3166 Tj -11537.3 TJm (T_FILE 3183) 48.0537 Tj 0 -446.1868 Td (SYS_write 2605) 61.1592 Tj -13042 TJm (3183 4862) 39.3166 Tj 17.4613 -455.6801 Td (2605 2770) 39.3166 Tj -11537.3 TJm (T_SYSCALL 2376) 61.1592 Tj 0 -465.1735 Td (taskstate 0701) 61.1592 Tj -13042 TJm (2376 2522 2536 6712) 83.0018 Tj 17.4613 -474.6665 Td (0701 1561) 39.3166 Tj -13543.8 TJm (6717 6807) 39.3166 Tj 0 -484.1598 Td (TDCR 5685) 39.3166 Tj -13543.8 TJm (userinit 1757) 56.7907 Tj 17.4613 -493.6532 Td (5685 5713) 39.3166 Tj -13543.8 TJm (0302 1235 1757) 61.1592 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 cross-references Page 12) 192.2146 Tj 0 -28.4801 Td (VER 5661) 34.9481 Tj -16052 TJm (6491) 17.4741 Tj 17.4613 -37.9735 Td (5661 5723) 39.3166 Tj -11537.3 TJm (wakeup1 1953) 52.4222 Tj 0 -47.4664 Td (wait 2053) 39.3166 Tj -15550.3 TJm (1953 1968 2026 2033) 83.0018 Tj 17.4613 -56.9598 Td (0303 2053 2829 6783) 83.0018 Tj -6520.6 TJm (writei 4152) 48.0537 Tj 17.4613 -66.4531 Td (6812 6944 6970 6971) 83.0018 Tj -8527.14 TJm (0249 4152 4274 4532) 83.0018 Tj 17.4613 -75.9465 Td (7026) 17.4741 Tj -16052.1 TJm (4785 4786) 39.3166 Tj 0 -85.4399 Td (waitdisk 1151) 56.7907 Tj -11537.1 TJm (xchg 0451) 39.3166 Tj 17.4613 -94.9332 Td (1151 1163 1172) 61.1592 Tj -11035.5 TJm (0451 1260 1384 1415) 83.0018 Tj 0 -104.4266 Td (wakeup 1965) 48.0537 Tj -12540.5 TJm (yield 1869) 43.6851 Tj 17.4613 -113.9199 Td (0304 1965 2551 3419) 83.0018 Tj -8527.14 TJm (0305 1869 2592) 61.1592 Tj 17.4613 -123.4133 Td (3639 3891 3916 5220) 83.0018 Tj -6520.6 TJm (_namei 4354) 48.0537 Tj 17.4613 -132.9067 Td (5223 5262 5267 5290) 83.0018 Tj -8527.14 TJm (4354 4392 4398) 61.1592 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 8 8 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/types.h Page 1) 166.0035 Tj 0 -28.4801 Td (0100 typedef unsigned int uint;) 144.161 Tj 0 -37.9735 Td (0101 typedef unsigned short ushort;) 152.898 Tj 0 -47.4668 Td (0102 typedef unsigned char uchar;) 148.5295 Tj 0 -56.9602 Td (0103 ) 21.8426 Tj 0 -66.4535 Td (0104 ) 21.8426 Tj 0 -75.9469 Td (0105 ) 21.8426 Tj 0 -85.4403 Td (0106 ) 21.8426 Tj 0 -94.9336 Td (0107 ) 21.8426 Tj 0 -104.427 Td (0108 ) 21.8426 Tj 0 -113.9203 Td (0109 ) 21.8426 Tj 0 -123.4137 Td (0110 ) 21.8426 Tj 0 -132.9071 Td (0111 ) 21.8426 Tj 0 -142.4004 Td (0112 ) 21.8426 Tj 0 -151.8938 Td (0113 ) 21.8426 Tj 0 -161.3871 Td (0114 ) 21.8426 Tj 0 -170.8805 Td (0115 ) 21.8426 Tj 0 -180.3739 Td (0116 ) 21.8426 Tj 0 -189.8672 Td (0117 ) 21.8426 Tj 0 -199.3606 Td (0118 ) 21.8426 Tj 0 -208.8539 Td (0119 ) 21.8426 Tj 0 -218.3473 Td (0120 ) 21.8426 Tj 0 -227.8407 Td (0121 ) 21.8426 Tj 0 -237.334 Td (0122 ) 21.8426 Tj 0 -246.8274 Td (0123 ) 21.8426 Tj 0 -256.3207 Td (0124 ) 21.8426 Tj 0 -265.8141 Td (0125 ) 21.8426 Tj 0 -275.3075 Td (0126 ) 21.8426 Tj 0 -284.8008 Td (0127 ) 21.8426 Tj 0 -294.2942 Td (0128 ) 21.8426 Tj 0 -303.7875 Td (0129 ) 21.8426 Tj 0 -313.2809 Td (0130 ) 21.8426 Tj 0 -322.7743 Td (0131 ) 21.8426 Tj 0 -332.2676 Td (0132 ) 21.8426 Tj 0 -341.761 Td (0133 ) 21.8426 Tj 0 -351.2543 Td (0134 ) 21.8426 Tj 0 -360.7477 Td (0135 ) 21.8426 Tj 0 -370.2411 Td (0136 ) 21.8426 Tj 0 -379.7344 Td (0137 ) 21.8426 Tj 0 -389.2278 Td (0138 ) 21.8426 Tj 0 -398.7211 Td (0139 ) 21.8426 Tj 0 -408.2145 Td (0140 ) 21.8426 Tj 0 -417.7079 Td (0141 ) 21.8426 Tj 0 -427.2012 Td (0142 ) 21.8426 Tj 0 -436.6946 Td (0143 ) 21.8426 Tj 0 -446.1879 Td (0144 ) 21.8426 Tj 0 -455.6813 Td (0145 ) 21.8426 Tj 0 -465.1747 Td (0146 ) 21.8426 Tj 0 -474.668 Td (0147 ) 21.8426 Tj 0 -484.1614 Td (0148 ) 21.8426 Tj 0 -493.6547 Td (0149 ) 21.8426 Tj 0 -522.1348 Td (Sheet 01) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/param.h Page 1) 166.0035 Tj 0 -28.4801 Td (0150 #define NPROC 64 // maximum number of processes) 262.1109 Tj 0 -37.9735 Td (0151 #define PAGE 4096 // granularity of user-space memo\ ry allocation) 332.0071 Tj 0 -47.4668 Td (0152 #define KSTACKSIZE PAGE // size of per-process kernel sta\ ck) 283.9534 Tj 0 -56.9602 Td (0153 #define NCPU 8 // maximum number of CPUs) 240.2683 Tj 0 -66.4535 Td (0154 #define NOFILE 16 // open files per process) 240.2683 Tj 0 -75.9469 Td (0155 #define NFILE 100 // open files per system) 235.8998 Tj 0 -85.4403 Td (0156 #define NBUF 10 // size of disk block cache) 249.0053 Tj 0 -94.9336 Td (0157 #define NINODE 50 // maximum number of active i-nod\ es) 283.9534 Tj 0 -104.427 Td (0158 #define NDEV 10 // maximum major device number) 262.1109 Tj 0 -113.9203 Td (0159 #define ROOTDEV 1 // device number of file system r\ oot disk) 310.1645 Tj 0 -123.4137 Td (0160 ) 21.8426 Tj 0 -132.9071 Td (0161 ) 21.8426 Tj 0 -142.4004 Td (0162 ) 21.8426 Tj 0 -151.8938 Td (0163 ) 21.8426 Tj 0 -161.3871 Td (0164 ) 21.8426 Tj 0 -170.8805 Td (0165 ) 21.8426 Tj 0 -180.3739 Td (0166 ) 21.8426 Tj 0 -189.8672 Td (0167 ) 21.8426 Tj 0 -199.3606 Td (0168 ) 21.8426 Tj 0 -208.8539 Td (0169 ) 21.8426 Tj 0 -218.3473 Td (0170 ) 21.8426 Tj 0 -227.8407 Td (0171 ) 21.8426 Tj 0 -237.334 Td (0172 ) 21.8426 Tj 0 -246.8274 Td (0173 ) 21.8426 Tj 0 -256.3207 Td (0174 ) 21.8426 Tj 0 -265.8141 Td (0175 ) 21.8426 Tj 0 -275.3075 Td (0176 ) 21.8426 Tj 0 -284.8008 Td (0177 ) 21.8426 Tj 0 -294.2942 Td (0178 ) 21.8426 Tj 0 -303.7875 Td (0179 ) 21.8426 Tj 0 -313.2809 Td (0180 ) 21.8426 Tj 0 -322.7743 Td (0181 ) 21.8426 Tj 0 -332.2676 Td (0182 ) 21.8426 Tj 0 -341.761 Td (0183 ) 21.8426 Tj 0 -351.2543 Td (0184 ) 21.8426 Tj 0 -360.7477 Td (0185 ) 21.8426 Tj 0 -370.2411 Td (0186 ) 21.8426 Tj 0 -379.7344 Td (0187 ) 21.8426 Tj 0 -389.2278 Td (0188 ) 21.8426 Tj 0 -398.7211 Td (0189 ) 21.8426 Tj 0 -408.2145 Td (0190 ) 21.8426 Tj 0 -417.7079 Td (0191 ) 21.8426 Tj 0 -427.2012 Td (0192 ) 21.8426 Tj 0 -436.6946 Td (0193 ) 21.8426 Tj 0 -446.1879 Td (0194 ) 21.8426 Tj 0 -455.6813 Td (0195 ) 21.8426 Tj 0 -465.1747 Td (0196 ) 21.8426 Tj 0 -474.668 Td (0197 ) 21.8426 Tj 0 -484.1614 Td (0198 ) 21.8426 Tj 0 -493.6547 Td (0199 ) 21.8426 Tj 0 -522.1348 Td (Sheet 01) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 9 9 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/defs.h Page 1) 161.635 Tj 0 -28.4801 Td (0200 struct buf;) 69.8962 Tj 0 -37.9735 Td (0201 struct context;) 87.3703 Tj 0 -47.4668 Td (0202 struct file;) 74.2647 Tj 0 -56.9602 Td (0203 struct inode;) 78.6333 Tj 0 -66.4535 Td (0204 struct pipe;) 74.2647 Tj 0 -75.9469 Td (0205 struct proc;) 74.2647 Tj 0 -85.4403 Td (0206 struct spinlock;) 91.7388 Tj 0 -94.9336 Td (0207 struct stat;) 74.2647 Tj 0 -104.427 Td (0208 ) 21.8426 Tj 0 -113.9203 Td (0209 // bio.c) 56.7907 Tj 0 -123.4137 Td (0210 void binit\(void\);) 144.161 Tj 0 -132.9071 Td (0211 struct buf* bread\(uint, uint\);) 170.3721 Tj 0 -142.4004 Td (0212 void brelse\(struct buf*\);) 179.1091 Tj 0 -151.8938 Td (0213 void bwrite\(struct buf*\);) 179.1091 Tj 0 -161.3871 Td (0214 ) 21.8426 Tj 0 -170.8805 Td (0215 // console.c) 74.2647 Tj 0 -180.3739 Td (0216 void console_init\(void\);) 174.7406 Tj 0 -189.8672 Td (0217 void cprintf\(char*, ...\);) 179.1091 Tj 0 -199.3606 Td (0218 void console_intr\(int\(*\)\(void\)\);) 209.6887 Tj 0 -208.8539 Td (0219 void panic\(char*\) __attribute__\(\(noreturn\)\ \);) 262.1109 Tj 0 -218.3473 Td (0220 ) 21.8426 Tj 0 -227.8407 Td (0221 // exec.c) 61.1592 Tj 0 -237.334 Td (0222 int exec\(char*, char**\);) 179.1091 Tj 0 -246.8274 Td (0223 ) 21.8426 Tj 0 -256.3207 Td (0224 // file.c) 61.1592 Tj 0 -265.8141 Td (0225 struct file* filealloc\(void\);) 161.635 Tj 0 -275.3075 Td (0226 void fileclose\(struct file*\);) 196.5831 Tj 0 -284.8008 Td (0227 struct file* filedup\(struct file*\);) 187.8461 Tj 0 -294.2942 Td (0228 void fileinit\(void\);) 157.2665 Tj 0 -303.7875 Td (0229 int fileread\(struct file*, char*, int n\);) 253.3738 Tj 0 -313.2809 Td (0230 int filestat\(struct file*, struct stat*\);) 253.3738 Tj 0 -322.7743 Td (0231 int filewrite\(struct file*, char*, int n\);) 257.7424 Tj 0 -332.2676 Td (0232 ) 21.8426 Tj 0 -341.761 Td (0233 // fs.c) 52.4222 Tj 0 -351.2543 Td (0234 int dirlink\(struct inode*, char*, uint\);) 249.0053 Tj 0 -360.7477 Td (0235 struct inode* dirlookup\(struct inode*, char*, uint*\);) 262.1109 Tj 0 -370.2411 Td (0236 struct inode* ialloc\(uint, short\);) 179.1091 Tj 0 -379.7344 Td (0237 struct inode* idup\(struct inode*\);) 179.1091 Tj 0 -389.2278 Td (0238 void iinit\(void\);) 144.161 Tj 0 -398.7211 Td (0239 void ilock\(struct inode*\);) 183.4776 Tj 0 -408.2145 Td (0240 void iput\(struct inode*\);) 179.1091 Tj 0 -417.7079 Td (0241 void iunlock\(struct inode*\);) 192.2146 Tj 0 -427.2012 Td (0242 void iunlockput\(struct inode*\);) 205.3202 Tj 0 -436.6946 Td (0243 void iupdate\(struct inode*\);) 192.2146 Tj 0 -446.1879 Td (0244 int namecmp\(const char*, const char*\);) 240.2683 Tj 0 -455.6813 Td (0245 struct inode* namei\(char*\);) 148.5295 Tj 0 -465.1747 Td (0246 struct inode* nameiparent\(char*, char*\);) 205.3202 Tj 0 -474.668 Td (0247 int readi\(struct inode*, char*, uint, uint\);) 266.4794 Tj 0 -484.1614 Td (0248 void stati\(struct inode*, struct stat*\);) 244.6368 Tj 0 -493.6547 Td (0249 int writei\(struct inode*, char*, uint, uint\)\ ;) 270.8479 Tj 0 -522.1348 Td (Sheet 02) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/defs.h Page 2) 161.635 Tj 0 -28.4801 Td (0250 // ide.c) 56.7907 Tj 0 -37.9735 Td (0251 void ide_init\(void\);) 157.2665 Tj 0 -47.4668 Td (0252 void ide_intr\(void\);) 157.2665 Tj 0 -56.9602 Td (0253 void ide_rw\(struct buf *\);) 183.4776 Tj 0 -66.4535 Td (0254 ) 21.8426 Tj 0 -75.9469 Td (0255 // ioapic.c) 69.8962 Tj 0 -85.4403 Td (0256 void ioapic_enable\(int irq, int cpu\);) 231.5313 Tj 0 -94.9336 Td (0257 extern uchar ioapic_id;) 135.4239 Tj 0 -104.427 Td (0258 void ioapic_init\(void\);) 170.3721 Tj 0 -113.9203 Td (0259 ) 21.8426 Tj 0 -123.4137 Td (0260 // kalloc.c) 69.8962 Tj 0 -132.9071 Td (0261 char* kalloc\(int\);) 144.161 Tj 0 -142.4004 Td (0262 void kfree\(char*, int\);) 170.3721 Tj 0 -151.8938 Td (0263 void kinit\(void\);) 144.161 Tj 0 -161.3871 Td (0264 ) 21.8426 Tj 0 -170.8805 Td (0265 // kbd.c) 56.7907 Tj 0 -180.3739 Td (0266 void kbd_intr\(void\);) 157.2665 Tj 0 -189.8672 Td (0267 ) 21.8426 Tj 0 -199.3606 Td (0268 // lapic.c) 65.5277 Tj 0 -208.8539 Td (0269 int cpu\(void\);) 135.4239 Tj 0 -218.3473 Td (0270 extern volatile uint* lapic;) 157.2665 Tj 0 -227.8407 Td (0271 void lapic_eoi\(void\);) 161.635 Tj 0 -237.334 Td (0272 void lapic_init\(int\);) 161.635 Tj 0 -246.8274 Td (0273 void lapic_startap\(uchar, uint\);) 209.6887 Tj 0 -256.3207 Td (0274 ) 21.8426 Tj 0 -265.8141 Td (0275 // mp.c) 52.4222 Tj 0 -275.3075 Td (0276 extern int ismp;) 113.5814 Tj 0 -284.8008 Td (0277 int mp_bcpu\(void\);) 152.898 Tj 0 -294.2942 Td (0278 void mp_init\(void\);) 152.898 Tj 0 -303.7875 Td (0279 void mp_startthem\(void\);) 174.7406 Tj 0 -313.2809 Td (0280 ) 21.8426 Tj 0 -322.7743 Td (0281 // picirq.c) 69.8962 Tj 0 -332.2676 Td (0282 void pic_enable\(int\);) 161.635 Tj 0 -341.761 Td (0283 void pic_init\(void\);) 157.2665 Tj 0 -351.2543 Td (0284 ) 21.8426 Tj 0 -360.7477 Td (0285 // pipe.c) 61.1592 Tj 0 -370.2411 Td (0286 int pipealloc\(struct file**, struct file**\);) 266.4794 Tj 0 -379.7344 Td (0287 void pipeclose\(struct pipe*, int\);) 218.4257 Tj 0 -389.2278 Td (0288 int piperead\(struct pipe*, char*, int\);) 244.6368 Tj 0 -398.7211 Td (0289 int pipewrite\(struct pipe*, char*, int\);) 249.0053 Tj 0 -408.2145 Td (0290 ) 21.8426 Tj 0 -417.7079 Td (0291 // proc.c) 61.1592 Tj 0 -427.2012 Td (0292 struct proc* copyproc\(struct proc*\);) 192.2146 Tj 0 -436.6946 Td (0293 struct proc* curproc\(void\);) 152.898 Tj 0 -446.1879 Td (0294 void exit\(void\);) 139.7925 Tj 0 -455.6813 Td (0295 int growproc\(int\);) 152.898 Tj 0 -465.1747 Td (0296 int kill\(int\);) 135.4239 Tj 0 -474.668 Td (0297 void pinit\(void\);) 144.161 Tj 0 -484.1614 Td (0298 void procdump\(void\);) 157.2665 Tj 0 -493.6547 Td (0299 void scheduler\(void\) __attribute__\(\(noretur\ n\)\);) 275.2164 Tj 0 -522.1348 Td (Sheet 02) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 10 10 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/defs.h Page 3) 161.635 Tj 0 -28.4801 Td (0300 void setupsegs\(struct proc*\);) 196.5831 Tj 0 -37.9735 Td (0301 void sleep\(void*, struct spinlock*\);) 227.1628 Tj 0 -47.4668 Td (0302 void userinit\(void\);) 157.2665 Tj 0 -56.9602 Td (0303 int wait\(void\);) 139.7925 Tj 0 -66.4535 Td (0304 void wakeup\(void*\);) 152.898 Tj 0 -75.9469 Td (0305 void yield\(void\);) 144.161 Tj 0 -85.4403 Td (0306 ) 21.8426 Tj 0 -94.9336 Td (0307 // swtch.S) 65.5277 Tj 0 -104.427 Td (0308 void swtch\(struct context*, struct context*\);) 266.4794 Tj 0 -113.9203 Td (0309 ) 21.8426 Tj 0 -123.4137 Td (0310 // spinlock.c) 78.6333 Tj 0 -132.9071 Td (0311 void acquire\(struct spinlock*\);) 205.3202 Tj 0 -142.4004 Td (0312 void getcallerpcs\(void*, uint*\);) 209.6887 Tj 0 -151.8938 Td (0313 int holding\(struct spinlock*\);) 205.3202 Tj 0 -161.3871 Td (0314 void initlock\(struct spinlock*, char*\);) 240.2683 Tj 0 -170.8805 Td (0315 void release\(struct spinlock*\);) 205.3202 Tj 0 -180.3739 Td (0316 void pushcli\(\);) 135.4239 Tj 0 -189.8672 Td (0317 void popcli\(\);) 131.0554 Tj 0 -199.3606 Td (0318 ) 21.8426 Tj 0 -208.8539 Td (0319 // string.c) 69.8962 Tj 0 -218.3473 Td (0320 int memcmp\(const void*, const void*, uint\);) 262.1109 Tj 0 -227.8407 Td (0321 void* memmove\(void*, const void*, uint\);) 240.2683 Tj 0 -237.334 Td (0322 void* memset\(void*, int, uint\);) 200.9517 Tj 0 -246.8274 Td (0323 char* safestrcpy\(char*, const char*, int\);) 249.0053 Tj 0 -256.3207 Td (0324 int strlen\(const char*\);) 179.1091 Tj 0 -265.8141 Td (0325 int strncmp\(const char*, const char*, uint\);) 266.4794 Tj 0 -275.3075 Td (0326 char* strncpy\(char*, const char*, int\);) 235.8998 Tj 0 -284.8008 Td (0327 ) 21.8426 Tj 0 -294.2942 Td (0328 // syscall.c) 74.2647 Tj 0 -303.7875 Td (0329 int argint\(int, int*\);) 170.3721 Tj 0 -313.2809 Td (0330 int argptr\(int, char**, int\);) 200.9517 Tj 0 -322.7743 Td (0331 int argstr\(int, char**\);) 179.1091 Tj 0 -332.2676 Td (0332 int fetchint\(struct proc*, uint, int*\);) 244.6368 Tj 0 -341.761 Td (0333 int fetchstr\(struct proc*, uint, char**\);) 253.3738 Tj 0 -351.2543 Td (0334 void syscall\(void\);) 152.898 Tj 0 -360.7477 Td (0335 ) 21.8426 Tj 0 -370.2411 Td (0336 // timer.c) 65.5277 Tj 0 -379.7344 Td (0337 void timer_init\(void\);) 166.0035 Tj 0 -389.2278 Td (0338 ) 21.8426 Tj 0 -398.7211 Td (0339 // trap.c) 61.1592 Tj 0 -408.2145 Td (0340 void idtinit\(void\);) 152.898 Tj 0 -417.7079 Td (0341 extern int ticks;) 117.9499 Tj 0 -427.2012 Td (0342 void tvinit\(void\);) 148.5295 Tj 0 -436.6946 Td (0343 extern struct spinlock tickslock;) 166.0035 Tj 0 -446.1879 Td (0344 ) 21.8426 Tj 0 -455.6813 Td (0345 // number of elements in fixed-size array) 200.9517 Tj 0 -465.1747 Td (0346 #define NELEM\(x\) \(sizeof\(x\)/sizeof\(\(x\)[0]\)\)) 209.6887 Tj 0 -474.668 Td (0347 ) 21.8426 Tj 0 -484.1614 Td (0348 ) 21.8426 Tj 0 -493.6547 Td (0349 ) 21.8426 Tj 0 -522.1348 Td (Sheet 03) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/x86.h Page 1) 157.2665 Tj 0 -28.4801 Td (0350 // Routines to let C code use special x86 instructions.) 262.1109 Tj 0 -37.9735 Td (0351 ) 21.8426 Tj 0 -47.4668 Td (0352 static inline uchar) 104.8443 Tj 0 -56.9602 Td (0353 inb\(ushort port\)) 91.7388 Tj 0 -66.4535 Td (0354 {) 26.2111 Tj 0 -75.9469 Td (0355 uchar data;) 78.6333 Tj 0 -85.4403 Td (0356 ) 21.8426 Tj 0 -94.9336 Td (0357 asm volatile\("in %1,%0" : "=a" \(data\) : "d" \(port\)\)\ ;) 257.7424 Tj 0 -104.427 Td (0358 return data;) 83.0018 Tj 0 -113.9203 Td (0359 }) 26.2111 Tj 0 -123.4137 Td (0360 ) 21.8426 Tj 0 -132.9071 Td (0361 static inline void) 100.4758 Tj 0 -142.4004 Td (0362 insl\(int port, void *addr, int cnt\)) 174.7406 Tj 0 -151.8938 Td (0363 {) 26.2111 Tj 0 -161.3871 Td (0364 asm volatile\("cld\\n\\trepne\\n\\tinsl" :) 209.6887 Tj 0 -170.8805 Td (0365 "=D" \(addr\), "=c" \(cnt\) :) 227.1628 Tj 0 -180.3739 Td (0366 "d" \(port\), "0" \(addr\), "1" \(cnt\)\ :) 262.1109 Tj 0 -189.8672 Td (0367 "memory", "cc"\);) 174.7406 Tj 0 -199.3606 Td (0368 }) 26.2111 Tj 0 -208.8539 Td (0369 ) 21.8426 Tj 0 -218.3473 Td (0370 static inline void) 100.4758 Tj 0 -227.8407 Td (0371 outb\(ushort port, uchar data\)) 148.5295 Tj 0 -237.334 Td (0372 {) 26.2111 Tj 0 -246.8274 Td (0373 asm volatile\("out %0,%1" : : "a" \(data\), "d" \(port\)\ \);) 262.1109 Tj 0 -256.3207 Td (0374 }) 26.2111 Tj 0 -265.8141 Td (0375 ) 21.8426 Tj 0 -275.3075 Td (0376 static inline void) 100.4758 Tj 0 -284.8008 Td (0377 outw\(ushort port, ushort data\)) 152.898 Tj 0 -294.2942 Td (0378 {) 26.2111 Tj 0 -303.7875 Td (0379 asm volatile\("out %0,%1" : : "a" \(data\), "d" \(port\)\ \);) 262.1109 Tj 0 -313.2809 Td (0380 }) 26.2111 Tj 0 -322.7743 Td (0381 ) 21.8426 Tj 0 -332.2676 Td (0382 static inline void) 100.4758 Tj 0 -341.761 Td (0383 outsl\(int port, const void *addr, int cnt\)) 205.3202 Tj 0 -351.2543 Td (0384 {) 26.2111 Tj 0 -360.7477 Td (0385 asm volatile\("cld\\n\\trepne\\n\\toutsl" :) 209.6887 Tj 0 -370.2411 Td (0386 "=S" \(addr\), "=c" \(cnt\) :) 227.1628 Tj 0 -379.7344 Td (0387 "d" \(port\), "0" \(addr\), "1" \(cnt\)\ :) 262.1109 Tj 0 -389.2278 Td (0388 "cc"\);) 131.0554 Tj 0 -398.7211 Td (0389 }) 26.2111 Tj 0 -408.2145 Td (0390 ) 21.8426 Tj 0 -417.7079 Td (0391 static inline uint) 100.4758 Tj 0 -427.2012 Td (0392 read_ebp\(void\)) 83.0018 Tj 0 -436.6946 Td (0393 {) 26.2111 Tj 0 -446.1879 Td (0394 uint ebp;) 69.8962 Tj 0 -455.6813 Td (0395 ) 21.8426 Tj 0 -465.1747 Td (0396 asm volatile\("movl %%ebp, %0" : "=a" \(ebp\)\);) 222.7942 Tj 0 -474.668 Td (0397 return ebp;) 78.6333 Tj 0 -484.1614 Td (0398 }) 26.2111 Tj 0 -493.6547 Td (0399 ) 21.8426 Tj 0 -522.1348 Td (Sheet 03) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 11 11 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/x86.h Page 2) 157.2665 Tj 0 -28.4801 Td (0400 struct segdesc;) 87.3703 Tj 0 -37.9735 Td (0401 ) 21.8426 Tj 0 -47.4668 Td (0402 static inline void) 100.4758 Tj 0 -56.9602 Td (0403 lgdt\(struct segdesc *p, int size\)) 166.0035 Tj 0 -66.4535 Td (0404 {) 26.2111 Tj 0 -75.9469 Td (0405 volatile ushort pd[3];) 126.6869 Tj 0 -85.4403 Td (0406 ) 21.8426 Tj 0 -94.9336 Td (0407 pd[0] = size-1;) 96.1073 Tj 0 -104.427 Td (0408 pd[1] = \(uint\)p;) 100.4758 Tj 0 -113.9203 Td (0409 pd[2] = \(uint\)p >> 16;) 126.6869 Tj 0 -123.4137 Td (0410 ) 21.8426 Tj 0 -132.9071 Td (0411 asm volatile\("lgdt \(%0\)" : : "r" \(pd\)\);) 200.9517 Tj 0 -142.4004 Td (0412 }) 26.2111 Tj 0 -151.8938 Td (0413 ) 21.8426 Tj 0 -161.3871 Td (0414 struct gatedesc;) 91.7388 Tj 0 -170.8805 Td (0415 ) 21.8426 Tj 0 -180.3739 Td (0416 static inline void) 100.4758 Tj 0 -189.8672 Td (0417 lidt\(struct gatedesc *p, int size\)) 170.3721 Tj 0 -199.3606 Td (0418 {) 26.2111 Tj 0 -208.8539 Td (0419 volatile ushort pd[3];) 126.6869 Tj 0 -218.3473 Td (0420 ) 21.8426 Tj 0 -227.8407 Td (0421 pd[0] = size-1;) 96.1073 Tj 0 -237.334 Td (0422 pd[1] = \(uint\)p;) 100.4758 Tj 0 -246.8274 Td (0423 pd[2] = \(uint\)p >> 16;) 126.6869 Tj 0 -256.3207 Td (0424 ) 21.8426 Tj 0 -265.8141 Td (0425 asm volatile\("lidt \(%0\)" : : "r" \(pd\)\);) 200.9517 Tj 0 -275.3075 Td (0426 }) 26.2111 Tj 0 -284.8008 Td (0427 ) 21.8426 Tj 0 -294.2942 Td (0428 static inline void) 100.4758 Tj 0 -303.7875 Td (0429 ltr\(ushort sel\)) 87.3703 Tj 0 -313.2809 Td (0430 {) 26.2111 Tj 0 -322.7743 Td (0431 asm volatile\("ltr %0" : : "r" \(sel\)\);) 192.2146 Tj 0 -332.2676 Td (0432 }) 26.2111 Tj 0 -341.761 Td (0433 ) 21.8426 Tj 0 -351.2543 Td (0434 static inline uint) 100.4758 Tj 0 -360.7477 Td (0435 read_eflags\(void\)) 96.1073 Tj 0 -370.2411 Td (0436 {) 26.2111 Tj 0 -379.7344 Td (0437 uint eflags;) 83.0018 Tj 0 -389.2278 Td (0438 asm volatile\("pushfl; popl %0" : "=r" \(eflags\)\);) 240.2683 Tj 0 -398.7211 Td (0439 return eflags;) 91.7388 Tj 0 -408.2145 Td (0440 }) 26.2111 Tj 0 -417.7079 Td (0441 ) 21.8426 Tj 0 -427.2012 Td (0442 static inline void) 100.4758 Tj 0 -436.6946 Td (0443 write_eflags\(uint eflags\)) 131.0554 Tj 0 -446.1879 Td (0444 {) 26.2111 Tj 0 -455.6813 Td (0445 asm volatile\("pushl %0; popfl" : : "r" \(eflags\)\);) 244.6368 Tj 0 -465.1747 Td (0446 }) 26.2111 Tj 0 -474.668 Td (0447 ) 21.8426 Tj 0 -484.1614 Td (0448 ) 21.8426 Tj 0 -493.6547 Td (0449 ) 21.8426 Tj 0 -522.1348 Td (Sheet 04) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/x86.h Page 3) 157.2665 Tj 0 -28.4801 Td (0450 static inline uint) 100.4758 Tj 0 -37.9735 Td (0451 xchg\(volatile uint *addr, uint newval\)) 187.8461 Tj 0 -47.4668 Td (0452 {) 26.2111 Tj 0 -56.9602 Td (0453 uint result;) 83.0018 Tj 0 -66.4535 Td (0454 ) 21.8426 Tj 0 -75.9469 Td (0455 // The + in "+m" denotes a read-modify-write operand.) 262.1109 Tj 0 -85.4403 Td (0456 asm volatile\("lock; xchgl %0, %1" :) 183.4776 Tj 0 -94.9336 Td (0457 "+m" \(*addr\), "=a" \(result\) :) 214.0572 Tj 0 -104.427 Td (0458 "1" \(newval\) :) 148.5295 Tj 0 -113.9203 Td (0459 "cc"\);) 113.5814 Tj 0 -123.4137 Td (0460 return result;) 91.7388 Tj 0 -132.9071 Td (0461 }) 26.2111 Tj 0 -142.4004 Td (0462 ) 21.8426 Tj 0 -151.8938 Td (0463 static inline void) 100.4758 Tj 0 -161.3871 Td (0464 cli\(void\)) 61.1592 Tj 0 -170.8805 Td (0465 {) 26.2111 Tj 0 -180.3739 Td (0466 asm volatile\("cli"\);) 117.9499 Tj 0 -189.8672 Td (0467 }) 26.2111 Tj 0 -199.3606 Td (0468 ) 21.8426 Tj 0 -208.8539 Td (0469 static inline void) 100.4758 Tj 0 -218.3473 Td (0470 sti\(void\)) 61.1592 Tj 0 -227.8407 Td (0471 {) 26.2111 Tj 0 -237.334 Td (0472 asm volatile\("sti"\);) 117.9499 Tj 0 -246.8274 Td (0473 }) 26.2111 Tj 0 -256.3207 Td (0474 ) 21.8426 Tj 0 -265.8141 Td (0475 // Layout of the trap frame built on the stack by the) 253.3738 Tj 0 -275.3075 Td (0476 // hardware and by trapasm.S, and passed to trap\(\).) 244.6368 Tj 0 -284.8008 Td (0477 struct trapframe {) 100.4758 Tj 0 -294.2942 Td (0478 // registers as pushed by pusha) 166.0035 Tj 0 -303.7875 Td (0479 uint edi;) 69.8962 Tj 0 -313.2809 Td (0480 uint esi;) 69.8962 Tj 0 -322.7743 Td (0481 uint ebp;) 69.8962 Tj 0 -332.2676 Td (0482 uint oesp; // useless & ignored) 187.8461 Tj 0 -341.761 Td (0483 uint ebx;) 69.8962 Tj 0 -351.2543 Td (0484 uint edx;) 69.8962 Tj 0 -360.7477 Td (0485 uint ecx;) 69.8962 Tj 0 -370.2411 Td (0486 uint eax;) 69.8962 Tj 0 -379.7344 Td (0487 ) 21.8426 Tj 0 -389.2278 Td (0488 // rest of trap frame) 122.3184 Tj 0 -398.7211 Td (0489 ushort es;) 74.2647 Tj 0 -408.2145 Td (0490 ushort padding1;) 100.4758 Tj 0 -417.7079 Td (0491 ushort ds;) 74.2647 Tj 0 -427.2012 Td (0492 ushort padding2;) 100.4758 Tj 0 -436.6946 Td (0493 uint trapno;) 83.0018 Tj 0 -446.1879 Td (0494 ) 21.8426 Tj 0 -455.6813 Td (0495 // below here defined by x86 hardware) 192.2146 Tj 0 -465.1747 Td (0496 uint err;) 69.8962 Tj 0 -474.668 Td (0497 uint eip;) 69.8962 Tj 0 -484.1614 Td (0498 ushort cs;) 74.2647 Tj 0 -493.6547 Td (0499 ushort padding3;) 100.4758 Tj 0 -522.1348 Td (Sheet 04) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 12 12 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/x86.h Page 4) 157.2665 Tj 0 -28.4801 Td (0500 uint eflags;) 83.0018 Tj 0 -37.9735 Td (0501 ) 21.8426 Tj 0 -47.4668 Td (0502 // below here only when crossing rings, such as from use\ r to kernel) 323.2701 Tj 0 -56.9602 Td (0503 uint esp;) 69.8962 Tj 0 -66.4535 Td (0504 ushort ss;) 74.2647 Tj 0 -75.9469 Td (0505 ushort padding4;) 100.4758 Tj 0 -85.4403 Td (0506 };) 30.5796 Tj 0 -94.9336 Td (0507 ) 21.8426 Tj 0 -104.427 Td (0508 ) 21.8426 Tj 0 -113.9203 Td (0509 ) 21.8426 Tj 0 -123.4137 Td (0510 ) 21.8426 Tj 0 -132.9071 Td (0511 ) 21.8426 Tj 0 -142.4004 Td (0512 ) 21.8426 Tj 0 -151.8938 Td (0513 ) 21.8426 Tj 0 -161.3871 Td (0514 ) 21.8426 Tj 0 -170.8805 Td (0515 ) 21.8426 Tj 0 -180.3739 Td (0516 ) 21.8426 Tj 0 -189.8672 Td (0517 ) 21.8426 Tj 0 -199.3606 Td (0518 ) 21.8426 Tj 0 -208.8539 Td (0519 ) 21.8426 Tj 0 -218.3473 Td (0520 ) 21.8426 Tj 0 -227.8407 Td (0521 ) 21.8426 Tj 0 -237.334 Td (0522 ) 21.8426 Tj 0 -246.8274 Td (0523 ) 21.8426 Tj 0 -256.3207 Td (0524 ) 21.8426 Tj 0 -265.8141 Td (0525 ) 21.8426 Tj 0 -275.3075 Td (0526 ) 21.8426 Tj 0 -284.8008 Td (0527 ) 21.8426 Tj 0 -294.2942 Td (0528 ) 21.8426 Tj 0 -303.7875 Td (0529 ) 21.8426 Tj 0 -313.2809 Td (0530 ) 21.8426 Tj 0 -322.7743 Td (0531 ) 21.8426 Tj 0 -332.2676 Td (0532 ) 21.8426 Tj 0 -341.761 Td (0533 ) 21.8426 Tj 0 -351.2543 Td (0534 ) 21.8426 Tj 0 -360.7477 Td (0535 ) 21.8426 Tj 0 -370.2411 Td (0536 ) 21.8426 Tj 0 -379.7344 Td (0537 ) 21.8426 Tj 0 -389.2278 Td (0538 ) 21.8426 Tj 0 -398.7211 Td (0539 ) 21.8426 Tj 0 -408.2145 Td (0540 ) 21.8426 Tj 0 -417.7079 Td (0541 ) 21.8426 Tj 0 -427.2012 Td (0542 ) 21.8426 Tj 0 -436.6946 Td (0543 ) 21.8426 Tj 0 -446.1879 Td (0544 ) 21.8426 Tj 0 -455.6813 Td (0545 ) 21.8426 Tj 0 -465.1747 Td (0546 ) 21.8426 Tj 0 -474.668 Td (0547 ) 21.8426 Tj 0 -484.1614 Td (0548 ) 21.8426 Tj 0 -493.6547 Td (0549 ) 21.8426 Tj 0 -522.1348 Td (Sheet 05) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/asm.h Page 1) 157.2665 Tj 0 -28.4801 Td (0550 //) 30.5796 Tj 0 -37.9735 Td (0551 // assembler macros to create x86 segments) 205.3202 Tj 0 -47.4668 Td (0552 //) 30.5796 Tj 0 -56.9602 Td (0553 ) 21.8426 Tj 0 -66.4535 Td (0554 #define SEG_NULLASM \ \\) 305.796 Tj 0 -75.9469 Td (0555 .word 0, 0; \ \\) 305.796 Tj 0 -85.4403 Td (0556 .byte 0, 0, 0, 0) 126.6869 Tj 0 -94.9336 Td (0557 ) 21.8426 Tj 0 -104.427 Td (0558 #define SEG_ASM\(type,base,lim\) \ \\) 305.796 Tj 0 -113.9203 Td (0559 .word \(\(\(lim\) >> 12\) & 0xffff\), \(\(base\) &\ 0xffff\); \\) 305.796 Tj 0 -123.4137 Td (0560 .byte \(\(\(base\) >> 16\) & 0xff\), \(0x90 | \(ty\ pe\)\), \\) 305.796 Tj 0 -132.9071 Td (0561 \(0xC0 | \(\(\(lim\) >> 28\) & 0xf\)\), \(\ \(\(base\) >> 24\) & 0xff\)) 332.0071 Tj 0 -142.4004 Td (0562 ) 21.8426 Tj 0 -151.8938 Td (0563 #define STA_X 0x8 // Executable segment) 235.8998 Tj 0 -161.3871 Td (0564 #define STA_E 0x4 // Expand down \(non-executabl\ e segments\)) 318.9016 Tj 0 -170.8805 Td (0565 #define STA_C 0x4 // Conforming code segment \(e\ xecutable only\)) 336.3756 Tj 0 -180.3739 Td (0566 #define STA_W 0x2 // Writeable \(non-executable \ segments\)) 310.1645 Tj 0 -189.8672 Td (0567 #define STA_R 0x2 // Readable \(executable segme\ nts\)) 288.322 Tj 0 -199.3606 Td (0568 #define STA_A 0x1 // Accessed) 192.2146 Tj 0 -208.8539 Td (0569 ) 21.8426 Tj 0 -218.3473 Td (0570 ) 21.8426 Tj 0 -227.8407 Td (0571 ) 21.8426 Tj 0 -237.334 Td (0572 ) 21.8426 Tj 0 -246.8274 Td (0573 ) 21.8426 Tj 0 -256.3207 Td (0574 ) 21.8426 Tj 0 -265.8141 Td (0575 ) 21.8426 Tj 0 -275.3075 Td (0576 ) 21.8426 Tj 0 -284.8008 Td (0577 ) 21.8426 Tj 0 -294.2942 Td (0578 ) 21.8426 Tj 0 -303.7875 Td (0579 ) 21.8426 Tj 0 -313.2809 Td (0580 ) 21.8426 Tj 0 -322.7743 Td (0581 ) 21.8426 Tj 0 -332.2676 Td (0582 ) 21.8426 Tj 0 -341.761 Td (0583 ) 21.8426 Tj 0 -351.2543 Td (0584 ) 21.8426 Tj 0 -360.7477 Td (0585 ) 21.8426 Tj 0 -370.2411 Td (0586 ) 21.8426 Tj 0 -379.7344 Td (0587 ) 21.8426 Tj 0 -389.2278 Td (0588 ) 21.8426 Tj 0 -398.7211 Td (0589 ) 21.8426 Tj 0 -408.2145 Td (0590 ) 21.8426 Tj 0 -417.7079 Td (0591 ) 21.8426 Tj 0 -427.2012 Td (0592 ) 21.8426 Tj 0 -436.6946 Td (0593 ) 21.8426 Tj 0 -446.1879 Td (0594 ) 21.8426 Tj 0 -455.6813 Td (0595 ) 21.8426 Tj 0 -465.1747 Td (0596 ) 21.8426 Tj 0 -474.668 Td (0597 ) 21.8426 Tj 0 -484.1614 Td (0598 ) 21.8426 Tj 0 -493.6547 Td (0599 ) 21.8426 Tj 0 -522.1348 Td (Sheet 05) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 13 13 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/mmu.h Page 1) 157.2665 Tj 0 -28.4801 Td (0600 // This file contains definitions for the) 200.9517 Tj 0 -37.9735 Td (0601 // x86 memory management unit \(MMU\).) 179.1091 Tj 0 -47.4668 Td (0602 ) 21.8426 Tj 0 -56.9602 Td (0603 // Eflags register) 100.4758 Tj 0 -66.4535 Td (0604 #define FL_CF 0x00000001 // Carry Flag) 253.3738 Tj 0 -75.9469 Td (0605 #define FL_PF 0x00000004 // Parity Flag) 257.7424 Tj 0 -85.4403 Td (0606 #define FL_AF 0x00000010 // Auxiliary carry\ Flag) 297.059 Tj 0 -94.9336 Td (0607 #define FL_ZF 0x00000040 // Zero Flag) 249.0053 Tj 0 -104.427 Td (0608 #define FL_SF 0x00000080 // Sign Flag) 249.0053 Tj 0 -113.9203 Td (0609 #define FL_TF 0x00000100 // Trap Flag) 249.0053 Tj 0 -123.4137 Td (0610 #define FL_IF 0x00000200 // Interrupt Enabl\ e) 279.5849 Tj 0 -132.9071 Td (0611 #define FL_DF 0x00000400 // Direction Flag) 270.8479 Tj 0 -142.4004 Td (0612 #define FL_OF 0x00000800 // Overflow Flag) 266.4794 Tj 0 -151.8938 Td (0613 #define FL_IOPL_MASK 0x00003000 // I/O Privilege L\ evel bitmask) 327.6386 Tj 0 -161.3871 Td (0614 #define FL_IOPL_0 0x00000000 // IOPL == 0) 257.7424 Tj 0 -170.8805 Td (0615 #define FL_IOPL_1 0x00001000 // IOPL == 1) 257.7424 Tj 0 -180.3739 Td (0616 #define FL_IOPL_2 0x00002000 // IOPL == 2) 257.7424 Tj 0 -189.8672 Td (0617 #define FL_IOPL_3 0x00003000 // IOPL == 3) 257.7424 Tj 0 -199.3606 Td (0618 #define FL_NT 0x00004000 // Nested Task) 257.7424 Tj 0 -208.8539 Td (0619 #define FL_RF 0x00010000 // Resume Flag) 257.7424 Tj 0 -218.3473 Td (0620 #define FL_VM 0x00020000 // Virtual 8086 mo\ de) 283.9534 Tj 0 -227.8407 Td (0621 #define FL_AC 0x00040000 // Alignment Check) 275.2164 Tj 0 -237.334 Td (0622 #define FL_VIF 0x00080000 // Virtual Interru\ pt Flag) 305.796 Tj 0 -246.8274 Td (0623 #define FL_VIP 0x00100000 // Virtual Interru\ pt Pending) 318.9016 Tj 0 -256.3207 Td (0624 #define FL_ID 0x00200000 // ID flag) 240.2683 Tj 0 -265.8141 Td (0625 ) 21.8426 Tj 0 -275.3075 Td (0626 // Segment Descriptor) 113.5814 Tj 0 -284.8008 Td (0627 struct segdesc {) 91.7388 Tj 0 -294.2942 Td (0628 uint lim_15_0 : 16; // Low bits of segment limit) 244.6368 Tj 0 -303.7875 Td (0629 uint base_15_0 : 16; // Low bits of segment base address) 275.2164 Tj 0 -313.2809 Td (0630 uint base_23_16 : 8; // Middle bits of segment base addr\ ess) 288.322 Tj 0 -322.7743 Td (0631 uint type : 4; // Segment type \(see STS_ constant\ s\)) 279.5849 Tj 0 -332.2676 Td (0632 uint s : 1; // 0 = system, 1 = application) 253.3738 Tj 0 -341.761 Td (0633 uint dpl : 2; // Descriptor Privilege Level) 249.0053 Tj 0 -351.2543 Td (0634 uint p : 1; // Present) 166.0035 Tj 0 -360.7477 Td (0635 uint lim_19_16 : 4; // High bits of segment limit) 249.0053 Tj 0 -370.2411 Td (0636 uint avl : 1; // Unused \(available for software \ use\)) 288.322 Tj 0 -379.7344 Td (0637 uint rsv1 : 1; // Reserved) 170.3721 Tj 0 -389.2278 Td (0638 uint db : 1; // 0 = 16-bit segment, 1 = 32-bit s\ egment) 301.4275 Tj 0 -398.7211 Td (0639 uint g : 1; // Granularity: limit scaled by 4K \ when set) 310.1645 Tj 0 -408.2145 Td (0640 uint base_31_24 : 8; // High bits of segment base addres\ s) 279.5849 Tj 0 -417.7079 Td (0641 };) 30.5796 Tj 0 -427.2012 Td (0642 ) 21.8426 Tj 0 -436.6946 Td (0643 ) 21.8426 Tj 0 -446.1879 Td (0644 ) 21.8426 Tj 0 -455.6813 Td (0645 ) 21.8426 Tj 0 -465.1747 Td (0646 ) 21.8426 Tj 0 -474.668 Td (0647 ) 21.8426 Tj 0 -484.1614 Td (0648 ) 21.8426 Tj 0 -493.6547 Td (0649 ) 21.8426 Tj 0 -522.1348 Td (Sheet 06) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/mmu.h Page 2) 157.2665 Tj 0 -28.4801 Td (0650 // Null segment) 87.3703 Tj 0 -37.9735 Td (0651 #define SEG_NULL \(struct segdesc\){ 0,0,0,0,0,0,0,\ 0,0,0,0,0,0 }) 323.2701 Tj 0 -47.4668 Td (0652 ) 21.8426 Tj 0 -56.9602 Td (0653 // Normal segment) 96.1073 Tj 0 -66.4535 Td (0654 #define SEG\(type, base, lim, dpl\) \(struct segdesc\) \ \\) 340.7441 Tj 0 -75.9469 Td (0655 { \(\(lim\) >> 12\) & 0xffff, \(base\) & 0xffff, \(\(base\)\ >> 16\) & 0xff, \\) 340.7441 Tj 0 -85.4403 Td (0656 type, 1, dpl, 1, \(uint\) \(lim\) >> 28, 0, 0, 1, 1, \ \\) 340.7441 Tj 0 -94.9336 Td (0657 \(uint\) \(base\) >> 24 }) 131.0554 Tj 0 -104.427 Td (0658 ) 21.8426 Tj 0 -113.9203 Td (0659 #define SEG16\(type, base, lim, dpl\) \(struct segdesc\) \ \\) 340.7441 Tj 0 -123.4137 Td (0660 { \(lim\) & 0xffff, \(base\) & 0xffff, \(\(base\) >> 16\) \ & 0xff, \\) 340.7441 Tj 0 -132.9071 Td (0661 type, 1, dpl, 1, \(uint\) \(lim\) >> 16, 0, 0, 1, 0, \ \\) 340.7441 Tj 0 -142.4004 Td (0662 \(uint\) \(base\) >> 24 }) 131.0554 Tj 0 -151.8938 Td (0663 ) 21.8426 Tj 0 -161.3871 Td (0664 #define DPL_USER 0x3 // User DPL) 192.2146 Tj 0 -170.8805 Td (0665 ) 21.8426 Tj 0 -180.3739 Td (0666 // Application segment type bits) 161.635 Tj 0 -189.8672 Td (0667 #define STA_X 0x8 // Executable segment) 235.8998 Tj 0 -199.3606 Td (0668 #define STA_E 0x4 // Expand down \(non-executabl\ e segments\)) 318.9016 Tj 0 -208.8539 Td (0669 #define STA_C 0x4 // Conforming code segment \(e\ xecutable only\)) 336.3756 Tj 0 -218.3473 Td (0670 #define STA_W 0x2 // Writeable \(non-executable \ segments\)) 310.1645 Tj 0 -227.8407 Td (0671 #define STA_R 0x2 // Readable \(executable segme\ nts\)) 288.322 Tj 0 -237.334 Td (0672 #define STA_A 0x1 // Accessed) 192.2146 Tj 0 -246.8274 Td (0673 ) 21.8426 Tj 0 -256.3207 Td (0674 // System segment type bits) 139.7925 Tj 0 -265.8141 Td (0675 #define STS_T16A 0x1 // Available 16-bit TSS) 244.6368 Tj 0 -275.3075 Td (0676 #define STS_LDT 0x2 // Local Descriptor Table) 253.3738 Tj 0 -284.8008 Td (0677 #define STS_T16B 0x3 // Busy 16-bit TSS) 222.7942 Tj 0 -294.2942 Td (0678 #define STS_CG16 0x4 // 16-bit Call Gate) 227.1628 Tj 0 -303.7875 Td (0679 #define STS_TG 0x5 // Task Gate / Coum Transmitio\ ns) 283.9534 Tj 0 -313.2809 Td (0680 #define STS_IG16 0x6 // 16-bit Interrupt Gate) 249.0053 Tj 0 -322.7743 Td (0681 #define STS_TG16 0x7 // 16-bit Trap Gate) 227.1628 Tj 0 -332.2676 Td (0682 #define STS_T32A 0x9 // Available 32-bit TSS) 244.6368 Tj 0 -341.761 Td (0683 #define STS_T32B 0xB // Busy 32-bit TSS) 222.7942 Tj 0 -351.2543 Td (0684 #define STS_CG32 0xC // 32-bit Call Gate) 227.1628 Tj 0 -360.7477 Td (0685 #define STS_IG32 0xE // 32-bit Interrupt Gate) 249.0053 Tj 0 -370.2411 Td (0686 #define STS_TG32 0xF // 32-bit Trap Gate) 227.1628 Tj 0 -379.7344 Td (0687 ) 21.8426 Tj 0 -389.2278 Td (0688 ) 21.8426 Tj 0 -398.7211 Td (0689 ) 21.8426 Tj 0 -408.2145 Td (0690 ) 21.8426 Tj 0 -417.7079 Td (0691 ) 21.8426 Tj 0 -427.2012 Td (0692 ) 21.8426 Tj 0 -436.6946 Td (0693 ) 21.8426 Tj 0 -446.1879 Td (0694 ) 21.8426 Tj 0 -455.6813 Td (0695 ) 21.8426 Tj 0 -465.1747 Td (0696 ) 21.8426 Tj 0 -474.668 Td (0697 ) 21.8426 Tj 0 -484.1614 Td (0698 ) 21.8426 Tj 0 -493.6547 Td (0699 ) 21.8426 Tj 0 -522.1348 Td (Sheet 06) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 14 14 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/mmu.h Page 3) 157.2665 Tj 0 -28.4801 Td (0700 // Task state segment format) 144.161 Tj 0 -37.9735 Td (0701 struct taskstate {) 100.4758 Tj 0 -47.4668 Td (0702 uint link; // Old ts selector) 192.2146 Tj 0 -56.9602 Td (0703 uint esp0; // Stack pointers and segment selecto\ rs) 283.9534 Tj 0 -66.4535 Td (0704 ushort ss0; // after an increase in privilege l\ evel) 292.6905 Tj 0 -75.9469 Td (0705 ushort padding1;) 100.4758 Tj 0 -85.4403 Td (0706 uint *esp1;) 78.6333 Tj 0 -94.9336 Td (0707 ushort ss1;) 78.6333 Tj 0 -104.427 Td (0708 ushort padding2;) 100.4758 Tj 0 -113.9203 Td (0709 uint *esp2;) 78.6333 Tj 0 -123.4137 Td (0710 ushort ss2;) 78.6333 Tj 0 -132.9071 Td (0711 ushort padding3;) 100.4758 Tj 0 -142.4004 Td (0712 void *cr3; // Page directory base) 209.6887 Tj 0 -151.8938 Td (0713 uint *eip; // Saved state from last task switch) 270.8479 Tj 0 -161.3871 Td (0714 uint eflags;) 83.0018 Tj 0 -170.8805 Td (0715 uint eax; // More saved state \(registers\)) 249.0053 Tj 0 -180.3739 Td (0716 uint ecx;) 69.8962 Tj 0 -189.8672 Td (0717 uint edx;) 69.8962 Tj 0 -199.3606 Td (0718 uint ebx;) 69.8962 Tj 0 -208.8539 Td (0719 uint *esp;) 74.2647 Tj 0 -218.3473 Td (0720 uint *ebp;) 74.2647 Tj 0 -227.8407 Td (0721 uint esi;) 69.8962 Tj 0 -237.334 Td (0722 uint edi;) 69.8962 Tj 0 -246.8274 Td (0723 ushort es; // Even more saved state \(segment se\ lectors\)) 305.796 Tj 0 -256.3207 Td (0724 ushort padding4;) 100.4758 Tj 0 -265.8141 Td (0725 ushort cs;) 74.2647 Tj 0 -275.3075 Td (0726 ushort padding5;) 100.4758 Tj 0 -284.8008 Td (0727 ushort ss;) 74.2647 Tj 0 -294.2942 Td (0728 ushort padding6;) 100.4758 Tj 0 -303.7875 Td (0729 ushort ds;) 74.2647 Tj 0 -313.2809 Td (0730 ushort padding7;) 100.4758 Tj 0 -322.7743 Td (0731 ushort fs;) 74.2647 Tj 0 -332.2676 Td (0732 ushort padding8;) 100.4758 Tj 0 -341.761 Td (0733 ushort gs;) 74.2647 Tj 0 -351.2543 Td (0734 ushort padding9;) 100.4758 Tj 0 -360.7477 Td (0735 ushort ldt;) 78.6333 Tj 0 -370.2411 Td (0736 ushort padding10;) 104.8443 Tj 0 -379.7344 Td (0737 ushort t; // Trap on task switch) 209.6887 Tj 0 -389.2278 Td (0738 ushort iomb; // I/O map base address) 214.0572 Tj 0 -398.7211 Td (0739 };) 30.5796 Tj 0 -408.2145 Td (0740 ) 21.8426 Tj 0 -417.7079 Td (0741 ) 21.8426 Tj 0 -427.2012 Td (0742 ) 21.8426 Tj 0 -436.6946 Td (0743 ) 21.8426 Tj 0 -446.1879 Td (0744 ) 21.8426 Tj 0 -455.6813 Td (0745 ) 21.8426 Tj 0 -465.1747 Td (0746 ) 21.8426 Tj 0 -474.668 Td (0747 ) 21.8426 Tj 0 -484.1614 Td (0748 ) 21.8426 Tj 0 -493.6547 Td (0749 ) 21.8426 Tj 0 -522.1348 Td (Sheet 07) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/mmu.h Page 4) 157.2665 Tj 0 -28.4801 Td (0750 // Gate descriptors for interrupts and traps) 214.0572 Tj 0 -37.9735 Td (0751 struct gatedesc {) 96.1073 Tj 0 -47.4668 Td (0752 uint off_15_0 : 16; // low 16 bits of offset in segmen\ t) 279.5849 Tj 0 -56.9602 Td (0753 uint cs : 16; // code segment selector) 231.5313 Tj 0 -66.4535 Td (0754 uint args : 5; // # args, 0 for interrupt/trap ga\ tes) 288.322 Tj 0 -75.9469 Td (0755 uint rsv1 : 3; // reserved\(should be zero I gues\ s\)) 279.5849 Tj 0 -85.4403 Td (0756 uint type : 4; // type\(STS_{TG,IG32,TG32}\)) 244.6368 Tj 0 -94.9336 Td (0757 uint s : 1; // must be 0 \(system\)) 218.4257 Tj 0 -104.427 Td (0758 uint dpl : 2; // descriptor\(meaning new\) privi\ lege level) 310.1645 Tj 0 -113.9203 Td (0759 uint p : 1; // Present) 170.3721 Tj 0 -123.4137 Td (0760 uint off_31_16 : 16; // high bits of offset in segment) 270.8479 Tj 0 -132.9071 Td (0761 };) 30.5796 Tj 0 -142.4004 Td (0762 ) 21.8426 Tj 0 -151.8938 Td (0763 // Set up a normal interrupt/trap gate descriptor.) 240.2683 Tj 0 -161.3871 Td (0764 // - istrap: 1 for a trap \(= exception\) gate, 0 for an i\ nterrupt gate.) 327.6386 Tj 0 -170.8805 Td (0765 // interrupt gate clears FL_IF, trap gate leaves FL_IF a\ lone) 292.6905 Tj 0 -180.3739 Td (0766 // - sel: Code segment selector for interrupt/trap handler) 275.2164 Tj 0 -189.8672 Td (0767 // - off: Offset in code segment for interrupt/trap handle\ r) 279.5849 Tj 0 -199.3606 Td (0768 // - dpl: Descriptor Privilege Level -) 187.8461 Tj 0 -208.8539 Td (0769 // the privilege level required for software to inv\ oke) 288.322 Tj 0 -218.3473 Td (0770 // this interrupt/trap gate explicitly using an int\ instruction.) 332.0071 Tj 0 -227.8407 Td (0771 #define SETGATE\(gate, istrap, sel, off, d\) \ \\) 279.5849 Tj 0 -237.334 Td (0772 { \ \\) 279.5849 Tj 0 -246.8274 Td (0773 \(gate\).off_15_0 = \(uint\) \(off\) & 0xffff; \ \\) 279.5849 Tj 0 -256.3207 Td (0774 \(gate\).cs = \(sel\); \ \\) 279.5849 Tj 0 -265.8141 Td (0775 \(gate\).args = 0; \ \\) 279.5849 Tj 0 -275.3075 Td (0776 \(gate\).rsv1 = 0; \ \\) 279.5849 Tj 0 -284.8008 Td (0777 \(gate\).type = \(istrap\) ? STS_TG32 : STS_IG32; \ \\) 279.5849 Tj 0 -294.2942 Td (0778 \(gate\).s = 0; \ \\) 279.5849 Tj 0 -303.7875 Td (0779 \(gate\).dpl = \(d\); \ \\) 279.5849 Tj 0 -313.2809 Td (0780 \(gate\).p = 1; \ \\) 279.5849 Tj 0 -322.7743 Td (0781 \(gate\).off_31_16 = \(uint\) \(off\) >> 16; \ \\) 279.5849 Tj 0 -332.2676 Td (0782 }) 26.2111 Tj 0 -341.761 Td (0783 ) 21.8426 Tj 0 -351.2543 Td (0784 ) 21.8426 Tj 0 -360.7477 Td (0785 ) 21.8426 Tj 0 -370.2411 Td (0786 ) 21.8426 Tj 0 -379.7344 Td (0787 ) 21.8426 Tj 0 -389.2278 Td (0788 ) 21.8426 Tj 0 -398.7211 Td (0789 ) 21.8426 Tj 0 -408.2145 Td (0790 ) 21.8426 Tj 0 -417.7079 Td (0791 ) 21.8426 Tj 0 -427.2012 Td (0792 ) 21.8426 Tj 0 -436.6946 Td (0793 ) 21.8426 Tj 0 -446.1879 Td (0794 ) 21.8426 Tj 0 -455.6813 Td (0795 ) 21.8426 Tj 0 -465.1747 Td (0796 ) 21.8426 Tj 0 -474.668 Td (0797 ) 21.8426 Tj 0 -484.1614 Td (0798 ) 21.8426 Tj 0 -493.6547 Td (0799 ) 21.8426 Tj 0 -522.1348 Td (Sheet 07) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 15 15 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/elf.h Page 1) 157.2665 Tj 0 -28.4801 Td (0800 // Format of an ELF executable file) 174.7406 Tj 0 -37.9735 Td (0801 ) 21.8426 Tj 0 -47.4668 Td (0802 #define ELF_MAGIC 0x464C457FU // "\\x7FELF" in little end\ ian) 283.9534 Tj 0 -56.9602 Td (0803 ) 21.8426 Tj 0 -66.4535 Td (0804 // File header) 83.0018 Tj 0 -75.9469 Td (0805 struct elfhdr {) 87.3703 Tj 0 -85.4403 Td (0806 uint magic; // must equal ELF_MAGIC) 187.8461 Tj 0 -94.9336 Td (0807 uchar elf[12];) 91.7388 Tj 0 -104.427 Td (0808 ushort type;) 83.0018 Tj 0 -113.9203 Td (0809 ushort machine;) 96.1073 Tj 0 -123.4137 Td (0810 uint version;) 87.3703 Tj 0 -132.9071 Td (0811 uint entry;) 78.6333 Tj 0 -142.4004 Td (0812 uint phoff;) 78.6333 Tj 0 -151.8938 Td (0813 uint shoff;) 78.6333 Tj 0 -161.3871 Td (0814 uint flags;) 78.6333 Tj 0 -170.8805 Td (0815 ushort ehsize;) 91.7388 Tj 0 -180.3739 Td (0816 ushort phentsize;) 104.8443 Tj 0 -189.8672 Td (0817 ushort phnum;) 87.3703 Tj 0 -199.3606 Td (0818 ushort shentsize;) 104.8443 Tj 0 -208.8539 Td (0819 ushort shnum;) 87.3703 Tj 0 -218.3473 Td (0820 ushort shstrndx;) 100.4758 Tj 0 -227.8407 Td (0821 };) 30.5796 Tj 0 -237.334 Td (0822 ) 21.8426 Tj 0 -246.8274 Td (0823 // Program section header) 131.0554 Tj 0 -256.3207 Td (0824 struct proghdr {) 91.7388 Tj 0 -265.8141 Td (0825 uint type;) 74.2647 Tj 0 -275.3075 Td (0826 uint offset;) 83.0018 Tj 0 -284.8008 Td (0827 uint va;) 65.5277 Tj 0 -294.2942 Td (0828 uint pa;) 65.5277 Tj 0 -303.7875 Td (0829 uint filesz;) 83.0018 Tj 0 -313.2809 Td (0830 uint memsz;) 78.6333 Tj 0 -322.7743 Td (0831 uint flags;) 78.6333 Tj 0 -332.2676 Td (0832 uint align;) 78.6333 Tj 0 -341.761 Td (0833 };) 30.5796 Tj 0 -351.2543 Td (0834 ) 21.8426 Tj 0 -360.7477 Td (0835 // Values for Proghdr type) 135.4239 Tj 0 -370.2411 Td (0836 #define ELF_PROG_LOAD 1) 166.0035 Tj 0 -379.7344 Td (0837 ) 21.8426 Tj 0 -389.2278 Td (0838 // Flag bits for Proghdr flags) 152.898 Tj 0 -398.7211 Td (0839 #define ELF_PROG_FLAG_EXEC 1) 166.0035 Tj 0 -408.2145 Td (0840 #define ELF_PROG_FLAG_WRITE 2) 166.0035 Tj 0 -417.7079 Td (0841 #define ELF_PROG_FLAG_READ 4) 166.0035 Tj 0 -427.2012 Td (0842 ) 21.8426 Tj 0 -436.6946 Td (0843 ) 21.8426 Tj 0 -446.1879 Td (0844 ) 21.8426 Tj 0 -455.6813 Td (0845 ) 21.8426 Tj 0 -465.1747 Td (0846 ) 21.8426 Tj 0 -474.668 Td (0847 ) 21.8426 Tj 0 -484.1614 Td (0848 ) 21.8426 Tj 0 -493.6547 Td (0849 ) 21.8426 Tj 0 -522.1348 Td (Sheet 08) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/elf.h Page 2) 157.2665 Tj 0 -28.4801 Td (0850 // Blank page.) 83.0018 Tj 0 -37.9735 Td (0851 ) 21.8426 Tj 0 -47.4668 Td (0852 ) 21.8426 Tj 0 -56.9602 Td (0853 ) 21.8426 Tj 0 -66.4535 Td (0854 ) 21.8426 Tj 0 -75.9469 Td (0855 ) 21.8426 Tj 0 -85.4403 Td (0856 ) 21.8426 Tj 0 -94.9336 Td (0857 ) 21.8426 Tj 0 -104.427 Td (0858 ) 21.8426 Tj 0 -113.9203 Td (0859 ) 21.8426 Tj 0 -123.4137 Td (0860 ) 21.8426 Tj 0 -132.9071 Td (0861 ) 21.8426 Tj 0 -142.4004 Td (0862 ) 21.8426 Tj 0 -151.8938 Td (0863 ) 21.8426 Tj 0 -161.3871 Td (0864 ) 21.8426 Tj 0 -170.8805 Td (0865 ) 21.8426 Tj 0 -180.3739 Td (0866 ) 21.8426 Tj 0 -189.8672 Td (0867 ) 21.8426 Tj 0 -199.3606 Td (0868 ) 21.8426 Tj 0 -208.8539 Td (0869 ) 21.8426 Tj 0 -218.3473 Td (0870 ) 21.8426 Tj 0 -227.8407 Td (0871 ) 21.8426 Tj 0 -237.334 Td (0872 ) 21.8426 Tj 0 -246.8274 Td (0873 ) 21.8426 Tj 0 -256.3207 Td (0874 ) 21.8426 Tj 0 -265.8141 Td (0875 ) 21.8426 Tj 0 -275.3075 Td (0876 ) 21.8426 Tj 0 -284.8008 Td (0877 ) 21.8426 Tj 0 -294.2942 Td (0878 ) 21.8426 Tj 0 -303.7875 Td (0879 ) 21.8426 Tj 0 -313.2809 Td (0880 ) 21.8426 Tj 0 -322.7743 Td (0881 ) 21.8426 Tj 0 -332.2676 Td (0882 ) 21.8426 Tj 0 -341.761 Td (0883 ) 21.8426 Tj 0 -351.2543 Td (0884 ) 21.8426 Tj 0 -360.7477 Td (0885 ) 21.8426 Tj 0 -370.2411 Td (0886 ) 21.8426 Tj 0 -379.7344 Td (0887 ) 21.8426 Tj 0 -389.2278 Td (0888 ) 21.8426 Tj 0 -398.7211 Td (0889 ) 21.8426 Tj 0 -408.2145 Td (0890 ) 21.8426 Tj 0 -417.7079 Td (0891 ) 21.8426 Tj 0 -427.2012 Td (0892 ) 21.8426 Tj 0 -436.6946 Td (0893 ) 21.8426 Tj 0 -446.1879 Td (0894 ) 21.8426 Tj 0 -455.6813 Td (0895 ) 21.8426 Tj 0 -465.1747 Td (0896 ) 21.8426 Tj 0 -474.668 Td (0897 ) 21.8426 Tj 0 -484.1614 Td (0898 ) 21.8426 Tj 0 -493.6547 Td (0899 ) 21.8426 Tj 0 -522.1348 Td (Sheet 08) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 16 16 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/bootasm.S Page 1) 174.7406 Tj 0 -28.4801 Td (0900 #include "asm.h") 91.7388 Tj 0 -37.9735 Td (0901 ) 21.8426 Tj 0 -47.4668 Td (0902 # Start the first CPU: switch to 32-bit protected mode, ju\ mp into C.) 318.9016 Tj 0 -56.9602 Td (0903 # The BIOS loads this code from the first sector of the ha\ rd disk into) 327.6386 Tj 0 -66.4535 Td (0904 # memory at physical address 0x7c00 and starts executing i\ n real mode) 323.2701 Tj 0 -75.9469 Td (0905 # with %cs=0 %ip=7c00.) 117.9499 Tj 0 -85.4403 Td (0906 ) 21.8426 Tj 0 -94.9336 Td (0907 .set PROT_MODE_CSEG, 0x8 # kernel code segment sel\ ector) 297.059 Tj 0 -104.427 Td (0908 .set PROT_MODE_DSEG, 0x10 # kernel data segment sel\ ector) 297.059 Tj 0 -113.9203 Td (0909 .set CR0_PE_ON, 0x1 # protected mode enable f\ lag) 288.322 Tj 0 -123.4137 Td (0910 ) 21.8426 Tj 0 -132.9071 Td (0911 .globl start) 74.2647 Tj 0 -142.4004 Td (0912 start:) 48.0537 Tj 0 -151.8938 Td (0913 .code16 # Assemble for 16-bit mode) 266.4794 Tj 0 -161.3871 Td (0914 cli # Disable interrupts) 240.2683 Tj 0 -170.8805 Td (0915 cld # String operations incremen\ t) 279.5849 Tj 0 -180.3739 Td (0916 ) 21.8426 Tj 0 -189.8672 Td (0917 # Set up the important data segment registers \(DS, ES, \ SS\).) 288.322 Tj 0 -199.3606 Td (0918 xorw %ax,%ax # Segment number zero) 244.6368 Tj 0 -208.8539 Td (0919 movw %ax,%ds # -> Data Segment) 227.1628 Tj 0 -218.3473 Td (0920 movw %ax,%es # -> Extra Segment) 231.5313 Tj 0 -227.8407 Td (0921 movw %ax,%ss # -> Stack Segment) 231.5313 Tj 0 -237.334 Td (0922 ) 21.8426 Tj 0 -246.8274 Td (0923 # Enable A20:) 87.3703 Tj 0 -256.3207 Td (0924 # For backwards compatibility with the earliest PCs, p\ hysical) 305.796 Tj 0 -265.8141 Td (0925 # address line 20 is tied low, so that addresses highe\ r than) 301.4275 Tj 0 -275.3075 Td (0926 # 1MB wrap around to zero by default. This code undoe\ s this.) 305.796 Tj 0 -284.8008 Td (0927 seta20.1:) 61.1592 Tj 0 -294.2942 Td (0928 inb $0x64,%al # Wait for not busy) 253.3738 Tj 0 -303.7875 Td (0929 testb $0x2,%al) 100.4758 Tj 0 -313.2809 Td (0930 jnz seta20.1) 100.4758 Tj 0 -322.7743 Td (0931 ) 21.8426 Tj 0 -332.2676 Td (0932 movb $0xd1,%al # 0xd1 -> port 0x64) 253.3738 Tj 0 -341.761 Td (0933 outb %al,$0x64) 104.8443 Tj 0 -351.2543 Td (0934 ) 21.8426 Tj 0 -360.7477 Td (0935 seta20.2:) 61.1592 Tj 0 -370.2411 Td (0936 inb $0x64,%al # Wait for not busy) 253.3738 Tj 0 -379.7344 Td (0937 testb $0x2,%al) 100.4758 Tj 0 -389.2278 Td (0938 jnz seta20.2) 100.4758 Tj 0 -398.7211 Td (0939 ) 21.8426 Tj 0 -408.2145 Td (0940 movb $0xdf,%al # 0xdf -> port 0x60) 253.3738 Tj 0 -417.7079 Td (0941 outb %al,$0x60) 104.8443 Tj 0 -427.2012 Td (0942 ) 21.8426 Tj 0 -436.6946 Td (0943 ) 21.8426 Tj 0 -446.1879 Td (0944 ) 21.8426 Tj 0 -455.6813 Td (0945 ) 21.8426 Tj 0 -465.1747 Td (0946 ) 21.8426 Tj 0 -474.668 Td (0947 ) 21.8426 Tj 0 -484.1614 Td (0948 ) 21.8426 Tj 0 -493.6547 Td (0949 ) 21.8426 Tj 0 -522.1348 Td (Sheet 09) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/bootasm.S Page 2) 174.7406 Tj 0 -28.4801 Td (0950 # Switch from real to protected mode, using a bootstrap \ GDT) 288.322 Tj 0 -37.9735 Td (0951 # and segment translation that makes virtual addresses) 266.4794 Tj 0 -47.4668 Td (0952 # identical to physical addresses, so that the) 231.5313 Tj 0 -56.9602 Td (0953 # effective memory map does not change during the switch\ .) 279.5849 Tj 0 -66.4535 Td (0954 lgdt gdtdesc) 96.1073 Tj 0 -75.9469 Td (0955 movl %cr0, %eax) 109.2129 Tj 0 -85.4403 Td (0956 orl $CR0_PE_ON, %eax) 135.4239 Tj 0 -94.9336 Td (0957 movl %eax, %cr0) 109.2129 Tj 0 -104.427 Td (0958 ) 21.8426 Tj 0 -113.9203 Td (0959 # Jump to next instruction, but in 32-bit code segment.) 270.8479 Tj 0 -123.4137 Td (0960 # Switches processor into 32-bit mode.) 196.5831 Tj 0 -132.9071 Td (0961 ljmp $PROT_MODE_CSEG, $protcseg) 179.1091 Tj 0 -142.4004 Td (0962 ) 21.8426 Tj 0 -151.8938 Td (0963 .code32 # Assemble for 32-bit mode) 266.4794 Tj 0 -161.3871 Td (0964 protcseg:) 61.1592 Tj 0 -170.8805 Td (0965 # Set up the protected-mode data segment registers) 249.0053 Tj 0 -180.3739 Td (0966 movw $PROT_MODE_DSEG, %ax # Our data segment selec\ tor) 288.322 Tj 0 -189.8672 Td (0967 movw %ax, %ds # -> DS: Data Segment) 262.1109 Tj 0 -199.3606 Td (0968 movw %ax, %es # -> ES: Extra Segment) 266.4794 Tj 0 -208.8539 Td (0969 movw %ax, %fs # -> FS) 200.9517 Tj 0 -218.3473 Td (0970 movw %ax, %gs # -> GS) 200.9517 Tj 0 -227.8407 Td (0971 movw %ax, %ss # -> SS: Stack Segment) 266.4794 Tj 0 -237.334 Td (0972 ) 21.8426 Tj 0 -246.8274 Td (0973 # Set up the stack pointer and call into C.) 218.4257 Tj 0 -256.3207 Td (0974 movl $start, %esp) 117.9499 Tj 0 -265.8141 Td (0975 call bootmain) 100.4758 Tj 0 -275.3075 Td (0976 ) 21.8426 Tj 0 -284.8008 Td (0977 # If bootmain returns \(it shouldn't\), loop.) 218.4257 Tj 0 -294.2942 Td (0978 spin:) 43.6851 Tj 0 -303.7875 Td (0979 jmp spin) 83.0018 Tj 0 -313.2809 Td (0980 ) 21.8426 Tj 0 -322.7743 Td (0981 # Bootstrap GDT) 87.3703 Tj 0 -332.2676 Td (0982 .p2align 2 # force 4 byte a\ lignment) 310.1645 Tj 0 -341.761 Td (0983 gdt:) 39.3166 Tj 0 -351.2543 Td (0984 SEG_NULLASM # null seg) 249.0053 Tj 0 -360.7477 Td (0985 SEG_ASM\(STA_X|STA_R, 0x0, 0xffffffff\) # code seg) 249.0053 Tj 0 -370.2411 Td (0986 SEG_ASM\(STA_W, 0x0, 0xffffffff\) # data seg) 249.0053 Tj 0 -379.7344 Td (0987 ) 21.8426 Tj 0 -389.2278 Td (0988 gdtdesc:) 56.7907 Tj 0 -398.7211 Td (0989 .word 0x17 # sizeof\(gdt\) \ - 1) 279.5849 Tj 0 -408.2145 Td (0990 .long gdt # address gdt) 262.1109 Tj 0 -417.7079 Td (0991 ) 21.8426 Tj 0 -427.2012 Td (0992 ) 21.8426 Tj 0 -436.6946 Td (0993 ) 21.8426 Tj 0 -446.1879 Td (0994 ) 21.8426 Tj 0 -455.6813 Td (0995 ) 21.8426 Tj 0 -465.1747 Td (0996 ) 21.8426 Tj 0 -474.668 Td (0997 ) 21.8426 Tj 0 -484.1614 Td (0998 ) 21.8426 Tj 0 -493.6547 Td (0999 ) 21.8426 Tj 0 -522.1348 Td (Sheet 09) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 17 17 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/bootother.S Page 1) 183.4776 Tj 0 -28.4801 Td (1000 #include "asm.h") 91.7388 Tj 0 -37.9735 Td (1001 ) 21.8426 Tj 0 -47.4668 Td (1002 # Each non-boot CPU \("AP"\) is started up in response to \ a STARTUP) 305.796 Tj 0 -56.9602 Td (1003 # IPI from the boot CPU. Section B.4.2 of the Multi-Proce\ ssor) 292.6905 Tj 0 -66.4535 Td (1004 # Specification says that the AP will start in real mode w\ ith CS:IP) 314.533 Tj 0 -75.9469 Td (1005 # set to XY00:0000, where XY is an 8-bit value sent with t\ he) 283.9534 Tj 0 -85.4403 Td (1006 # STARTUP. Thus this code must start at a 4096-byte bounda\ ry.) 288.322 Tj 0 -94.9336 Td (1007 #) 26.2111 Tj 0 -104.427 Td (1008 # Because this code sets DS to zero, it must sit) 231.5313 Tj 0 -113.9203 Td (1009 # at an address in the low 2^16 bytes.) 187.8461 Tj 0 -123.4137 Td (1010 #) 26.2111 Tj 0 -132.9071 Td (1011 # Bootothers \(in main.c\) sends the STARTUPs, one at a ti\ me.) 279.5849 Tj 0 -142.4004 Td (1012 # It puts this code \(start\) at 0x7000.) 187.8461 Tj 0 -151.8938 Td (1013 # It puts the correct %esp in start-4,) 187.8461 Tj 0 -161.3871 Td (1014 # and the place to jump to in start-8.) 187.8461 Tj 0 -170.8805 Td (1015 #) 26.2111 Tj 0 -180.3739 Td (1016 # This code is identical to bootasm.S except:) 218.4257 Tj 0 -189.8672 Td (1017 # - it does not need to enable A20) 179.1091 Tj 0 -199.3606 Td (1018 # - it uses the address at start-4 for the %esp) 235.8998 Tj 0 -208.8539 Td (1019 # - it jumps to the address at start-8 instead of callin\ g bootmain) 318.9016 Tj 0 -218.3473 Td (1020 ) 21.8426 Tj 0 -227.8407 Td (1021 .set PROT_MODE_CSEG, 0x8 # kernel code segment sel\ ector) 297.059 Tj 0 -237.334 Td (1022 .set PROT_MODE_DSEG, 0x10 # kernel data segment sel\ ector) 297.059 Tj 0 -246.8274 Td (1023 .set CR0_PE_ON, 0x1 # protected mode enable f\ lag) 288.322 Tj 0 -256.3207 Td (1024 ) 21.8426 Tj 0 -265.8141 Td (1025 .globl start) 74.2647 Tj 0 -275.3075 Td (1026 start:) 48.0537 Tj 0 -284.8008 Td (1027 .code16 # Assemble for 16-bit mode) 266.4794 Tj 0 -294.2942 Td (1028 cli # Disable interrupts) 240.2683 Tj 0 -303.7875 Td (1029 cld # String operations incremen\ t) 279.5849 Tj 0 -313.2809 Td (1030 ) 21.8426 Tj 0 -322.7743 Td (1031 # Set up the important data segment registers \(DS, ES, \ SS\).) 288.322 Tj 0 -332.2676 Td (1032 xorw %ax,%ax # Segment number zero) 244.6368 Tj 0 -341.761 Td (1033 movw %ax,%ds # -> Data Segment) 227.1628 Tj 0 -351.2543 Td (1034 movw %ax,%es # -> Extra Segment) 231.5313 Tj 0 -360.7477 Td (1035 movw %ax,%ss # -> Stack Segment) 231.5313 Tj 0 -370.2411 Td (1036 ) 21.8426 Tj 0 -379.7344 Td (1037 ) 21.8426 Tj 0 -389.2278 Td (1038 ) 21.8426 Tj 0 -398.7211 Td (1039 ) 21.8426 Tj 0 -408.2145 Td (1040 ) 21.8426 Tj 0 -417.7079 Td (1041 ) 21.8426 Tj 0 -427.2012 Td (1042 ) 21.8426 Tj 0 -436.6946 Td (1043 ) 21.8426 Tj 0 -446.1879 Td (1044 ) 21.8426 Tj 0 -455.6813 Td (1045 ) 21.8426 Tj 0 -465.1747 Td (1046 ) 21.8426 Tj 0 -474.668 Td (1047 ) 21.8426 Tj 0 -484.1614 Td (1048 ) 21.8426 Tj 0 -493.6547 Td (1049 ) 21.8426 Tj 0 -522.1348 Td (Sheet 10) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/bootother.S Page 2) 183.4776 Tj 0 -28.4801 Td (1050 # Switch from real to protected mode, using a bootstrap \ GDT) 288.322 Tj 0 -37.9735 Td (1051 # and segment translation that makes virtual addresses) 266.4794 Tj 0 -47.4668 Td (1052 # identical to their physical addresses, so that the) 257.7424 Tj 0 -56.9602 Td (1053 # effective memory map does not change during the switch\ .) 279.5849 Tj 0 -66.4535 Td (1054 lgdt gdtdesc) 96.1073 Tj 0 -75.9469 Td (1055 movl %cr0, %eax) 109.2129 Tj 0 -85.4403 Td (1056 orl $CR0_PE_ON, %eax) 135.4239 Tj 0 -94.9336 Td (1057 movl %eax, %cr0) 109.2129 Tj 0 -104.427 Td (1058 ) 21.8426 Tj 0 -113.9203 Td (1059 # Jump to next instruction, but in 32-bit code segment.) 270.8479 Tj 0 -123.4137 Td (1060 # Switches processor into 32-bit mode.) 196.5831 Tj 0 -132.9071 Td (1061 ljmp $PROT_MODE_CSEG, $protcseg) 179.1091 Tj 0 -142.4004 Td (1062 ) 21.8426 Tj 0 -151.8938 Td (1063 .code32 # Assemble for 32-bit mode) 266.4794 Tj 0 -161.3871 Td (1064 protcseg:) 61.1592 Tj 0 -170.8805 Td (1065 # Set up the protected-mode data segment registers) 249.0053 Tj 0 -180.3739 Td (1066 movw $PROT_MODE_DSEG, %ax # Our data segment selec\ tor) 288.322 Tj 0 -189.8672 Td (1067 movw %ax, %ds # -> DS: Data Segment) 262.1109 Tj 0 -199.3606 Td (1068 movw %ax, %es # -> ES: Extra Segment) 266.4794 Tj 0 -208.8539 Td (1069 movw %ax, %fs # -> FS) 200.9517 Tj 0 -218.3473 Td (1070 movw %ax, %gs # -> GS) 200.9517 Tj 0 -227.8407 Td (1071 movw %ax, %ss # -> SS: Stack Segment) 266.4794 Tj 0 -237.334 Td (1072 ) 21.8426 Tj 0 -246.8274 Td (1073 movl start-4, %esp) 122.3184 Tj 0 -256.3207 Td (1074 movl start-8, %eax) 122.3184 Tj 0 -265.8141 Td (1075 jmp *%eax) 87.3703 Tj 0 -275.3075 Td (1076 ) 21.8426 Tj 0 -284.8008 Td (1077 # Bootstrap GDT) 87.3703 Tj 0 -294.2942 Td (1078 .p2align 2 # force 4 byte a\ lignment) 310.1645 Tj 0 -303.7875 Td (1079 gdt:) 39.3166 Tj 0 -313.2809 Td (1080 SEG_NULLASM # null seg) 249.0053 Tj 0 -322.7743 Td (1081 SEG_ASM\(STA_X|STA_R, 0x0, 0xffffffff\) # code seg) 249.0053 Tj 0 -332.2676 Td (1082 SEG_ASM\(STA_W, 0x0, 0xffffffff\) # data seg) 249.0053 Tj 0 -341.761 Td (1083 ) 21.8426 Tj 0 -351.2543 Td (1084 gdtdesc:) 56.7907 Tj 0 -360.7477 Td (1085 .word 0x17 # sizeof\(gdt\) \ - 1) 279.5849 Tj 0 -370.2411 Td (1086 .long gdt # address gdt) 262.1109 Tj 0 -379.7344 Td (1087 ) 21.8426 Tj 0 -389.2278 Td (1088 ) 21.8426 Tj 0 -398.7211 Td (1089 ) 21.8426 Tj 0 -408.2145 Td (1090 ) 21.8426 Tj 0 -417.7079 Td (1091 ) 21.8426 Tj 0 -427.2012 Td (1092 ) 21.8426 Tj 0 -436.6946 Td (1093 ) 21.8426 Tj 0 -446.1879 Td (1094 ) 21.8426 Tj 0 -455.6813 Td (1095 ) 21.8426 Tj 0 -465.1747 Td (1096 ) 21.8426 Tj 0 -474.668 Td (1097 ) 21.8426 Tj 0 -484.1614 Td (1098 ) 21.8426 Tj 0 -493.6547 Td (1099 ) 21.8426 Tj 0 -522.1348 Td (Sheet 10) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 18 18 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/bootmain.c Page 1) 179.1091 Tj 0 -28.4801 Td (1100 // Boot loader.) 87.3703 Tj 0 -37.9735 Td (1101 //) 30.5796 Tj 0 -47.4668 Td (1102 // Part of the boot sector, along with bootasm.S, which ca\ lls bootmain\(\).) 340.7441 Tj 0 -56.9602 Td (1103 // bootasm.S has put the processor into protected 32-bit m\ ode.) 292.6905 Tj 0 -66.4535 Td (1104 // bootmain\(\) loads an ELF kernel image from the disk st\ arting at) 305.796 Tj 0 -75.9469 Td (1105 // sector 1 and then jumps to the kernel entry routine.) 262.1109 Tj 0 -85.4403 Td (1106 ) 21.8426 Tj 0 -94.9336 Td (1107 #include "types.h") 100.4758 Tj 0 -104.427 Td (1108 #include "elf.h") 91.7388 Tj 0 -113.9203 Td (1109 #include "x86.h") 91.7388 Tj 0 -123.4137 Td (1110 ) 21.8426 Tj 0 -132.9071 Td (1111 #define SECTSIZE 512) 113.5814 Tj 0 -142.4004 Td (1112 ) 21.8426 Tj 0 -151.8938 Td (1113 void readseg\(uint, uint, uint\);) 157.2665 Tj 0 -161.3871 Td (1114 ) 21.8426 Tj 0 -170.8805 Td (1115 void) 39.3166 Tj 0 -180.3739 Td (1116 bootmain\(void\)) 83.0018 Tj 0 -189.8672 Td (1117 {) 26.2111 Tj 0 -199.3606 Td (1118 struct elfhdr *elf;) 113.5814 Tj 0 -208.8539 Td (1119 struct proghdr *ph, *eph;) 139.7925 Tj 0 -218.3473 Td (1120 void \(*entry\)\(void\);) 117.9499 Tj 0 -227.8407 Td (1121 ) 21.8426 Tj 0 -237.334 Td (1122 elf = \(struct elfhdr*\)0x10000; // scratch space) 240.2683 Tj 0 -246.8274 Td (1123 ) 21.8426 Tj 0 -256.3207 Td (1124 // Read 1st page off disk) 139.7925 Tj 0 -265.8141 Td (1125 readseg\(\(uint\)elf, SECTSIZE*8, 0\);) 179.1091 Tj 0 -275.3075 Td (1126 ) 21.8426 Tj 0 -284.8008 Td (1127 // Is this an ELF executable?) 157.2665 Tj 0 -294.2942 Td (1128 if\(elf->magic != ELF_MAGIC\)) 148.5295 Tj 0 -303.7875 Td (1129 goto bad;) 78.6333 Tj 0 -313.2809 Td (1130 ) 21.8426 Tj 0 -322.7743 Td (1131 // Load each program segment \(ignores ph flags\).) 240.2683 Tj 0 -332.2676 Td (1132 ph = \(struct proghdr*\)\(\(uchar*\)elf + elf->phoff\);) 244.6368 Tj 0 -341.761 Td (1133 eph = ph + elf->phnum;) 126.6869 Tj 0 -351.2543 Td (1134 for\(; ph < eph; ph++\)) 122.3184 Tj 0 -360.7477 Td (1135 readseg\(ph->va & 0xFFFFFF, ph->memsz, ph->offset\);) 257.7424 Tj 0 -370.2411 Td (1136 ) 21.8426 Tj 0 -379.7344 Td (1137 // Call the entry point from the ELF header.) 222.7942 Tj 0 -389.2278 Td (1138 // Does not return!) 113.5814 Tj 0 -398.7211 Td (1139 entry = \(void\(*\)\(void\)\)\(elf->entry & 0xFFFFFF\);) 235.8998 Tj 0 -408.2145 Td (1140 entry\(\);) 65.5277 Tj 0 -417.7079 Td (1141 ) 21.8426 Tj 0 -427.2012 Td (1142 bad:) 39.3166 Tj 0 -436.6946 Td (1143 outw\(0x8A00, 0x8A00\);) 122.3184 Tj 0 -446.1879 Td (1144 outw\(0x8A00, 0x8E00\);) 122.3184 Tj 0 -455.6813 Td (1145 for\(;;\)) 61.1592 Tj 0 -465.1747 Td (1146 ;) 43.6851 Tj 0 -474.668 Td (1147 }) 26.2111 Tj 0 -484.1614 Td (1148 ) 21.8426 Tj 0 -493.6547 Td (1149 ) 21.8426 Tj 0 -522.1348 Td (Sheet 11) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/bootmain.c Page 2) 179.1091 Tj 0 -28.4801 Td (1150 void) 39.3166 Tj 0 -37.9735 Td (1151 waitdisk\(void\)) 83.0018 Tj 0 -47.4668 Td (1152 {) 26.2111 Tj 0 -56.9602 Td (1153 // Wait for disk ready.) 131.0554 Tj 0 -66.4535 Td (1154 while\(\(inb\(0x1F7\) & 0xC0\) != 0x40\)) 179.1091 Tj 0 -75.9469 Td (1155 ;) 43.6851 Tj 0 -85.4403 Td (1156 }) 26.2111 Tj 0 -94.9336 Td (1157 ) 21.8426 Tj 0 -104.427 Td (1158 // Read a single sector at offset into dst.) 209.6887 Tj 0 -113.9203 Td (1159 void) 39.3166 Tj 0 -123.4137 Td (1160 readsect\(void *dst, uint offset\)) 161.635 Tj 0 -132.9071 Td (1161 {) 26.2111 Tj 0 -142.4004 Td (1162 // Issue command.) 104.8443 Tj 0 -151.8938 Td (1163 waitdisk\(\);) 78.6333 Tj 0 -161.3871 Td (1164 outb\(0x1F2, 1\); // count = 1) 161.635 Tj 0 -170.8805 Td (1165 outb\(0x1F3, offset\);) 117.9499 Tj 0 -180.3739 Td (1166 outb\(0x1F4, offset >> 8\);) 139.7925 Tj 0 -189.8672 Td (1167 outb\(0x1F5, offset >> 16\);) 144.161 Tj 0 -199.3606 Td (1168 outb\(0x1F6, \(offset >> 24\) | 0xE0\);) 183.4776 Tj 0 -208.8539 Td (1169 outb\(0x1F7, 0x20\); // cmd 0x20 - read sectors) 231.5313 Tj 0 -218.3473 Td (1170 ) 21.8426 Tj 0 -227.8407 Td (1171 // Read data.) 87.3703 Tj 0 -237.334 Td (1172 waitdisk\(\);) 78.6333 Tj 0 -246.8274 Td (1173 insl\(0x1F0, dst, SECTSIZE/4\);) 157.2665 Tj 0 -256.3207 Td (1174 }) 26.2111 Tj 0 -265.8141 Td (1175 ) 21.8426 Tj 0 -275.3075 Td (1176 // Read 'count' bytes at 'offset' from kernel into virtual\ address 'va'.) 336.3756 Tj 0 -284.8008 Td (1177 // Might copy more than asked.) 152.898 Tj 0 -294.2942 Td (1178 void) 39.3166 Tj 0 -303.7875 Td (1179 readseg\(uint va, uint count, uint offset\)) 200.9517 Tj 0 -313.2809 Td (1180 {) 26.2111 Tj 0 -322.7743 Td (1181 uint eva;) 69.8962 Tj 0 -332.2676 Td (1182 ) 21.8426 Tj 0 -341.761 Td (1183 eva = va + count;) 104.8443 Tj 0 -351.2543 Td (1184 ) 21.8426 Tj 0 -360.7477 Td (1185 // Round down to sector boundary.) 174.7406 Tj 0 -370.2411 Td (1186 va &= ~\(SECTSIZE - 1\);) 126.6869 Tj 0 -379.7344 Td (1187 ) 21.8426 Tj 0 -389.2278 Td (1188 // Translate from bytes to sectors; kernel starts at sec\ tor 1.) 301.4275 Tj 0 -398.7211 Td (1189 offset = \(offset / SECTSIZE\) + 1;) 174.7406 Tj 0 -408.2145 Td (1190 ) 21.8426 Tj 0 -417.7079 Td (1191 // If this is too slow, we could read lots of sectors at\ a time.) 310.1645 Tj 0 -427.2012 Td (1192 // We'd write more to memory than asked, but it doesn't \ matter --) 314.533 Tj 0 -436.6946 Td (1193 // we load in increasing order.) 166.0035 Tj 0 -446.1879 Td (1194 for\(; va < eva; va += SECTSIZE, offset++\)) 209.6887 Tj 0 -455.6813 Td (1195 readsect\(\(uchar*\)va, offset\);) 166.0035 Tj 0 -465.1747 Td (1196 }) 26.2111 Tj 0 -474.668 Td (1197 ) 21.8426 Tj 0 -484.1614 Td (1198 ) 21.8426 Tj 0 -493.6547 Td (1199 ) 21.8426 Tj 0 -522.1348 Td (Sheet 11) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 19 19 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/main.c Page 1) 161.635 Tj 0 -28.4801 Td (1200 #include "types.h") 100.4758 Tj 0 -37.9735 Td (1201 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (1202 #include "param.h") 100.4758 Tj 0 -56.9602 Td (1203 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (1204 #include "proc.h") 96.1073 Tj 0 -75.9469 Td (1205 #include "x86.h") 91.7388 Tj 0 -85.4403 Td (1206 ) 21.8426 Tj 0 -94.9336 Td (1207 static void bootothers\(void\);) 148.5295 Tj 0 -104.427 Td (1208 static void mpmain\(void\) __attribute__\(\(noreturn\)\);) 244.6368 Tj 0 -113.9203 Td (1209 ) 21.8426 Tj 0 -123.4137 Td (1210 // Bootstrap processor starts running C code here.) 240.2683 Tj 0 -132.9071 Td (1211 int) 34.9481 Tj 0 -142.4004 Td (1212 main\(void\)) 65.5277 Tj 0 -151.8938 Td (1213 {) 26.2111 Tj 0 -161.3871 Td (1214 extern char edata[], end[];) 148.5295 Tj 0 -170.8805 Td (1215 ) 21.8426 Tj 0 -180.3739 Td (1216 // clear BSS) 83.0018 Tj 0 -189.8672 Td (1217 memset\(edata, 0, end - edata\);) 161.635 Tj 0 -199.3606 Td (1218 ) 21.8426 Tj 0 -208.8539 Td (1219 mp_init\(\); // collect info about this machine) 227.1628 Tj 0 -218.3473 Td (1220 lapic_init\(mp_bcpu\(\)\);) 126.6869 Tj 0 -227.8407 Td (1221 cprintf\("\\ncpu%d: starting xv6\\n\\n", cpu\(\)\);) 222.7942 Tj 0 -237.334 Td (1222 ) 21.8426 Tj 0 -246.8274 Td (1223 pinit\(\); // process table) 174.7406 Tj 0 -256.3207 Td (1224 binit\(\); // buffer cache) 170.3721 Tj 0 -265.8141 Td (1225 pic_init\(\); // interrupt controller) 205.3202 Tj 0 -275.3075 Td (1226 ioapic_init\(\); // another interrupt controller) 240.2683 Tj 0 -284.8008 Td (1227 kinit\(\); // physical memory allocator) 227.1628 Tj 0 -294.2942 Td (1228 tvinit\(\); // trap vectors) 170.3721 Tj 0 -303.7875 Td (1229 fileinit\(\); // file table) 161.635 Tj 0 -313.2809 Td (1230 iinit\(\); // inode cache) 166.0035 Tj 0 -322.7743 Td (1231 console_init\(\); // I/O devices & their interrupts) 249.0053 Tj 0 -332.2676 Td (1232 ide_init\(\); // disk) 135.4239 Tj 0 -341.761 Td (1233 if\(!ismp\)) 69.8962 Tj 0 -351.2543 Td (1234 timer_init\(\); // uniprocessor timer) 196.5831 Tj 0 -360.7477 Td (1235 userinit\(\); // first user process) 196.5831 Tj 0 -370.2411 Td (1236 bootothers\(\); // start other processors) 214.0572 Tj 0 -379.7344 Td (1237 ) 21.8426 Tj 0 -389.2278 Td (1238 // Finish setting up this processor in mpmain.) 231.5313 Tj 0 -398.7211 Td (1239 mpmain\(\);) 69.8962 Tj 0 -408.2145 Td (1240 }) 26.2111 Tj 0 -417.7079 Td (1241 ) 21.8426 Tj 0 -427.2012 Td (1242 ) 21.8426 Tj 0 -436.6946 Td (1243 ) 21.8426 Tj 0 -446.1879 Td (1244 ) 21.8426 Tj 0 -455.6813 Td (1245 ) 21.8426 Tj 0 -465.1747 Td (1246 ) 21.8426 Tj 0 -474.668 Td (1247 ) 21.8426 Tj 0 -484.1614 Td (1248 ) 21.8426 Tj 0 -493.6547 Td (1249 ) 21.8426 Tj 0 -522.1348 Td (Sheet 12) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/main.c Page 2) 161.635 Tj 0 -28.4801 Td (1250 // Bootstrap processor gets here after setting up the hard\ ware.) 297.059 Tj 0 -37.9735 Td (1251 // Additional processors start here.) 179.1091 Tj 0 -47.4668 Td (1252 static void) 69.8962 Tj 0 -56.9602 Td (1253 mpmain\(void\)) 74.2647 Tj 0 -66.4535 Td (1254 {) 26.2111 Tj 0 -75.9469 Td (1255 cprintf\("cpu%d: mpmain\\n", cpu\(\)\);) 179.1091 Tj 0 -85.4403 Td (1256 idtinit\(\);) 74.2647 Tj 0 -94.9336 Td (1257 if\(cpu\(\) != mp_bcpu\(\)\)) 126.6869 Tj 0 -104.427 Td (1258 lapic_init\(cpu\(\)\);) 117.9499 Tj 0 -113.9203 Td (1259 setupsegs\(0\);) 87.3703 Tj 0 -123.4137 Td (1260 xchg\(&cpus[cpu\(\)].booted, 1\);) 157.2665 Tj 0 -132.9071 Td (1261 ) 21.8426 Tj 0 -142.4004 Td (1262 cprintf\("cpu%d: scheduling\\n", cpu\(\)\);) 196.5831 Tj 0 -151.8938 Td (1263 scheduler\(\);) 83.0018 Tj 0 -161.3871 Td (1264 }) 26.2111 Tj 0 -170.8805 Td (1265 ) 21.8426 Tj 0 -180.3739 Td (1266 static void) 69.8962 Tj 0 -189.8672 Td (1267 bootothers\(void\)) 91.7388 Tj 0 -199.3606 Td (1268 {) 26.2111 Tj 0 -208.8539 Td (1269 extern uchar _binary_bootother_start[], _binary_bootothe\ r_size[];) 314.533 Tj 0 -218.3473 Td (1270 uchar *code;) 83.0018 Tj 0 -227.8407 Td (1271 struct cpu *c;) 91.7388 Tj 0 -237.334 Td (1272 char *stack;) 83.0018 Tj 0 -246.8274 Td (1273 ) 21.8426 Tj 0 -256.3207 Td (1274 // Write bootstrap code to unused memory at 0x7000.) 253.3738 Tj 0 -265.8141 Td (1275 code = \(uchar*\)0x7000;) 126.6869 Tj 0 -275.3075 Td (1276 memmove\(code, _binary_bootother_start, \(uint\)_binary_\ bootother_size\);) 332.0071 Tj 0 -284.8008 Td (1277 ) 21.8426 Tj 0 -294.2942 Td (1278 for\(c = cpus; c < cpus+ncpu; c++\){) 179.1091 Tj 0 -303.7875 Td (1279 if\(c == cpus+cpu\(\)\) // We've started already.) 240.2683 Tj 0 -313.2809 Td (1280 continue;) 87.3703 Tj 0 -322.7743 Td (1281 ) 21.8426 Tj 0 -332.2676 Td (1282 // Fill in %esp, %eip and start code on cpu.) 231.5313 Tj 0 -341.761 Td (1283 stack = kalloc\(KSTACKSIZE\);) 157.2665 Tj 0 -351.2543 Td (1284 *\(void**\)\(code-4\) = stack + KSTACKSIZE;) 209.6887 Tj 0 -360.7477 Td (1285 *\(void**\)\(code-8\) = mpmain;) 157.2665 Tj 0 -370.2411 Td (1286 lapic_startap\(c->apicid, \(uint\)code\);) 200.9517 Tj 0 -379.7344 Td (1287 ) 21.8426 Tj 0 -389.2278 Td (1288 // Wait for cpu to get through bootstrap.) 218.4257 Tj 0 -398.7211 Td (1289 while\(c->booted == 0\)) 131.0554 Tj 0 -408.2145 Td (1290 ;) 52.4222 Tj 0 -417.7079 Td (1291 }) 34.9481 Tj 0 -427.2012 Td (1292 }) 26.2111 Tj 0 -436.6946 Td (1293 ) 21.8426 Tj 0 -446.1879 Td (1294 ) 21.8426 Tj 0 -455.6813 Td (1295 ) 21.8426 Tj 0 -465.1747 Td (1296 ) 21.8426 Tj 0 -474.668 Td (1297 ) 21.8426 Tj 0 -484.1614 Td (1298 ) 21.8426 Tj 0 -493.6547 Td (1299 ) 21.8426 Tj 0 -522.1348 Td (Sheet 12) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 20 20 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/spinlock.h Page 1) 179.1091 Tj 0 -28.4801 Td (1300 // Mutual exclusion lock.) 131.0554 Tj 0 -37.9735 Td (1301 struct spinlock {) 96.1073 Tj 0 -47.4668 Td (1302 uint locked; // Is the lock held?) 183.4776 Tj 0 -56.9602 Td (1303 ) 21.8426 Tj 0 -66.4535 Td (1304 // For debugging:) 104.8443 Tj 0 -75.9469 Td (1305 char *name; // Name of lock.) 166.0035 Tj 0 -85.4403 Td (1306 int cpu; // The number of the cpu holding the lock\ .) 279.5849 Tj 0 -94.9336 Td (1307 uint pcs[10]; // The call stack \(an array of program c\ ounters\)) 305.796 Tj 0 -104.427 Td (1308 // that locked the lock.) 200.9517 Tj 0 -113.9203 Td (1309 };) 30.5796 Tj 0 -123.4137 Td (1310 ) 21.8426 Tj 0 -132.9071 Td (1311 ) 21.8426 Tj 0 -142.4004 Td (1312 ) 21.8426 Tj 0 -151.8938 Td (1313 ) 21.8426 Tj 0 -161.3871 Td (1314 ) 21.8426 Tj 0 -170.8805 Td (1315 ) 21.8426 Tj 0 -180.3739 Td (1316 ) 21.8426 Tj 0 -189.8672 Td (1317 ) 21.8426 Tj 0 -199.3606 Td (1318 ) 21.8426 Tj 0 -208.8539 Td (1319 ) 21.8426 Tj 0 -218.3473 Td (1320 ) 21.8426 Tj 0 -227.8407 Td (1321 ) 21.8426 Tj 0 -237.334 Td (1322 ) 21.8426 Tj 0 -246.8274 Td (1323 ) 21.8426 Tj 0 -256.3207 Td (1324 ) 21.8426 Tj 0 -265.8141 Td (1325 ) 21.8426 Tj 0 -275.3075 Td (1326 ) 21.8426 Tj 0 -284.8008 Td (1327 ) 21.8426 Tj 0 -294.2942 Td (1328 ) 21.8426 Tj 0 -303.7875 Td (1329 ) 21.8426 Tj 0 -313.2809 Td (1330 ) 21.8426 Tj 0 -322.7743 Td (1331 ) 21.8426 Tj 0 -332.2676 Td (1332 ) 21.8426 Tj 0 -341.761 Td (1333 ) 21.8426 Tj 0 -351.2543 Td (1334 ) 21.8426 Tj 0 -360.7477 Td (1335 ) 21.8426 Tj 0 -370.2411 Td (1336 ) 21.8426 Tj 0 -379.7344 Td (1337 ) 21.8426 Tj 0 -389.2278 Td (1338 ) 21.8426 Tj 0 -398.7211 Td (1339 ) 21.8426 Tj 0 -408.2145 Td (1340 ) 21.8426 Tj 0 -417.7079 Td (1341 ) 21.8426 Tj 0 -427.2012 Td (1342 ) 21.8426 Tj 0 -436.6946 Td (1343 ) 21.8426 Tj 0 -446.1879 Td (1344 ) 21.8426 Tj 0 -455.6813 Td (1345 ) 21.8426 Tj 0 -465.1747 Td (1346 ) 21.8426 Tj 0 -474.668 Td (1347 ) 21.8426 Tj 0 -484.1614 Td (1348 ) 21.8426 Tj 0 -493.6547 Td (1349 ) 21.8426 Tj 0 -522.1348 Td (Sheet 13) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/spinlock.c Page 1) 179.1091 Tj 0 -28.4801 Td (1350 // Mutual exclusion spin locks.) 157.2665 Tj 0 -37.9735 Td (1351 ) 21.8426 Tj 0 -47.4668 Td (1352 #include "types.h") 100.4758 Tj 0 -56.9602 Td (1353 #include "defs.h") 96.1073 Tj 0 -66.4535 Td (1354 #include "param.h") 100.4758 Tj 0 -75.9469 Td (1355 #include "x86.h") 91.7388 Tj 0 -85.4403 Td (1356 #include "mmu.h") 91.7388 Tj 0 -94.9336 Td (1357 #include "proc.h") 96.1073 Tj 0 -104.427 Td (1358 #include "spinlock.h") 113.5814 Tj 0 -113.9203 Td (1359 ) 21.8426 Tj 0 -123.4137 Td (1360 extern int use_console_lock;) 144.161 Tj 0 -132.9071 Td (1361 ) 21.8426 Tj 0 -142.4004 Td (1362 void) 39.3166 Tj 0 -151.8938 Td (1363 initlock\(struct spinlock *lock, char *name\)) 209.6887 Tj 0 -161.3871 Td (1364 {) 26.2111 Tj 0 -170.8805 Td (1365 lock->name = name;) 109.2129 Tj 0 -180.3739 Td (1366 lock->locked = 0;) 104.8443 Tj 0 -189.8672 Td (1367 lock->cpu = 0xffffffff;) 131.0554 Tj 0 -199.3606 Td (1368 }) 26.2111 Tj 0 -208.8539 Td (1369 ) 21.8426 Tj 0 -218.3473 Td (1370 // Acquire the lock.) 109.2129 Tj 0 -227.8407 Td (1371 // Loops \(spins\) until the lock is acquired.) 214.0572 Tj 0 -237.334 Td (1372 // Holding a lock for a long time may cause) 209.6887 Tj 0 -246.8274 Td (1373 // other CPUs to waste time spinning to acquire it.) 244.6368 Tj 0 -256.3207 Td (1374 void) 39.3166 Tj 0 -265.8141 Td (1375 acquire\(struct spinlock *lock\)) 152.898 Tj 0 -275.3075 Td (1376 {) 26.2111 Tj 0 -284.8008 Td (1377 pushcli\(\);) 74.2647 Tj 0 -294.2942 Td (1378 if\(holding\(lock\)\)) 104.8443 Tj 0 -303.7875 Td (1379 panic\("acquire"\);) 113.5814 Tj 0 -313.2809 Td (1380 ) 21.8426 Tj 0 -322.7743 Td (1381 // The xchg is atomic.) 126.6869 Tj 0 -332.2676 Td (1382 // It also serializes, so that reads after acquire are n\ ot) 283.9534 Tj 0 -341.761 Td (1383 // reordered before it.) 131.0554 Tj 0 -351.2543 Td (1384 while\(xchg\(&lock->locked, 1\) == 1\)) 179.1091 Tj 0 -360.7477 Td (1385 ;) 43.6851 Tj 0 -370.2411 Td (1386 ) 21.8426 Tj 0 -379.7344 Td (1387 // Record info about lock acquisition for debugging.) 257.7424 Tj 0 -389.2278 Td (1388 // The +10 is only so that we can tell the difference) 262.1109 Tj 0 -398.7211 Td (1389 // between forgetting to initialize lock->cpu) 227.1628 Tj 0 -408.2145 Td (1390 // and holding a lock on cpu 0.) 166.0035 Tj 0 -417.7079 Td (1391 lock->cpu = cpu\(\) + 10;) 131.0554 Tj 0 -427.2012 Td (1392 getcallerpcs\(&lock, lock->pcs\);) 166.0035 Tj 0 -436.6946 Td (1393 }) 26.2111 Tj 0 -446.1879 Td (1394 ) 21.8426 Tj 0 -455.6813 Td (1395 ) 21.8426 Tj 0 -465.1747 Td (1396 ) 21.8426 Tj 0 -474.668 Td (1397 ) 21.8426 Tj 0 -484.1614 Td (1398 ) 21.8426 Tj 0 -493.6547 Td (1399 ) 21.8426 Tj 0 -522.1348 Td (Sheet 13) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 21 21 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/spinlock.c Page 2) 179.1091 Tj 0 -28.4801 Td (1400 // Release the lock.) 109.2129 Tj 0 -37.9735 Td (1401 void) 39.3166 Tj 0 -47.4668 Td (1402 release\(struct spinlock *lock\)) 152.898 Tj 0 -56.9602 Td (1403 {) 26.2111 Tj 0 -66.4535 Td (1404 if\(!holding\(lock\)\)) 109.2129 Tj 0 -75.9469 Td (1405 panic\("release"\);) 113.5814 Tj 0 -85.4403 Td (1406 ) 21.8426 Tj 0 -94.9336 Td (1407 lock->pcs[0] = 0;) 104.8443 Tj 0 -104.427 Td (1408 lock->cpu = 0xffffffff;) 131.0554 Tj 0 -113.9203 Td (1409 ) 21.8426 Tj 0 -123.4137 Td (1410 // The xchg serializes, so that reads before release are) 275.2164 Tj 0 -132.9071 Td (1411 // not reordered after it. \(This reordering would be a\ llowed) 297.059 Tj 0 -142.4004 Td (1412 // by the Intel manuals, but does not happen on current) 270.8479 Tj 0 -151.8938 Td (1413 // Intel processors. The xchg being asm volatile also k\ eeps) 292.6905 Tj 0 -161.3871 Td (1414 // gcc from delaying the above assignments.\)) 222.7942 Tj 0 -170.8805 Td (1415 xchg\(&lock->locked, 0\);) 131.0554 Tj 0 -180.3739 Td (1416 ) 21.8426 Tj 0 -189.8672 Td (1417 popcli\(\);) 69.8962 Tj 0 -199.3606 Td (1418 }) 26.2111 Tj 0 -208.8539 Td (1419 ) 21.8426 Tj 0 -218.3473 Td (1420 // Record the current call stack in pcs[] by following the\ %ebp chain.) 327.6386 Tj 0 -227.8407 Td (1421 void) 39.3166 Tj 0 -237.334 Td (1422 getcallerpcs\(void *v, uint pcs[]\)) 166.0035 Tj 0 -246.8274 Td (1423 {) 26.2111 Tj 0 -256.3207 Td (1424 uint *ebp;) 74.2647 Tj 0 -265.8141 Td (1425 int i;) 56.7907 Tj 0 -275.3075 Td (1426 ) 21.8426 Tj 0 -284.8008 Td (1427 ebp = \(uint*\)v - 2;) 113.5814 Tj 0 -294.2942 Td (1428 for\(i = 0; i < 10; i++\){) 135.4239 Tj 0 -303.7875 Td (1429 if\(ebp == 0 || ebp == \(uint*\)0xffffffff\)) 214.0572 Tj 0 -313.2809 Td (1430 break;) 74.2647 Tj 0 -322.7743 Td (1431 pcs[i] = ebp[1]; // saved %eip) 187.8461 Tj 0 -332.2676 Td (1432 ebp = \(uint*\)ebp[0]; // saved %ebp) 187.8461 Tj 0 -341.761 Td (1433 }) 34.9481 Tj 0 -351.2543 Td (1434 for\(; i < 10; i++\)) 109.2129 Tj 0 -360.7477 Td (1435 pcs[i] = 0;) 87.3703 Tj 0 -370.2411 Td (1436 }) 26.2111 Tj 0 -379.7344 Td (1437 ) 21.8426 Tj 0 -389.2278 Td (1438 // Check whether this cpu is holding the lock.) 222.7942 Tj 0 -398.7211 Td (1439 int) 34.9481 Tj 0 -408.2145 Td (1440 holding\(struct spinlock *lock\)) 152.898 Tj 0 -417.7079 Td (1441 {) 26.2111 Tj 0 -427.2012 Td (1442 return lock->locked && lock->cpu == cpu\(\) + 10;) 235.8998 Tj 0 -436.6946 Td (1443 }) 26.2111 Tj 0 -446.1879 Td (1444 ) 21.8426 Tj 0 -455.6813 Td (1445 ) 21.8426 Tj 0 -465.1747 Td (1446 ) 21.8426 Tj 0 -474.668 Td (1447 ) 21.8426 Tj 0 -484.1614 Td (1448 ) 21.8426 Tj 0 -493.6547 Td (1449 ) 21.8426 Tj 0 -522.1348 Td (Sheet 14) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/spinlock.c Page 3) 179.1091 Tj 0 -28.4801 Td (1450 // Pushcli/popcli are like cli/sti except that they are ma\ tched:) 301.4275 Tj 0 -37.9735 Td (1451 // it takes two popcli to undo two pushcli. Also, if inte\ rrupts) 301.4275 Tj 0 -47.4668 Td (1452 // are off, then pushcli, popcli leaves them off.) 235.8998 Tj 0 -56.9602 Td (1453 ) 21.8426 Tj 0 -66.4535 Td (1454 void) 39.3166 Tj 0 -75.9469 Td (1455 pushcli\(void\)) 78.6333 Tj 0 -85.4403 Td (1456 {) 26.2111 Tj 0 -94.9336 Td (1457 int eflags;) 78.6333 Tj 0 -104.427 Td (1458 ) 21.8426 Tj 0 -113.9203 Td (1459 eflags = read_eflags\(\);) 131.0554 Tj 0 -123.4137 Td (1460 cli\(\);) 56.7907 Tj 0 -132.9071 Td (1461 if\(cpus[cpu\(\)].ncli++ == 0\)) 148.5295 Tj 0 -142.4004 Td (1462 cpus[cpu\(\)].intena = eflags & FL_IF;) 196.5831 Tj 0 -151.8938 Td (1463 }) 26.2111 Tj 0 -161.3871 Td (1464 ) 21.8426 Tj 0 -170.8805 Td (1465 void) 39.3166 Tj 0 -180.3739 Td (1466 popcli\(void\)) 74.2647 Tj 0 -189.8672 Td (1467 {) 26.2111 Tj 0 -199.3606 Td (1468 if\(read_eflags\(\)&FL_IF\)) 131.0554 Tj 0 -208.8539 Td (1469 panic\("popcli - interruptible"\);) 179.1091 Tj 0 -218.3473 Td (1470 if\(--cpus[cpu\(\)].ncli < 0\)) 144.161 Tj 0 -227.8407 Td (1471 panic\("popcli"\);) 109.2129 Tj 0 -237.334 Td (1472 if\(cpus[cpu\(\)].ncli == 0 && cpus[cpu\(\)].intena\)) 235.8998 Tj 0 -246.8274 Td (1473 sti\(\);) 65.5277 Tj 0 -256.3207 Td (1474 }) 26.2111 Tj 0 -265.8141 Td (1475 ) 21.8426 Tj 0 -275.3075 Td (1476 ) 21.8426 Tj 0 -284.8008 Td (1477 ) 21.8426 Tj 0 -294.2942 Td (1478 ) 21.8426 Tj 0 -303.7875 Td (1479 ) 21.8426 Tj 0 -313.2809 Td (1480 ) 21.8426 Tj 0 -322.7743 Td (1481 ) 21.8426 Tj 0 -332.2676 Td (1482 ) 21.8426 Tj 0 -341.761 Td (1483 ) 21.8426 Tj 0 -351.2543 Td (1484 ) 21.8426 Tj 0 -360.7477 Td (1485 ) 21.8426 Tj 0 -370.2411 Td (1486 ) 21.8426 Tj 0 -379.7344 Td (1487 ) 21.8426 Tj 0 -389.2278 Td (1488 ) 21.8426 Tj 0 -398.7211 Td (1489 ) 21.8426 Tj 0 -408.2145 Td (1490 ) 21.8426 Tj 0 -417.7079 Td (1491 ) 21.8426 Tj 0 -427.2012 Td (1492 ) 21.8426 Tj 0 -436.6946 Td (1493 ) 21.8426 Tj 0 -446.1879 Td (1494 ) 21.8426 Tj 0 -455.6813 Td (1495 ) 21.8426 Tj 0 -465.1747 Td (1496 ) 21.8426 Tj 0 -474.668 Td (1497 ) 21.8426 Tj 0 -484.1614 Td (1498 ) 21.8426 Tj 0 -493.6547 Td (1499 ) 21.8426 Tj 0 -522.1348 Td (Sheet 14) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 22 22 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/proc.h Page 1) 161.635 Tj 0 -28.4801 Td (1500 // Segments in proc->gdt) 126.6869 Tj 0 -37.9735 Td (1501 #define SEG_KCODE 1 // kernel code) 174.7406 Tj 0 -47.4668 Td (1502 #define SEG_KDATA 2 // kernel data+stack) 200.9517 Tj 0 -56.9602 Td (1503 #define SEG_UCODE 3) 104.8443 Tj 0 -66.4535 Td (1504 #define SEG_UDATA 4) 104.8443 Tj 0 -75.9469 Td (1505 #define SEG_TSS 5 // this process's task state) 235.8998 Tj 0 -85.4403 Td (1506 #define NSEGS 6) 104.8443 Tj 0 -94.9336 Td (1507 ) 21.8426 Tj 0 -104.427 Td (1508 // Saved registers for kernel context switches.) 227.1628 Tj 0 -113.9203 Td (1509 // Don't need to save all the %fs etc. segment registers,) 270.8479 Tj 0 -123.4137 Td (1510 // because they are constant across kernel contexts.) 249.0053 Tj 0 -132.9071 Td (1511 // Save all the regular registers so we don't need to care) 275.2164 Tj 0 -142.4004 Td (1512 // which are caller save, but not the return register %eax\ .) 279.5849 Tj 0 -151.8938 Td (1513 // \(Not saving %eax just simplifies the switching code.\)) 266.4794 Tj 0 -161.3871 Td (1514 // The layout of context must match code in swtch.S.) 249.0053 Tj 0 -170.8805 Td (1515 struct context {) 91.7388 Tj 0 -180.3739 Td (1516 int eip;) 65.5277 Tj 0 -189.8672 Td (1517 int esp;) 65.5277 Tj 0 -199.3606 Td (1518 int ebx;) 65.5277 Tj 0 -208.8539 Td (1519 int ecx;) 65.5277 Tj 0 -218.3473 Td (1520 int edx;) 65.5277 Tj 0 -227.8407 Td (1521 int esi;) 65.5277 Tj 0 -237.334 Td (1522 int edi;) 65.5277 Tj 0 -246.8274 Td (1523 int ebp;) 65.5277 Tj 0 -256.3207 Td (1524 };) 30.5796 Tj 0 -265.8141 Td (1525 ) 21.8426 Tj 0 -275.3075 Td (1526 enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNN\ ING, ZOMBIE };) 336.3756 Tj 0 -284.8008 Td (1527 ) 21.8426 Tj 0 -294.2942 Td (1528 // Per-process state) 109.2129 Tj 0 -303.7875 Td (1529 struct proc {) 78.6333 Tj 0 -313.2809 Td (1530 char *mem; // Start of process memory \(k\ ernel address\)) 332.0071 Tj 0 -322.7743 Td (1531 uint sz; // Size of process memory \(by\ tes\)) 288.322 Tj 0 -332.2676 Td (1532 char *kstack; // Bottom of kernel stack for \ this process) 327.6386 Tj 0 -341.761 Td (1533 enum proc_state state; // Process state) 214.0572 Tj 0 -351.2543 Td (1534 int pid; // Process ID) 200.9517 Tj 0 -360.7477 Td (1535 struct proc *parent; // Parent process) 218.4257 Tj 0 -370.2411 Td (1536 void *chan; // If non-zero, sleeping on ch\ an) 283.9534 Tj 0 -379.7344 Td (1537 int killed; // If non-zero, have been kill\ ed) 283.9534 Tj 0 -389.2278 Td (1538 struct file *ofile[NOFILE]; // Open files) 214.0572 Tj 0 -398.7211 Td (1539 struct inode *cwd; // Current directory) 231.5313 Tj 0 -408.2145 Td (1540 struct context context; // Switch here to run process) 270.8479 Tj 0 -417.7079 Td (1541 struct trapframe *tf; // Trap frame for current inte\ rrupt) 297.059 Tj 0 -427.2012 Td (1542 char name[16]; // Process name \(debugging\)) 262.1109 Tj 0 -436.6946 Td (1543 };) 30.5796 Tj 0 -446.1879 Td (1544 ) 21.8426 Tj 0 -455.6813 Td (1545 ) 21.8426 Tj 0 -465.1747 Td (1546 ) 21.8426 Tj 0 -474.668 Td (1547 ) 21.8426 Tj 0 -484.1614 Td (1548 ) 21.8426 Tj 0 -493.6547 Td (1549 ) 21.8426 Tj 0 -522.1348 Td (Sheet 15) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:04 2008 xv6/proc.h Page 2) 161.635 Tj 0 -28.4801 Td (1550 // Process memory is laid out contiguously, low addresses \ first:) 301.4275 Tj 0 -37.9735 Td (1551 // text) 61.1592 Tj 0 -47.4668 Td (1552 // original data and bss) 135.4239 Tj 0 -56.9602 Td (1553 // fixed-size stack) 113.5814 Tj 0 -66.4535 Td (1554 // expandable heap) 109.2129 Tj 0 -75.9469 Td (1555 ) 21.8426 Tj 0 -85.4403 Td (1556 // Per-CPU state) 91.7388 Tj 0 -94.9336 Td (1557 struct cpu {) 74.2647 Tj 0 -104.427 Td (1558 uchar apicid; // Local APIC ID) 222.7942 Tj 0 -113.9203 Td (1559 struct proc *curproc; // Process currently running\ .) 279.5849 Tj 0 -123.4137 Td (1560 struct context context; // Switch here to enter sche\ duler) 297.059 Tj 0 -132.9071 Td (1561 struct taskstate ts; // Used by x86 to find stack\ for interrupt) 336.3756 Tj 0 -142.4004 Td (1562 struct segdesc gdt[NSEGS]; // x86 global descriptor tab\ le) 283.9534 Tj 0 -151.8938 Td (1563 volatile uint booted; // Has the CPU started?) 257.7424 Tj 0 -161.3871 Td (1564 int ncli; // Depth of pushcli nesting.) 275.2164 Tj 0 -170.8805 Td (1565 int intena; // Were interrupts enabled b\ efore pushcli?) 336.3756 Tj 0 -180.3739 Td (1566 };) 30.5796 Tj 0 -189.8672 Td (1567 ) 21.8426 Tj 0 -199.3606 Td (1568 extern struct cpu cpus[NCPU];) 148.5295 Tj 0 -208.8539 Td (1569 extern int ncpu;) 91.7388 Tj 0 -218.3473 Td (1570 ) 21.8426 Tj 0 -227.8407 Td (1571 // "cp" is a short alias for curproc\(\).) 192.2146 Tj 0 -237.334 Td (1572 // It gets used enough to make this worthwhile.) 227.1628 Tj 0 -246.8274 Td (1573 #define cp curproc\(\)) 109.2129 Tj 0 -256.3207 Td (1574 ) 21.8426 Tj 0 -265.8141 Td (1575 ) 21.8426 Tj 0 -275.3075 Td (1576 ) 21.8426 Tj 0 -284.8008 Td (1577 ) 21.8426 Tj 0 -294.2942 Td (1578 ) 21.8426 Tj 0 -303.7875 Td (1579 ) 21.8426 Tj 0 -313.2809 Td (1580 ) 21.8426 Tj 0 -322.7743 Td (1581 ) 21.8426 Tj 0 -332.2676 Td (1582 ) 21.8426 Tj 0 -341.761 Td (1583 ) 21.8426 Tj 0 -351.2543 Td (1584 ) 21.8426 Tj 0 -360.7477 Td (1585 ) 21.8426 Tj 0 -370.2411 Td (1586 ) 21.8426 Tj 0 -379.7344 Td (1587 ) 21.8426 Tj 0 -389.2278 Td (1588 ) 21.8426 Tj 0 -398.7211 Td (1589 ) 21.8426 Tj 0 -408.2145 Td (1590 ) 21.8426 Tj 0 -417.7079 Td (1591 ) 21.8426 Tj 0 -427.2012 Td (1592 ) 21.8426 Tj 0 -436.6946 Td (1593 ) 21.8426 Tj 0 -446.1879 Td (1594 ) 21.8426 Tj 0 -455.6813 Td (1595 ) 21.8426 Tj 0 -465.1747 Td (1596 ) 21.8426 Tj 0 -474.668 Td (1597 ) 21.8426 Tj 0 -484.1614 Td (1598 ) 21.8426 Tj 0 -493.6547 Td (1599 ) 21.8426 Tj 0 -522.1348 Td (Sheet 15) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 23 23 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/proc.c Page 1) 161.635 Tj 0 -28.4801 Td (1600 #include "types.h") 100.4758 Tj 0 -37.9735 Td (1601 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (1602 #include "param.h") 100.4758 Tj 0 -56.9602 Td (1603 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (1604 #include "x86.h") 91.7388 Tj 0 -75.9469 Td (1605 #include "proc.h") 96.1073 Tj 0 -85.4403 Td (1606 #include "spinlock.h") 113.5814 Tj 0 -94.9336 Td (1607 ) 21.8426 Tj 0 -104.427 Td (1608 struct spinlock proc_table_lock;) 161.635 Tj 0 -113.9203 Td (1609 ) 21.8426 Tj 0 -123.4137 Td (1610 struct proc proc[NPROC];) 126.6869 Tj 0 -132.9071 Td (1611 static struct proc *initproc;) 148.5295 Tj 0 -142.4004 Td (1612 ) 21.8426 Tj 0 -151.8938 Td (1613 int nextpid = 1;) 91.7388 Tj 0 -161.3871 Td (1614 extern void forkret\(void\);) 135.4239 Tj 0 -170.8805 Td (1615 extern void forkret1\(struct trapframe*\);) 196.5831 Tj 0 -180.3739 Td (1616 ) 21.8426 Tj 0 -189.8672 Td (1617 void) 39.3166 Tj 0 -199.3606 Td (1618 pinit\(void\)) 69.8962 Tj 0 -208.8539 Td (1619 {) 26.2111 Tj 0 -218.3473 Td (1620 initlock\(&proc_table_lock, "proc_table"\);) 209.6887 Tj 0 -227.8407 Td (1621 }) 26.2111 Tj 0 -237.334 Td (1622 ) 21.8426 Tj 0 -246.8274 Td (1623 // Look in the process table for an UNUSED proc.) 231.5313 Tj 0 -256.3207 Td (1624 // If found, change state to EMBRYO and return it.) 240.2683 Tj 0 -265.8141 Td (1625 // Otherwise return 0.) 117.9499 Tj 0 -275.3075 Td (1626 static struct proc*) 104.8443 Tj 0 -284.8008 Td (1627 allocproc\(void\)) 87.3703 Tj 0 -294.2942 Td (1628 {) 26.2111 Tj 0 -303.7875 Td (1629 int i;) 56.7907 Tj 0 -313.2809 Td (1630 struct proc *p;) 96.1073 Tj 0 -322.7743 Td (1631 ) 21.8426 Tj 0 -332.2676 Td (1632 acquire\(&proc_table_lock\);) 144.161 Tj 0 -341.761 Td (1633 for\(i = 0; i < NPROC; i++\){) 148.5295 Tj 0 -351.2543 Td (1634 p = &proc[i];) 96.1073 Tj 0 -360.7477 Td (1635 if\(p->state == UNUSED\){) 139.7925 Tj 0 -370.2411 Td (1636 p->state = EMBRYO;) 126.6869 Tj 0 -379.7344 Td (1637 p->pid = nextpid++;) 131.0554 Tj 0 -389.2278 Td (1638 release\(&proc_table_lock\);) 161.635 Tj 0 -398.7211 Td (1639 return p;) 87.3703 Tj 0 -408.2145 Td (1640 }) 43.6851 Tj 0 -417.7079 Td (1641 }) 34.9481 Tj 0 -427.2012 Td (1642 release\(&proc_table_lock\);) 144.161 Tj 0 -436.6946 Td (1643 return 0;) 69.8962 Tj 0 -446.1879 Td (1644 }) 26.2111 Tj 0 -455.6813 Td (1645 ) 21.8426 Tj 0 -465.1747 Td (1646 ) 21.8426 Tj 0 -474.668 Td (1647 ) 21.8426 Tj 0 -484.1614 Td (1648 ) 21.8426 Tj 0 -493.6547 Td (1649 ) 21.8426 Tj 0 -522.1348 Td (Sheet 16) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/proc.c Page 2) 161.635 Tj 0 -28.4801 Td (1650 // Grow current process's memory by n bytes.) 214.0572 Tj 0 -37.9735 Td (1651 // Return old size on success, -1 on failure.) 218.4257 Tj 0 -47.4668 Td (1652 int) 34.9481 Tj 0 -56.9602 Td (1653 growproc\(int n\)) 87.3703 Tj 0 -66.4535 Td (1654 {) 26.2111 Tj 0 -75.9469 Td (1655 char *newmem;) 87.3703 Tj 0 -85.4403 Td (1656 ) 21.8426 Tj 0 -94.9336 Td (1657 newmem = kalloc\(cp->sz + n\);) 152.898 Tj 0 -104.427 Td (1658 if\(newmem == 0\)) 96.1073 Tj 0 -113.9203 Td (1659 return -1;) 83.0018 Tj 0 -123.4137 Td (1660 memmove\(newmem, cp->mem, cp->sz\);) 174.7406 Tj 0 -132.9071 Td (1661 memset\(newmem + cp->sz, 0, n\);) 161.635 Tj 0 -142.4004 Td (1662 kfree\(cp->mem, cp->sz\);) 131.0554 Tj 0 -151.8938 Td (1663 cp->mem = newmem;) 104.8443 Tj 0 -161.3871 Td (1664 cp->sz += n;) 83.0018 Tj 0 -170.8805 Td (1665 setupsegs\(cp\);) 91.7388 Tj 0 -180.3739 Td (1666 return cp->sz - n;) 109.2129 Tj 0 -189.8672 Td (1667 }) 26.2111 Tj 0 -199.3606 Td (1668 ) 21.8426 Tj 0 -208.8539 Td (1669 // Set up CPU's segment descriptors and task state for a g\ iven process.) 332.0071 Tj 0 -218.3473 Td (1670 // If p==0, set up for "idle" state for when scheduler\(\)\ is running.) 318.9016 Tj 0 -227.8407 Td (1671 void) 39.3166 Tj 0 -237.334 Td (1672 setupsegs\(struct proc *p\)) 131.0554 Tj 0 -246.8274 Td (1673 {) 26.2111 Tj 0 -256.3207 Td (1674 struct cpu *c;) 91.7388 Tj 0 -265.8141 Td (1675 ) 21.8426 Tj 0 -275.3075 Td (1676 pushcli\(\);) 74.2647 Tj 0 -284.8008 Td (1677 c = &cpus[cpu\(\)];) 104.8443 Tj 0 -294.2942 Td (1678 c->ts.ss0 = SEG_KDATA << 3;) 148.5295 Tj 0 -303.7875 Td (1679 if\(p\)) 52.4222 Tj 0 -313.2809 Td (1680 c->ts.esp0 = \(uint\)\(p->kstack + KSTACKSIZE\);) 231.5313 Tj 0 -322.7743 Td (1681 else) 48.0537 Tj 0 -332.2676 Td (1682 c->ts.esp0 = 0xffffffff;) 144.161 Tj 0 -341.761 Td (1683 ) 21.8426 Tj 0 -351.2543 Td (1684 c->gdt[0] = SEG_NULL;) 122.3184 Tj 0 -360.7477 Td (1685 c->gdt[SEG_KCODE] = SEG\(STA_X|STA_R, 0, 0x100000 + 64*1\ 024-1, 0\);) 314.533 Tj 0 -370.2411 Td (1686 c->gdt[SEG_KDATA] = SEG\(STA_W, 0, 0xffffffff, 0\);) 244.6368 Tj 0 -379.7344 Td (1687 c->gdt[SEG_TSS] = SEG16\(STS_T32A, \(uint\)&c->ts, sizeo\ f\(c->ts\)-1, 0\);) 327.6386 Tj 0 -389.2278 Td (1688 c->gdt[SEG_TSS].s = 0;) 126.6869 Tj 0 -398.7211 Td (1689 if\(p\){) 56.7907 Tj 0 -408.2145 Td (1690 c->gdt[SEG_UCODE] = SEG\(STA_X|STA_R, \(uint\)p->mem, \ p->sz-1, DPL_USER\);) 345.1126 Tj 0 -417.7079 Td (1691 c->gdt[SEG_UDATA] = SEG\(STA_W, \(uint\)p->mem, p->sz-\ 1, DPL_USER\);) 318.9016 Tj 0 -427.2012 Td (1692 } else {) 65.5277 Tj 0 -436.6946 Td (1693 c->gdt[SEG_UCODE] = SEG_NULL;) 166.0035 Tj 0 -446.1879 Td (1694 c->gdt[SEG_UDATA] = SEG_NULL;) 166.0035 Tj 0 -455.6813 Td (1695 }) 34.9481 Tj 0 -465.1747 Td (1696 ) 21.8426 Tj 0 -474.668 Td (1697 ) 21.8426 Tj 0 -484.1614 Td (1698 ) 21.8426 Tj 0 -493.6547 Td (1699 ) 21.8426 Tj 0 -522.1348 Td (Sheet 16) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 24 24 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/proc.c Page 3) 161.635 Tj 0 -28.4801 Td (1700 lgdt\(c->gdt, sizeof\(c->gdt\)\);) 157.2665 Tj 0 -37.9735 Td (1701 ltr\(SEG_TSS << 3\);) 109.2129 Tj 0 -47.4668 Td (1702 popcli\(\);) 69.8962 Tj 0 -56.9602 Td (1703 }) 26.2111 Tj 0 -66.4535 Td (1704 ) 21.8426 Tj 0 -75.9469 Td (1705 // Create a new process copying p as the parent.) 231.5313 Tj 0 -85.4403 Td (1706 // Sets up stack to return as if from system call.) 240.2683 Tj 0 -94.9336 Td (1707 // Caller must set state of returned proc to RUNNABLE.) 257.7424 Tj 0 -104.427 Td (1708 struct proc*) 74.2647 Tj 0 -113.9203 Td (1709 copyproc\(struct proc *p\)) 126.6869 Tj 0 -123.4137 Td (1710 {) 26.2111 Tj 0 -132.9071 Td (1711 int i;) 56.7907 Tj 0 -142.4004 Td (1712 struct proc *np;) 100.4758 Tj 0 -151.8938 Td (1713 ) 21.8426 Tj 0 -161.3871 Td (1714 // Allocate process.) 117.9499 Tj 0 -170.8805 Td (1715 if\(\(np = allocproc\(\)\) == 0\)) 148.5295 Tj 0 -180.3739 Td (1716 return 0;) 78.6333 Tj 0 -189.8672 Td (1717 ) 21.8426 Tj 0 -199.3606 Td (1718 // Allocate kernel stack.) 139.7925 Tj 0 -208.8539 Td (1719 if\(\(np->kstack = kalloc\(KSTACKSIZE\)\) == 0\){) 218.4257 Tj 0 -218.3473 Td (1720 np->state = UNUSED;) 122.3184 Tj 0 -227.8407 Td (1721 return 0;) 78.6333 Tj 0 -237.334 Td (1722 }) 34.9481 Tj 0 -246.8274 Td (1723 np->tf = \(struct trapframe*\)\(np->kstack + KSTACKSIZE\)\ - 1;) 283.9534 Tj 0 -256.3207 Td (1724 ) 21.8426 Tj 0 -265.8141 Td (1725 if\(p\){ // Copy process state from p.) 192.2146 Tj 0 -275.3075 Td (1726 np->parent = p;) 104.8443 Tj 0 -284.8008 Td (1727 memmove\(np->tf, p->tf, sizeof\(*np->tf\)\);) 214.0572 Tj 0 -294.2942 Td (1728 ) 21.8426 Tj 0 -303.7875 Td (1729 np->sz = p->sz;) 104.8443 Tj 0 -313.2809 Td (1730 if\(\(np->mem = kalloc\(np->sz\)\) == 0\){) 196.5831 Tj 0 -322.7743 Td (1731 kfree\(np->kstack, KSTACKSIZE\);) 179.1091 Tj 0 -332.2676 Td (1732 np->kstack = 0;) 113.5814 Tj 0 -341.761 Td (1733 np->state = UNUSED;) 131.0554 Tj 0 -351.2543 Td (1734 np->parent = 0;) 113.5814 Tj 0 -360.7477 Td (1735 return 0;) 87.3703 Tj 0 -370.2411 Td (1736 }) 43.6851 Tj 0 -379.7344 Td (1737 memmove\(np->mem, p->mem, np->sz\);) 183.4776 Tj 0 -389.2278 Td (1738 ) 21.8426 Tj 0 -398.7211 Td (1739 for\(i = 0; i < NOFILE; i++\)) 157.2665 Tj 0 -408.2145 Td (1740 if\(p->ofile[i]\)) 113.5814 Tj 0 -417.7079 Td (1741 np->ofile[i] = filedup\(p->ofile[i]\);) 214.0572 Tj 0 -427.2012 Td (1742 np->cwd = idup\(p->cwd\);) 139.7925 Tj 0 -436.6946 Td (1743 }) 34.9481 Tj 0 -446.1879 Td (1744 ) 21.8426 Tj 0 -455.6813 Td (1745 // Set up new context to start executing at forkret \(se\ e below\).) 310.1645 Tj 0 -465.1747 Td (1746 memset\(&np->context, 0, sizeof\(np->context\)\);) 227.1628 Tj 0 -474.668 Td (1747 np->context.eip = \(uint\)forkret;) 170.3721 Tj 0 -484.1614 Td (1748 np->context.esp = \(uint\)np->tf;) 166.0035 Tj 0 -493.6547 Td (1749 ) 21.8426 Tj 0 -522.1348 Td (Sheet 17) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/proc.c Page 4) 161.635 Tj 0 -28.4801 Td (1750 // Clear %eax so that fork system call returns 0 in chil\ d.) 283.9534 Tj 0 -37.9735 Td (1751 np->tf->eax = 0;) 100.4758 Tj 0 -47.4668 Td (1752 return np;) 74.2647 Tj 0 -56.9602 Td (1753 }) 26.2111 Tj 0 -66.4535 Td (1754 ) 21.8426 Tj 0 -75.9469 Td (1755 // Set up first user process.) 148.5295 Tj 0 -85.4403 Td (1756 void) 39.3166 Tj 0 -94.9336 Td (1757 userinit\(void\)) 83.0018 Tj 0 -104.427 Td (1758 {) 26.2111 Tj 0 -113.9203 Td (1759 struct proc *p;) 96.1073 Tj 0 -123.4137 Td (1760 extern uchar _binary_initcode_start[], _binary_initcode_\ size[];) 305.796 Tj 0 -132.9071 Td (1761 ) 21.8426 Tj 0 -142.4004 Td (1762 p = copyproc\(0\);) 100.4758 Tj 0 -151.8938 Td (1763 p->sz = PAGE;) 87.3703 Tj 0 -161.3871 Td (1764 p->mem = kalloc\(p->sz\);) 131.0554 Tj 0 -170.8805 Td (1765 p->cwd = namei\("/"\);) 117.9499 Tj 0 -180.3739 Td (1766 memset\(p->tf, 0, sizeof\(*p->tf\)\);) 174.7406 Tj 0 -189.8672 Td (1767 p->tf->cs = \(SEG_UCODE << 3\) | DPL_USER;) 205.3202 Tj 0 -199.3606 Td (1768 p->tf->ds = \(SEG_UDATA << 3\) | DPL_USER;) 205.3202 Tj 0 -208.8539 Td (1769 p->tf->es = p->tf->ds;) 126.6869 Tj 0 -218.3473 Td (1770 p->tf->ss = p->tf->ds;) 126.6869 Tj 0 -227.8407 Td (1771 p->tf->eflags = FL_IF;) 126.6869 Tj 0 -237.334 Td (1772 p->tf->esp = p->sz;) 113.5814 Tj 0 -246.8274 Td (1773 ) 21.8426 Tj 0 -256.3207 Td (1774 // Make return address readable; needed for some gcc.) 262.1109 Tj 0 -265.8141 Td (1775 p->tf->esp -= 4;) 100.4758 Tj 0 -275.3075 Td (1776 *\(uint*\)\(p->mem + p->tf->esp\) = 0xefefefef;) 218.4257 Tj 0 -284.8008 Td (1777 ) 21.8426 Tj 0 -294.2942 Td (1778 // On entry to user space, start executing at beginning \ of initcode.S.) 336.3756 Tj 0 -303.7875 Td (1779 p->tf->eip = 0;) 96.1073 Tj 0 -313.2809 Td (1780 memmove\(p->mem, _binary_initcode_start, \(int\)_binary_\ initcode_size\);) 327.6386 Tj 0 -322.7743 Td (1781 safestrcpy\(p->name, "initcode", sizeof\(p->name\)\);) 244.6368 Tj 0 -332.2676 Td (1782 p->state = RUNNABLE;) 117.9499 Tj 0 -341.761 Td (1783 ) 21.8426 Tj 0 -351.2543 Td (1784 initproc = p;) 87.3703 Tj 0 -360.7477 Td (1785 }) 26.2111 Tj 0 -370.2411 Td (1786 ) 21.8426 Tj 0 -379.7344 Td (1787 // Return currently running process.) 179.1091 Tj 0 -389.2278 Td (1788 struct proc*) 74.2647 Tj 0 -398.7211 Td (1789 curproc\(void\)) 78.6333 Tj 0 -408.2145 Td (1790 {) 26.2111 Tj 0 -417.7079 Td (1791 struct proc *p;) 96.1073 Tj 0 -427.2012 Td (1792 ) 21.8426 Tj 0 -436.6946 Td (1793 pushcli\(\);) 74.2647 Tj 0 -446.1879 Td (1794 p = cpus[cpu\(\)].curproc;) 135.4239 Tj 0 -455.6813 Td (1795 popcli\(\);) 69.8962 Tj 0 -465.1747 Td (1796 return p;) 69.8962 Tj 0 -474.668 Td (1797 }) 26.2111 Tj 0 -484.1614 Td (1798 ) 21.8426 Tj 0 -493.6547 Td (1799 ) 21.8426 Tj 0 -522.1348 Td (Sheet 17) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 25 25 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/proc.c Page 5) 161.635 Tj 0 -28.4801 Td (1800 // Per-CPU process scheduler.) 148.5295 Tj 0 -37.9735 Td (1801 // Each CPU calls scheduler\(\) after setting itself up.) 257.7424 Tj 0 -47.4668 Td (1802 // Scheduler never returns. It loops, doing:) 218.4257 Tj 0 -56.9602 Td (1803 // - choose a process to run) 148.5295 Tj 0 -66.4535 Td (1804 // - swtch to start running that process) 200.9517 Tj 0 -75.9469 Td (1805 // - eventually that process transfers control) 227.1628 Tj 0 -85.4403 Td (1806 // via swtch back to the scheduler.) 196.5831 Tj 0 -94.9336 Td (1807 void) 39.3166 Tj 0 -104.427 Td (1808 scheduler\(void\)) 87.3703 Tj 0 -113.9203 Td (1809 {) 26.2111 Tj 0 -123.4137 Td (1810 struct proc *p;) 96.1073 Tj 0 -132.9071 Td (1811 struct cpu *c;) 91.7388 Tj 0 -142.4004 Td (1812 int i;) 56.7907 Tj 0 -151.8938 Td (1813 ) 21.8426 Tj 0 -161.3871 Td (1814 c = &cpus[cpu\(\)];) 104.8443 Tj 0 -170.8805 Td (1815 for\(;;\){) 65.5277 Tj 0 -180.3739 Td (1816 // Enable interrupts on this processor.) 209.6887 Tj 0 -189.8672 Td (1817 sti\(\);) 65.5277 Tj 0 -199.3606 Td (1818 ) 21.8426 Tj 0 -208.8539 Td (1819 // Loop over process table looking for process to run.) 275.2164 Tj 0 -218.3473 Td (1820 acquire\(&proc_table_lock\);) 152.898 Tj 0 -227.8407 Td (1821 for\(i = 0; i < NPROC; i++\){) 157.2665 Tj 0 -237.334 Td (1822 p = &proc[i];) 104.8443 Tj 0 -246.8274 Td (1823 if\(p->state != RUNNABLE\)) 152.898 Tj 0 -256.3207 Td (1824 continue;) 96.1073 Tj 0 -265.8141 Td (1825 ) 21.8426 Tj 0 -275.3075 Td (1826 // Switch to chosen process. It is the process's jo\ b) 279.5849 Tj 0 -284.8008 Td (1827 // to release proc_table_lock and then reacquire it) 270.8479 Tj 0 -294.2942 Td (1828 // before jumping back to us.) 174.7406 Tj 0 -303.7875 Td (1829 c->curproc = p;) 113.5814 Tj 0 -313.2809 Td (1830 setupsegs\(p\);) 104.8443 Tj 0 -322.7743 Td (1831 p->state = RUNNING;) 131.0554 Tj 0 -332.2676 Td (1832 swtch\(&c->context, &p->context\);) 187.8461 Tj 0 -341.761 Td (1833 ) 21.8426 Tj 0 -351.2543 Td (1834 // Process is done running for now.) 200.9517 Tj 0 -360.7477 Td (1835 // It should have changed its p->state before coming\ back.) 301.4275 Tj 0 -370.2411 Td (1836 c->curproc = 0;) 113.5814 Tj 0 -379.7344 Td (1837 setupsegs\(0\);) 104.8443 Tj 0 -389.2278 Td (1838 }) 43.6851 Tj 0 -398.7211 Td (1839 release\(&proc_table_lock\);) 152.898 Tj 0 -408.2145 Td (1840 ) 21.8426 Tj 0 -417.7079 Td (1841 }) 34.9481 Tj 0 -427.2012 Td (1842 }) 26.2111 Tj 0 -436.6946 Td (1843 ) 21.8426 Tj 0 -446.1879 Td (1844 ) 21.8426 Tj 0 -455.6813 Td (1845 ) 21.8426 Tj 0 -465.1747 Td (1846 ) 21.8426 Tj 0 -474.668 Td (1847 ) 21.8426 Tj 0 -484.1614 Td (1848 ) 21.8426 Tj 0 -493.6547 Td (1849 ) 21.8426 Tj 0 -522.1348 Td (Sheet 18) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/proc.c Page 6) 161.635 Tj 0 -28.4801 Td (1850 // Enter scheduler. Must already hold proc_table_lock) 257.7424 Tj 0 -37.9735 Td (1851 // and have changed curproc[cpu\(\)]->state.) 205.3202 Tj 0 -47.4668 Td (1852 void) 39.3166 Tj 0 -56.9602 Td (1853 sched\(void\)) 69.8962 Tj 0 -66.4535 Td (1854 {) 26.2111 Tj 0 -75.9469 Td (1855 if\(read_eflags\(\)&FL_IF\)) 131.0554 Tj 0 -85.4403 Td (1856 panic\("sched interruptible"\);) 166.0035 Tj 0 -94.9336 Td (1857 if\(cp->state == RUNNING\)) 135.4239 Tj 0 -104.427 Td (1858 panic\("sched running"\);) 139.7925 Tj 0 -113.9203 Td (1859 if\(!holding\(&proc_table_lock\)\)) 161.635 Tj 0 -123.4137 Td (1860 panic\("sched proc_table_lock"\);) 174.7406 Tj 0 -132.9071 Td (1861 if\(cpus[cpu\(\)].ncli != 1\)) 139.7925 Tj 0 -142.4004 Td (1862 panic\("sched locks"\);) 131.0554 Tj 0 -151.8938 Td (1863 ) 21.8426 Tj 0 -161.3871 Td (1864 swtch\(&cp->context, &cpus[cpu\(\)].context\);) 214.0572 Tj 0 -170.8805 Td (1865 }) 26.2111 Tj 0 -180.3739 Td (1866 ) 21.8426 Tj 0 -189.8672 Td (1867 // Give up the CPU for one scheduling round.) 214.0572 Tj 0 -199.3606 Td (1868 void) 39.3166 Tj 0 -208.8539 Td (1869 yield\(void\)) 69.8962 Tj 0 -218.3473 Td (1870 {) 26.2111 Tj 0 -227.8407 Td (1871 acquire\(&proc_table_lock\);) 144.161 Tj 0 -237.334 Td (1872 cp->state = RUNNABLE;) 122.3184 Tj 0 -246.8274 Td (1873 sched\(\);) 65.5277 Tj 0 -256.3207 Td (1874 release\(&proc_table_lock\);) 144.161 Tj 0 -265.8141 Td (1875 }) 26.2111 Tj 0 -275.3075 Td (1876 ) 21.8426 Tj 0 -284.8008 Td (1877 // A fork child's very first scheduling by scheduler\(\)) 257.7424 Tj 0 -294.2942 Td (1878 // will swtch here. "Return" to user space.) 214.0572 Tj 0 -303.7875 Td (1879 void) 39.3166 Tj 0 -313.2809 Td (1880 forkret\(void\)) 78.6333 Tj 0 -322.7743 Td (1881 {) 26.2111 Tj 0 -332.2676 Td (1882 // Still holding proc_table_lock from scheduler.) 240.2683 Tj 0 -341.761 Td (1883 release\(&proc_table_lock\);) 144.161 Tj 0 -351.2543 Td (1884 ) 21.8426 Tj 0 -360.7477 Td (1885 // Jump into assembly, never to return.) 200.9517 Tj 0 -370.2411 Td (1886 forkret1\(cp->tf\);) 104.8443 Tj 0 -379.7344 Td (1887 }) 26.2111 Tj 0 -389.2278 Td (1888 ) 21.8426 Tj 0 -398.7211 Td (1889 ) 21.8426 Tj 0 -408.2145 Td (1890 ) 21.8426 Tj 0 -417.7079 Td (1891 ) 21.8426 Tj 0 -427.2012 Td (1892 ) 21.8426 Tj 0 -436.6946 Td (1893 ) 21.8426 Tj 0 -446.1879 Td (1894 ) 21.8426 Tj 0 -455.6813 Td (1895 ) 21.8426 Tj 0 -465.1747 Td (1896 ) 21.8426 Tj 0 -474.668 Td (1897 ) 21.8426 Tj 0 -484.1614 Td (1898 ) 21.8426 Tj 0 -493.6547 Td (1899 ) 21.8426 Tj 0 -522.1348 Td (Sheet 18) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 26 26 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/proc.c Page 7) 161.635 Tj 0 -28.4801 Td (1900 // Atomically release lock and sleep on chan.) 218.4257 Tj 0 -37.9735 Td (1901 // Reacquires lock when reawakened.) 174.7406 Tj 0 -47.4668 Td (1902 void) 39.3166 Tj 0 -56.9602 Td (1903 sleep\(void *chan, struct spinlock *lk\)) 187.8461 Tj 0 -66.4535 Td (1904 {) 26.2111 Tj 0 -75.9469 Td (1905 if\(cp == 0\)) 78.6333 Tj 0 -85.4403 Td (1906 panic\("sleep"\);) 104.8443 Tj 0 -94.9336 Td (1907 ) 21.8426 Tj 0 -104.427 Td (1908 if\(lk == 0\)) 78.6333 Tj 0 -113.9203 Td (1909 panic\("sleep without lk"\);) 152.898 Tj 0 -123.4137 Td (1910 ) 21.8426 Tj 0 -132.9071 Td (1911 // Must acquire proc_table_lock in order to) 218.4257 Tj 0 -142.4004 Td (1912 // change p->state and then call sched.) 200.9517 Tj 0 -151.8938 Td (1913 // Once we hold proc_table_lock, we can be) 214.0572 Tj 0 -161.3871 Td (1914 // guaranteed that we won't miss any wakeup) 218.4257 Tj 0 -170.8805 Td (1915 // \(wakeup runs with proc_table_lock locked\),) 227.1628 Tj 0 -180.3739 Td (1916 // so it's okay to release lk.) 161.635 Tj 0 -189.8672 Td (1917 if\(lk != &proc_table_lock\){) 148.5295 Tj 0 -199.3606 Td (1918 acquire\(&proc_table_lock\);) 152.898 Tj 0 -208.8539 Td (1919 release\(lk\);) 91.7388 Tj 0 -218.3473 Td (1920 }) 34.9481 Tj 0 -227.8407 Td (1921 ) 21.8426 Tj 0 -237.334 Td (1922 // Go to sleep.) 96.1073 Tj 0 -246.8274 Td (1923 cp->chan = chan;) 100.4758 Tj 0 -256.3207 Td (1924 cp->state = SLEEPING;) 122.3184 Tj 0 -265.8141 Td (1925 sched\(\);) 65.5277 Tj 0 -275.3075 Td (1926 ) 21.8426 Tj 0 -284.8008 Td (1927 // Tidy up.) 78.6333 Tj 0 -294.2942 Td (1928 cp->chan = 0;) 87.3703 Tj 0 -303.7875 Td (1929 ) 21.8426 Tj 0 -313.2809 Td (1930 // Reacquire original lock.) 148.5295 Tj 0 -322.7743 Td (1931 if\(lk != &proc_table_lock\){) 148.5295 Tj 0 -332.2676 Td (1932 release\(&proc_table_lock\);) 152.898 Tj 0 -341.761 Td (1933 acquire\(lk\);) 91.7388 Tj 0 -351.2543 Td (1934 }) 34.9481 Tj 0 -360.7477 Td (1935 }) 26.2111 Tj 0 -370.2411 Td (1936 ) 21.8426 Tj 0 -379.7344 Td (1937 ) 21.8426 Tj 0 -389.2278 Td (1938 ) 21.8426 Tj 0 -398.7211 Td (1939 ) 21.8426 Tj 0 -408.2145 Td (1940 ) 21.8426 Tj 0 -417.7079 Td (1941 ) 21.8426 Tj 0 -427.2012 Td (1942 ) 21.8426 Tj 0 -436.6946 Td (1943 ) 21.8426 Tj 0 -446.1879 Td (1944 ) 21.8426 Tj 0 -455.6813 Td (1945 ) 21.8426 Tj 0 -465.1747 Td (1946 ) 21.8426 Tj 0 -474.668 Td (1947 ) 21.8426 Tj 0 -484.1614 Td (1948 ) 21.8426 Tj 0 -493.6547 Td (1949 ) 21.8426 Tj 0 -522.1348 Td (Sheet 19) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/proc.c Page 8) 161.635 Tj 0 -28.4801 Td (1950 // Wake up all processes sleeping on chan.) 205.3202 Tj 0 -37.9735 Td (1951 // Proc_table_lock must be held.) 161.635 Tj 0 -47.4668 Td (1952 static void) 69.8962 Tj 0 -56.9602 Td (1953 wakeup1\(void *chan\)) 104.8443 Tj 0 -66.4535 Td (1954 {) 26.2111 Tj 0 -75.9469 Td (1955 struct proc *p;) 96.1073 Tj 0 -85.4403 Td (1956 ) 21.8426 Tj 0 -94.9336 Td (1957 for\(p = proc; p < &proc[NPROC]; p++\)) 187.8461 Tj 0 -104.427 Td (1958 if\(p->state == SLEEPING && p->chan == chan\)) 227.1628 Tj 0 -113.9203 Td (1959 p->state = RUNNABLE;) 135.4239 Tj 0 -123.4137 Td (1960 }) 26.2111 Tj 0 -132.9071 Td (1961 ) 21.8426 Tj 0 -142.4004 Td (1962 // Wake up all processes sleeping on chan.) 205.3202 Tj 0 -151.8938 Td (1963 // Proc_table_lock is acquired and released.) 214.0572 Tj 0 -161.3871 Td (1964 void) 39.3166 Tj 0 -170.8805 Td (1965 wakeup\(void *chan\)) 100.4758 Tj 0 -180.3739 Td (1966 {) 26.2111 Tj 0 -189.8672 Td (1967 acquire\(&proc_table_lock\);) 144.161 Tj 0 -199.3606 Td (1968 wakeup1\(chan\);) 91.7388 Tj 0 -208.8539 Td (1969 release\(&proc_table_lock\);) 144.161 Tj 0 -218.3473 Td (1970 }) 26.2111 Tj 0 -227.8407 Td (1971 ) 21.8426 Tj 0 -237.334 Td (1972 // Kill the process with the given pid.) 192.2146 Tj 0 -246.8274 Td (1973 // Process won't actually exit until it returns) 227.1628 Tj 0 -256.3207 Td (1974 // to user space \(see trap in trap.c\).) 187.8461 Tj 0 -265.8141 Td (1975 int) 34.9481 Tj 0 -275.3075 Td (1976 kill\(int pid\)) 78.6333 Tj 0 -284.8008 Td (1977 {) 26.2111 Tj 0 -294.2942 Td (1978 struct proc *p;) 96.1073 Tj 0 -303.7875 Td (1979 ) 21.8426 Tj 0 -313.2809 Td (1980 acquire\(&proc_table_lock\);) 144.161 Tj 0 -322.7743 Td (1981 for\(p = proc; p < &proc[NPROC]; p++\){) 192.2146 Tj 0 -332.2676 Td (1982 if\(p->pid == pid\){) 117.9499 Tj 0 -341.761 Td (1983 p->killed = 1;) 109.2129 Tj 0 -351.2543 Td (1984 // Wake process from sleep if necessary.) 222.7942 Tj 0 -360.7477 Td (1985 if\(p->state == SLEEPING\)) 152.898 Tj 0 -370.2411 Td (1986 p->state = RUNNABLE;) 144.161 Tj 0 -379.7344 Td (1987 release\(&proc_table_lock\);) 161.635 Tj 0 -389.2278 Td (1988 return 0;) 87.3703 Tj 0 -398.7211 Td (1989 }) 43.6851 Tj 0 -408.2145 Td (1990 }) 34.9481 Tj 0 -417.7079 Td (1991 release\(&proc_table_lock\);) 144.161 Tj 0 -427.2012 Td (1992 return -1;) 74.2647 Tj 0 -436.6946 Td (1993 }) 26.2111 Tj 0 -446.1879 Td (1994 ) 21.8426 Tj 0 -455.6813 Td (1995 ) 21.8426 Tj 0 -465.1747 Td (1996 ) 21.8426 Tj 0 -474.668 Td (1997 ) 21.8426 Tj 0 -484.1614 Td (1998 ) 21.8426 Tj 0 -493.6547 Td (1999 ) 21.8426 Tj 0 -522.1348 Td (Sheet 19) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 27 27 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/proc.c Page 9) 161.635 Tj 0 -28.4801 Td (2000 // Exit the current process. Does not return.) 222.7942 Tj 0 -37.9735 Td (2001 // Exited processes remain in the zombie state) 222.7942 Tj 0 -47.4668 Td (2002 // until their parent calls wait\(\) to find out they exit\ ed.) 279.5849 Tj 0 -56.9602 Td (2003 void) 39.3166 Tj 0 -66.4535 Td (2004 exit\(void\)) 65.5277 Tj 0 -75.9469 Td (2005 {) 26.2111 Tj 0 -85.4403 Td (2006 struct proc *p;) 96.1073 Tj 0 -94.9336 Td (2007 int fd;) 61.1592 Tj 0 -104.427 Td (2008 ) 21.8426 Tj 0 -113.9203 Td (2009 if\(cp == initproc\)) 109.2129 Tj 0 -123.4137 Td (2010 panic\("init exiting"\);) 135.4239 Tj 0 -132.9071 Td (2011 ) 21.8426 Tj 0 -142.4004 Td (2012 // Close all open files.) 135.4239 Tj 0 -151.8938 Td (2013 for\(fd = 0; fd < NOFILE; fd++\){) 166.0035 Tj 0 -161.3871 Td (2014 if\(cp->ofile[fd]\){) 117.9499 Tj 0 -170.8805 Td (2015 fileclose\(cp->ofile[fd]\);) 157.2665 Tj 0 -180.3739 Td (2016 cp->ofile[fd] = 0;) 126.6869 Tj 0 -189.8672 Td (2017 }) 43.6851 Tj 0 -199.3606 Td (2018 }) 34.9481 Tj 0 -208.8539 Td (2019 ) 21.8426 Tj 0 -218.3473 Td (2020 iput\(cp->cwd\);) 91.7388 Tj 0 -227.8407 Td (2021 cp->cwd = 0;) 83.0018 Tj 0 -237.334 Td (2022 ) 21.8426 Tj 0 -246.8274 Td (2023 acquire\(&proc_table_lock\);) 144.161 Tj 0 -256.3207 Td (2024 ) 21.8426 Tj 0 -265.8141 Td (2025 // Parent might be sleeping in wait\(\).) 196.5831 Tj 0 -275.3075 Td (2026 wakeup1\(cp->parent\);) 117.9499 Tj 0 -284.8008 Td (2027 ) 21.8426 Tj 0 -294.2942 Td (2028 // Pass abandoned children to init.) 183.4776 Tj 0 -303.7875 Td (2029 for\(p = proc; p < &proc[NPROC]; p++\){) 192.2146 Tj 0 -313.2809 Td (2030 if\(p->parent == cp\){) 126.6869 Tj 0 -322.7743 Td (2031 p->parent = initproc;) 139.7925 Tj 0 -332.2676 Td (2032 if\(p->state == ZOMBIE\)) 144.161 Tj 0 -341.761 Td (2033 wakeup1\(initproc\);) 135.4239 Tj 0 -351.2543 Td (2034 }) 43.6851 Tj 0 -360.7477 Td (2035 }) 34.9481 Tj 0 -370.2411 Td (2036 ) 21.8426 Tj 0 -379.7344 Td (2037 // Jump into the scheduler, never to return.) 222.7942 Tj 0 -389.2278 Td (2038 cp->killed = 0;) 96.1073 Tj 0 -398.7211 Td (2039 cp->state = ZOMBIE;) 113.5814 Tj 0 -408.2145 Td (2040 sched\(\);) 65.5277 Tj 0 -417.7079 Td (2041 panic\("zombie exit"\);) 122.3184 Tj 0 -427.2012 Td (2042 }) 26.2111 Tj 0 -436.6946 Td (2043 ) 21.8426 Tj 0 -446.1879 Td (2044 ) 21.8426 Tj 0 -455.6813 Td (2045 ) 21.8426 Tj 0 -465.1747 Td (2046 ) 21.8426 Tj 0 -474.668 Td (2047 ) 21.8426 Tj 0 -484.1614 Td (2048 ) 21.8426 Tj 0 -493.6547 Td (2049 ) 21.8426 Tj 0 -522.1348 Td (Sheet 20) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/proc.c Page 10) 166.0035 Tj 0 -28.4801 Td (2050 // Wait for a child process to exit and return its pid.) 262.1109 Tj 0 -37.9735 Td (2051 // Return -1 if this process has no children.) 218.4257 Tj 0 -47.4668 Td (2052 int) 34.9481 Tj 0 -56.9602 Td (2053 wait\(void\)) 65.5277 Tj 0 -66.4535 Td (2054 {) 26.2111 Tj 0 -75.9469 Td (2055 struct proc *p;) 96.1073 Tj 0 -85.4403 Td (2056 int i, havekids, pid;) 122.3184 Tj 0 -94.9336 Td (2057 ) 21.8426 Tj 0 -104.427 Td (2058 acquire\(&proc_table_lock\);) 144.161 Tj 0 -113.9203 Td (2059 for\(;;\){) 65.5277 Tj 0 -123.4137 Td (2060 // Scan through table looking for zombie children.) 257.7424 Tj 0 -132.9071 Td (2061 havekids = 0;) 96.1073 Tj 0 -142.4004 Td (2062 for\(i = 0; i < NPROC; i++\){) 157.2665 Tj 0 -151.8938 Td (2063 p = &proc[i];) 104.8443 Tj 0 -161.3871 Td (2064 if\(p->state == UNUSED\)) 144.161 Tj 0 -170.8805 Td (2065 continue;) 96.1073 Tj 0 -180.3739 Td (2066 if\(p->parent == cp\){) 135.4239 Tj 0 -189.8672 Td (2067 if\(p->state == ZOMBIE\){) 157.2665 Tj 0 -199.3606 Td (2068 // Found one.) 122.3184 Tj 0 -208.8539 Td (2069 kfree\(p->mem, p->sz\);) 157.2665 Tj 0 -218.3473 Td (2070 kfree\(p->kstack, KSTACKSIZE\);) 192.2146 Tj 0 -227.8407 Td (2071 pid = p->pid;) 122.3184 Tj 0 -237.334 Td (2072 p->state = UNUSED;) 144.161 Tj 0 -246.8274 Td (2073 p->pid = 0;) 113.5814 Tj 0 -256.3207 Td (2074 p->parent = 0;) 126.6869 Tj 0 -265.8141 Td (2075 p->name[0] = 0;) 131.0554 Tj 0 -275.3075 Td (2076 release\(&proc_table_lock\);) 179.1091 Tj 0 -284.8008 Td (2077 return pid;) 113.5814 Tj 0 -294.2942 Td (2078 }) 61.1592 Tj 0 -303.7875 Td (2079 havekids = 1;) 113.5814 Tj 0 -313.2809 Td (2080 }) 52.4222 Tj 0 -322.7743 Td (2081 }) 43.6851 Tj 0 -332.2676 Td (2082 ) 21.8426 Tj 0 -341.761 Td (2083 // No point waiting if we don't have any children.) 257.7424 Tj 0 -351.2543 Td (2084 if\(!havekids || cp->killed\){) 161.635 Tj 0 -360.7477 Td (2085 release\(&proc_table_lock\);) 161.635 Tj 0 -370.2411 Td (2086 return -1;) 91.7388 Tj 0 -379.7344 Td (2087 }) 43.6851 Tj 0 -389.2278 Td (2088 ) 21.8426 Tj 0 -398.7211 Td (2089 // Wait for children to exit. \(See wakeup1 call in p\ roc_exit.\)) 314.533 Tj 0 -408.2145 Td (2090 sleep\(cp, &proc_table_lock\);) 161.635 Tj 0 -417.7079 Td (2091 }) 34.9481 Tj 0 -427.2012 Td (2092 }) 26.2111 Tj 0 -436.6946 Td (2093 ) 21.8426 Tj 0 -446.1879 Td (2094 ) 21.8426 Tj 0 -455.6813 Td (2095 ) 21.8426 Tj 0 -465.1747 Td (2096 ) 21.8426 Tj 0 -474.668 Td (2097 ) 21.8426 Tj 0 -484.1614 Td (2098 ) 21.8426 Tj 0 -493.6547 Td (2099 ) 21.8426 Tj 0 -522.1348 Td (Sheet 20) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 28 28 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/proc.c Page 11) 166.0035 Tj 0 -28.4801 Td (2100 // Print a process listing to console. For debugging.) 257.7424 Tj 0 -37.9735 Td (2101 // Runs when user types ^P on console.) 187.8461 Tj 0 -47.4668 Td (2102 // No lock to avoid wedging a stuck machine further.) 249.0053 Tj 0 -56.9602 Td (2103 void) 39.3166 Tj 0 -66.4535 Td (2104 procdump\(void\)) 83.0018 Tj 0 -75.9469 Td (2105 {) 26.2111 Tj 0 -85.4403 Td (2106 static char *states[] = {) 139.7925 Tj 0 -94.9336 Td (2107 [UNUSED] "unused",) 122.3184 Tj 0 -104.427 Td (2108 [EMBRYO] "embryo",) 122.3184 Tj 0 -113.9203 Td (2109 [SLEEPING] "sleep ",) 122.3184 Tj 0 -123.4137 Td (2110 [RUNNABLE] "runble",) 122.3184 Tj 0 -132.9071 Td (2111 [RUNNING] "run ",) 122.3184 Tj 0 -142.4004 Td (2112 [ZOMBIE] "zombie") 117.9499 Tj 0 -151.8938 Td (2113 };) 39.3166 Tj 0 -161.3871 Td (2114 int i, j;) 69.8962 Tj 0 -170.8805 Td (2115 struct proc *p;) 96.1073 Tj 0 -180.3739 Td (2116 char *state;) 83.0018 Tj 0 -189.8672 Td (2117 uint pc[10];) 83.0018 Tj 0 -199.3606 Td (2118 ) 21.8426 Tj 0 -208.8539 Td (2119 for\(i = 0; i < NPROC; i++\){) 148.5295 Tj 0 -218.3473 Td (2120 p = &proc[i];) 96.1073 Tj 0 -227.8407 Td (2121 if\(p->state == UNUSED\)) 135.4239 Tj 0 -237.334 Td (2122 continue;) 87.3703 Tj 0 -246.8274 Td (2123 if\(p->state >= 0 && p->state < NELEM\(states\) && sta\ tes[p->state]\)) 323.2701 Tj 0 -256.3207 Td (2124 state = states[p->state];) 157.2665 Tj 0 -265.8141 Td (2125 else) 56.7907 Tj 0 -275.3075 Td (2126 state = "???";) 109.2129 Tj 0 -284.8008 Td (2127 cprintf\("%d %s %s", p->pid, state, p->name\);) 231.5313 Tj 0 -294.2942 Td (2128 if\(p->state == SLEEPING\){) 148.5295 Tj 0 -303.7875 Td (2129 getcallerpcs\(\(uint*\)p->context.ebp+2, pc\);) 231.5313 Tj 0 -313.2809 Td (2130 for\(j=0; j<10 && pc[j] != 0; j++\)) 192.2146 Tj 0 -322.7743 Td (2131 cprintf\(" %p", pc[j]\);) 152.898 Tj 0 -332.2676 Td (2132 }) 43.6851 Tj 0 -341.761 Td (2133 cprintf\("\\n"\);) 100.4758 Tj 0 -351.2543 Td (2134 }) 34.9481 Tj 0 -360.7477 Td (2135 }) 26.2111 Tj 0 -370.2411 Td (2136 ) 21.8426 Tj 0 -379.7344 Td (2137 ) 21.8426 Tj 0 -389.2278 Td (2138 ) 21.8426 Tj 0 -398.7211 Td (2139 ) 21.8426 Tj 0 -408.2145 Td (2140 ) 21.8426 Tj 0 -417.7079 Td (2141 ) 21.8426 Tj 0 -427.2012 Td (2142 ) 21.8426 Tj 0 -436.6946 Td (2143 ) 21.8426 Tj 0 -446.1879 Td (2144 ) 21.8426 Tj 0 -455.6813 Td (2145 ) 21.8426 Tj 0 -465.1747 Td (2146 ) 21.8426 Tj 0 -474.668 Td (2147 ) 21.8426 Tj 0 -484.1614 Td (2148 ) 21.8426 Tj 0 -493.6547 Td (2149 ) 21.8426 Tj 0 -522.1348 Td (Sheet 21) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/swtch.S Page 1) 166.0035 Tj 0 -28.4801 Td (2150 # void swtch\(struct context *old, struct context *new\)\ ;) 270.8479 Tj 0 -37.9735 Td (2151 #) 26.2111 Tj 0 -47.4668 Td (2152 # Save current register context in old) 187.8461 Tj 0 -56.9602 Td (2153 # and then load register context from new.) 205.3202 Tj 0 -66.4535 Td (2154 ) 21.8426 Tj 0 -75.9469 Td (2155 .globl swtch) 74.2647 Tj 0 -85.4403 Td (2156 swtch:) 48.0537 Tj 0 -94.9336 Td (2157 # Save old registers) 117.9499 Tj 0 -104.427 Td (2158 movl 4\(%esp\), %eax) 109.2129 Tj 0 -113.9203 Td (2159 ) 21.8426 Tj 0 -123.4137 Td (2160 popl 0\(%eax\) # %eip) 117.9499 Tj 0 -132.9071 Td (2161 movl %esp, 4\(%eax\)) 109.2129 Tj 0 -142.4004 Td (2162 movl %ebx, 8\(%eax\)) 109.2129 Tj 0 -151.8938 Td (2163 movl %ecx, 12\(%eax\)) 113.5814 Tj 0 -161.3871 Td (2164 movl %edx, 16\(%eax\)) 113.5814 Tj 0 -170.8805 Td (2165 movl %esi, 20\(%eax\)) 113.5814 Tj 0 -180.3739 Td (2166 movl %edi, 24\(%eax\)) 113.5814 Tj 0 -189.8672 Td (2167 movl %ebp, 28\(%eax\)) 113.5814 Tj 0 -199.3606 Td (2168 ) 21.8426 Tj 0 -208.8539 Td (2169 # Load new registers) 117.9499 Tj 0 -218.3473 Td (2170 movl 4\(%esp\), %eax # not 8\(%esp\) - popped return ad\ dress above) 305.796 Tj 0 -227.8407 Td (2171 ) 21.8426 Tj 0 -237.334 Td (2172 movl 28\(%eax\), %ebp) 113.5814 Tj 0 -246.8274 Td (2173 movl 24\(%eax\), %edi) 113.5814 Tj 0 -256.3207 Td (2174 movl 20\(%eax\), %esi) 113.5814 Tj 0 -265.8141 Td (2175 movl 16\(%eax\), %edx) 113.5814 Tj 0 -275.3075 Td (2176 movl 12\(%eax\), %ecx) 113.5814 Tj 0 -284.8008 Td (2177 movl 8\(%eax\), %ebx) 109.2129 Tj 0 -294.2942 Td (2178 movl 4\(%eax\), %esp) 109.2129 Tj 0 -303.7875 Td (2179 pushl 0\(%eax\) # %eip) 122.3184 Tj 0 -313.2809 Td (2180 ) 21.8426 Tj 0 -322.7743 Td (2181 ret) 43.6851 Tj 0 -332.2676 Td (2182 ) 21.8426 Tj 0 -341.761 Td (2183 ) 21.8426 Tj 0 -351.2543 Td (2184 ) 21.8426 Tj 0 -360.7477 Td (2185 ) 21.8426 Tj 0 -370.2411 Td (2186 ) 21.8426 Tj 0 -379.7344 Td (2187 ) 21.8426 Tj 0 -389.2278 Td (2188 ) 21.8426 Tj 0 -398.7211 Td (2189 ) 21.8426 Tj 0 -408.2145 Td (2190 ) 21.8426 Tj 0 -417.7079 Td (2191 ) 21.8426 Tj 0 -427.2012 Td (2192 ) 21.8426 Tj 0 -436.6946 Td (2193 ) 21.8426 Tj 0 -446.1879 Td (2194 ) 21.8426 Tj 0 -455.6813 Td (2195 ) 21.8426 Tj 0 -465.1747 Td (2196 ) 21.8426 Tj 0 -474.668 Td (2197 ) 21.8426 Tj 0 -484.1614 Td (2198 ) 21.8426 Tj 0 -493.6547 Td (2199 ) 21.8426 Tj 0 -522.1348 Td (Sheet 21) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 29 29 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/kalloc.c Page 1) 170.3721 Tj 0 -28.4801 Td (2200 // Physical memory allocator, intended to allocate) 240.2683 Tj 0 -37.9735 Td (2201 // memory for user processes. Allocates in 4096-byte "page\ s".) 288.322 Tj 0 -47.4668 Td (2202 // Free list is kept sorted and combines adjacent pages in\ to) 283.9534 Tj 0 -56.9602 Td (2203 // long runs, to make it easier to allocate big segments.) 270.8479 Tj 0 -66.4535 Td (2204 // One reason the page size is 4k is that the x86 segment \ size) 292.6905 Tj 0 -75.9469 Td (2205 // granularity is 4k.) 113.5814 Tj 0 -85.4403 Td (2206 ) 21.8426 Tj 0 -94.9336 Td (2207 #include "types.h") 100.4758 Tj 0 -104.427 Td (2208 #include "defs.h") 96.1073 Tj 0 -113.9203 Td (2209 #include "param.h") 100.4758 Tj 0 -123.4137 Td (2210 #include "spinlock.h") 113.5814 Tj 0 -132.9071 Td (2211 ) 21.8426 Tj 0 -142.4004 Td (2212 struct spinlock kalloc_lock;) 144.161 Tj 0 -151.8938 Td (2213 ) 21.8426 Tj 0 -161.3871 Td (2214 struct run {) 74.2647 Tj 0 -170.8805 Td (2215 struct run *next;) 104.8443 Tj 0 -180.3739 Td (2216 int len; // bytes) 104.8443 Tj 0 -189.8672 Td (2217 };) 30.5796 Tj 0 -199.3606 Td (2218 struct run *freelist;) 113.5814 Tj 0 -208.8539 Td (2219 ) 21.8426 Tj 0 -218.3473 Td (2220 // Initialize free list of physical pages.) 205.3202 Tj 0 -227.8407 Td (2221 // This code cheats by just considering one megabyte of) 262.1109 Tj 0 -237.334 Td (2222 // pages after _end. Real systems would determine the) 257.7424 Tj 0 -246.8274 Td (2223 // amount of memory available in the system and use it all\ .) 279.5849 Tj 0 -256.3207 Td (2224 void) 39.3166 Tj 0 -265.8141 Td (2225 kinit\(void\)) 69.8962 Tj 0 -275.3075 Td (2226 {) 26.2111 Tj 0 -284.8008 Td (2227 extern int end;) 96.1073 Tj 0 -294.2942 Td (2228 uint mem;) 69.8962 Tj 0 -303.7875 Td (2229 char *start;) 83.0018 Tj 0 -313.2809 Td (2230 ) 21.8426 Tj 0 -322.7743 Td (2231 initlock\(&kalloc_lock, "kalloc"\);) 174.7406 Tj 0 -332.2676 Td (2232 start = \(char*\) &end;) 122.3184 Tj 0 -341.761 Td (2233 start = \(char*\) \(\(\(uint\)start + PAGE\) & ~\(PAGE-1\ \)\);) 253.3738 Tj 0 -351.2543 Td (2234 mem = 256; // assume computer has 256 pages of RAM) 249.0053 Tj 0 -360.7477 Td (2235 cprintf\("mem = %d\\n", mem * PAGE\);) 179.1091 Tj 0 -370.2411 Td (2236 kfree\(start, mem * PAGE\);) 139.7925 Tj 0 -379.7344 Td (2237 }) 26.2111 Tj 0 -389.2278 Td (2238 ) 21.8426 Tj 0 -398.7211 Td (2239 ) 21.8426 Tj 0 -408.2145 Td (2240 ) 21.8426 Tj 0 -417.7079 Td (2241 ) 21.8426 Tj 0 -427.2012 Td (2242 ) 21.8426 Tj 0 -436.6946 Td (2243 ) 21.8426 Tj 0 -446.1879 Td (2244 ) 21.8426 Tj 0 -455.6813 Td (2245 ) 21.8426 Tj 0 -465.1747 Td (2246 ) 21.8426 Tj 0 -474.668 Td (2247 ) 21.8426 Tj 0 -484.1614 Td (2248 ) 21.8426 Tj 0 -493.6547 Td (2249 ) 21.8426 Tj 0 -522.1348 Td (Sheet 22) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/kalloc.c Page 2) 170.3721 Tj 0 -28.4801 Td (2250 // Free the len bytes of memory pointed at by v,) 231.5313 Tj 0 -37.9735 Td (2251 // which normally should have been returned by a) 231.5313 Tj 0 -47.4668 Td (2252 // call to kalloc\(len\). \(The exception is when) 227.1628 Tj 0 -56.9602 Td (2253 // initializing the allocator; see kinit above.\)) 231.5313 Tj 0 -66.4535 Td (2254 void) 39.3166 Tj 0 -75.9469 Td (2255 kfree\(char *v, int len\)) 122.3184 Tj 0 -85.4403 Td (2256 {) 26.2111 Tj 0 -94.9336 Td (2257 struct run *r, *rend, **rp, *p, *pend;) 196.5831 Tj 0 -104.427 Td (2258 ) 21.8426 Tj 0 -113.9203 Td (2259 if\(len <= 0 || len % PAGE\)) 144.161 Tj 0 -123.4137 Td (2260 panic\("kfree"\);) 104.8443 Tj 0 -132.9071 Td (2261 ) 21.8426 Tj 0 -142.4004 Td (2262 // Fill with junk to catch dangling refs.) 209.6887 Tj 0 -151.8938 Td (2263 memset\(v, 1, len\);) 109.2129 Tj 0 -161.3871 Td (2264 ) 21.8426 Tj 0 -170.8805 Td (2265 acquire\(&kalloc_lock\);) 126.6869 Tj 0 -180.3739 Td (2266 p = \(struct run*\)v;) 113.5814 Tj 0 -189.8672 Td (2267 pend = \(struct run*\)\(v + len\);) 161.635 Tj 0 -199.3606 Td (2268 for\(rp=&freelist; \(r=*rp\) != 0 && r <= pend; rp=&r->n\ ext\){) 283.9534 Tj 0 -208.8539 Td (2269 rend = \(struct run*\)\(\(char*\)r + r->len\);) 214.0572 Tj 0 -218.3473 Td (2270 if\(r <= p && p < rend\)) 135.4239 Tj 0 -227.8407 Td (2271 panic\("freeing free page"\);) 166.0035 Tj 0 -237.334 Td (2272 if\(pend == r\){ // p next to r: replace r with p) 249.0053 Tj 0 -246.8274 Td (2273 p->len = len + r->len;) 144.161 Tj 0 -256.3207 Td (2274 p->next = r->next;) 126.6869 Tj 0 -265.8141 Td (2275 *rp = p;) 83.0018 Tj 0 -275.3075 Td (2276 goto out;) 87.3703 Tj 0 -284.8008 Td (2277 }) 43.6851 Tj 0 -294.2942 Td (2278 if\(rend == p\){ // r next to p: replace p with r) 249.0053 Tj 0 -303.7875 Td (2279 r->len += len;) 109.2129 Tj 0 -313.2809 Td (2280 if\(r->next && r->next == pend\){ // r now next to \ r->next?) 301.4275 Tj 0 -322.7743 Td (2281 r->len += r->next->len;) 157.2665 Tj 0 -332.2676 Td (2282 r->next = r->next->next;) 161.635 Tj 0 -341.761 Td (2283 }) 52.4222 Tj 0 -351.2543 Td (2284 goto out;) 87.3703 Tj 0 -360.7477 Td (2285 }) 43.6851 Tj 0 -370.2411 Td (2286 }) 34.9481 Tj 0 -379.7344 Td (2287 // Insert p before r in list.) 157.2665 Tj 0 -389.2278 Td (2288 p->len = len;) 87.3703 Tj 0 -398.7211 Td (2289 p->next = r;) 83.0018 Tj 0 -408.2145 Td (2290 *rp = p;) 65.5277 Tj 0 -417.7079 Td (2291 ) 21.8426 Tj 0 -427.2012 Td (2292 out:) 43.6851 Tj 0 -436.6946 Td (2293 release\(&kalloc_lock\);) 126.6869 Tj 0 -446.1879 Td (2294 }) 26.2111 Tj 0 -455.6813 Td (2295 ) 21.8426 Tj 0 -465.1747 Td (2296 ) 21.8426 Tj 0 -474.668 Td (2297 ) 21.8426 Tj 0 -484.1614 Td (2298 ) 21.8426 Tj 0 -493.6547 Td (2299 ) 21.8426 Tj 0 -522.1348 Td (Sheet 22) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 30 30 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/kalloc.c Page 3) 170.3721 Tj 0 -28.4801 Td (2300 // Allocate n bytes of physical memory.) 192.2146 Tj 0 -37.9735 Td (2301 // Returns a kernel-segment pointer.) 179.1091 Tj 0 -47.4668 Td (2302 // Returns 0 if the memory cannot be allocated.) 227.1628 Tj 0 -56.9602 Td (2303 char*) 43.6851 Tj 0 -66.4535 Td (2304 kalloc\(int n\)) 78.6333 Tj 0 -75.9469 Td (2305 {) 26.2111 Tj 0 -85.4403 Td (2306 char *p;) 65.5277 Tj 0 -94.9336 Td (2307 struct run *r, **rp;) 117.9499 Tj 0 -104.427 Td (2308 ) 21.8426 Tj 0 -113.9203 Td (2309 if\(n % PAGE || n <= 0\)) 126.6869 Tj 0 -123.4137 Td (2310 panic\("kalloc"\);) 109.2129 Tj 0 -132.9071 Td (2311 ) 21.8426 Tj 0 -142.4004 Td (2312 acquire\(&kalloc_lock\);) 126.6869 Tj 0 -151.8938 Td (2313 for\(rp=&freelist; \(r=*rp\) != 0; rp=&r->next\){) 227.1628 Tj 0 -161.3871 Td (2314 if\(r->len == n\){) 109.2129 Tj 0 -170.8805 Td (2315 *rp = r->next;) 109.2129 Tj 0 -180.3739 Td (2316 release\(&kalloc_lock\);) 144.161 Tj 0 -189.8672 Td (2317 return \(char*\)r;) 117.9499 Tj 0 -199.3606 Td (2318 }) 43.6851 Tj 0 -208.8539 Td (2319 if\(r->len > n\){) 104.8443 Tj 0 -218.3473 Td (2320 r->len -= n;) 100.4758 Tj 0 -227.8407 Td (2321 p = \(char*\)r + r->len;) 144.161 Tj 0 -237.334 Td (2322 release\(&kalloc_lock\);) 144.161 Tj 0 -246.8274 Td (2323 return p;) 87.3703 Tj 0 -256.3207 Td (2324 }) 43.6851 Tj 0 -265.8141 Td (2325 }) 34.9481 Tj 0 -275.3075 Td (2326 release\(&kalloc_lock\);) 126.6869 Tj 0 -284.8008 Td (2327 ) 21.8426 Tj 0 -294.2942 Td (2328 cprintf\("kalloc: out of memory\\n"\);) 183.4776 Tj 0 -303.7875 Td (2329 return 0;) 69.8962 Tj 0 -313.2809 Td (2330 }) 26.2111 Tj 0 -322.7743 Td (2331 ) 21.8426 Tj 0 -332.2676 Td (2332 ) 21.8426 Tj 0 -341.761 Td (2333 ) 21.8426 Tj 0 -351.2543 Td (2334 ) 21.8426 Tj 0 -360.7477 Td (2335 ) 21.8426 Tj 0 -370.2411 Td (2336 ) 21.8426 Tj 0 -379.7344 Td (2337 ) 21.8426 Tj 0 -389.2278 Td (2338 ) 21.8426 Tj 0 -398.7211 Td (2339 ) 21.8426 Tj 0 -408.2145 Td (2340 ) 21.8426 Tj 0 -417.7079 Td (2341 ) 21.8426 Tj 0 -427.2012 Td (2342 ) 21.8426 Tj 0 -436.6946 Td (2343 ) 21.8426 Tj 0 -446.1879 Td (2344 ) 21.8426 Tj 0 -455.6813 Td (2345 ) 21.8426 Tj 0 -465.1747 Td (2346 ) 21.8426 Tj 0 -474.668 Td (2347 ) 21.8426 Tj 0 -484.1614 Td (2348 ) 21.8426 Tj 0 -493.6547 Td (2349 ) 21.8426 Tj 0 -522.1348 Td (Sheet 23) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/traps.h Page 1) 166.0035 Tj 0 -28.4801 Td (2350 // x86 trap and interrupt constants.) 179.1091 Tj 0 -37.9735 Td (2351 ) 21.8426 Tj 0 -47.4668 Td (2352 // Processor-defined:) 113.5814 Tj 0 -56.9602 Td (2353 #define T_DIVIDE 0 // divide error) 227.1628 Tj 0 -66.4535 Td (2354 #define T_DEBUG 1 // debug exception) 240.2683 Tj 0 -75.9469 Td (2355 #define T_NMI 2 // non-maskable interrupt) 270.8479 Tj 0 -85.4403 Td (2356 #define T_BRKPT 3 // breakpoint) 218.4257 Tj 0 -94.9336 Td (2357 #define T_OFLOW 4 // overflow) 209.6887 Tj 0 -104.427 Td (2358 #define T_BOUND 5 // bounds check) 227.1628 Tj 0 -113.9203 Td (2359 #define T_ILLOP 6 // illegal opcode) 235.8998 Tj 0 -123.4137 Td (2360 #define T_DEVICE 7 // device not available) 262.1109 Tj 0 -132.9071 Td (2361 #define T_DBLFLT 8 // double fault) 227.1628 Tj 0 -142.4004 Td (2362 // #define T_COPROC 9 // reserved \(not used sin\ ce 486\)) 301.4275 Tj 0 -151.8938 Td (2363 #define T_TSS 10 // invalid task switch seg\ ment) 292.6905 Tj 0 -161.3871 Td (2364 #define T_SEGNP 11 // segment not present) 257.7424 Tj 0 -170.8805 Td (2365 #define T_STACK 12 // stack exception) 240.2683 Tj 0 -180.3739 Td (2366 #define T_GPFLT 13 // general protection faul\ t) 279.5849 Tj 0 -189.8672 Td (2367 #define T_PGFLT 14 // page fault) 218.4257 Tj 0 -199.3606 Td (2368 // #define T_RES 15 // reserved) 209.6887 Tj 0 -208.8539 Td (2369 #define T_FPERR 16 // floating point error) 262.1109 Tj 0 -218.3473 Td (2370 #define T_ALIGN 17 // aligment check) 235.8998 Tj 0 -227.8407 Td (2371 #define T_MCHK 18 // machine check) 231.5313 Tj 0 -237.334 Td (2372 #define T_SIMDERR 19 // SIMD floating point err\ or) 283.9534 Tj 0 -246.8274 Td (2373 ) 21.8426 Tj 0 -256.3207 Td (2374 // These are arbitrarily chosen, but with care not to over\ lap) 288.322 Tj 0 -265.8141 Td (2375 // processor defined exceptions or interrupt vectors.) 253.3738 Tj 0 -275.3075 Td (2376 #define T_SYSCALL 48 // system call) 222.7942 Tj 0 -284.8008 Td (2377 #define T_DEFAULT 500 // catchall) 209.6887 Tj 0 -294.2942 Td (2378 ) 21.8426 Tj 0 -303.7875 Td (2379 #define IRQ_OFFSET 32 // IRQ 0 corresponds to in\ t IRQ_OFFSET) 327.6386 Tj 0 -313.2809 Td (2380 ) 21.8426 Tj 0 -322.7743 Td (2381 #define IRQ_TIMER 0) 135.4239 Tj 0 -332.2676 Td (2382 #define IRQ_KBD 1) 135.4239 Tj 0 -341.761 Td (2383 #define IRQ_IDE 14) 135.4239 Tj 0 -351.2543 Td (2384 #define IRQ_ERROR 19) 135.4239 Tj 0 -360.7477 Td (2385 #define IRQ_SPURIOUS 31) 135.4239 Tj 0 -370.2411 Td (2386 ) 21.8426 Tj 0 -379.7344 Td (2387 ) 21.8426 Tj 0 -389.2278 Td (2388 ) 21.8426 Tj 0 -398.7211 Td (2389 ) 21.8426 Tj 0 -408.2145 Td (2390 ) 21.8426 Tj 0 -417.7079 Td (2391 ) 21.8426 Tj 0 -427.2012 Td (2392 ) 21.8426 Tj 0 -436.6946 Td (2393 ) 21.8426 Tj 0 -446.1879 Td (2394 ) 21.8426 Tj 0 -455.6813 Td (2395 ) 21.8426 Tj 0 -465.1747 Td (2396 ) 21.8426 Tj 0 -474.668 Td (2397 ) 21.8426 Tj 0 -484.1614 Td (2398 ) 21.8426 Tj 0 -493.6547 Td (2399 ) 21.8426 Tj 0 -522.1348 Td (Sheet 23) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 31 31 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/vectors.pl Page 1) 179.1091 Tj 0 -28.4801 Td (2400 #!/usr/bin/perl -w) 100.4758 Tj 0 -37.9735 Td (2401 ) 21.8426 Tj 0 -47.4668 Td (2402 # Generate vectors.S, the trap/interrupt entry points.) 257.7424 Tj 0 -56.9602 Td (2403 # There has to be one entry point per interrupt number) 257.7424 Tj 0 -66.4535 Td (2404 # since otherwise there's no way for trap\(\) to discover) 262.1109 Tj 0 -75.9469 Td (2405 # the interrupt number.) 122.3184 Tj 0 -85.4403 Td (2406 ) 21.8426 Tj 0 -94.9336 Td (2407 print "# generated by vectors.pl - do not edit\\n";) 240.2683 Tj 0 -104.427 Td (2408 print "# handlers\\n";) 113.5814 Tj 0 -113.9203 Td (2409 print ".text\\n";) 91.7388 Tj 0 -123.4137 Td (2410 print ".globl alltraps\\n";) 135.4239 Tj 0 -132.9071 Td (2411 for\(my $i = 0; $i < 256; $i++\){) 157.2665 Tj 0 -142.4004 Td (2412 print ".globl vector$i\\n";) 152.898 Tj 0 -151.8938 Td (2413 print "vector$i:\\n";) 126.6869 Tj 0 -161.3871 Td (2414 if\(\($i < 8 || $i > 14\) && $i != 17\){) 196.5831 Tj 0 -170.8805 Td (2415 print " pushl \\$0\\n";) 152.898 Tj 0 -180.3739 Td (2416 }) 43.6851 Tj 0 -189.8672 Td (2417 print " pushl \\$$i\\n";) 139.7925 Tj 0 -199.3606 Td (2418 print " jmp alltraps\\n";) 148.5295 Tj 0 -208.8539 Td (2419 }) 26.2111 Tj 0 -218.3473 Td (2420 ) 21.8426 Tj 0 -227.8407 Td (2421 print "\\n# vector table\\n";) 139.7925 Tj 0 -237.334 Td (2422 print ".data\\n";) 91.7388 Tj 0 -246.8274 Td (2423 print ".globl vectors\\n";) 131.0554 Tj 0 -256.3207 Td (2424 print "vectors:\\n";) 104.8443 Tj 0 -265.8141 Td (2425 for\(my $i = 0; $i < 256; $i++\){) 157.2665 Tj 0 -275.3075 Td (2426 print " .long vector$i\\n";) 157.2665 Tj 0 -284.8008 Td (2427 }) 26.2111 Tj 0 -294.2942 Td (2428 ) 21.8426 Tj 0 -303.7875 Td (2429 # sample output:) 91.7388 Tj 0 -313.2809 Td (2430 # # handlers) 83.0018 Tj 0 -322.7743 Td (2431 # .text) 61.1592 Tj 0 -332.2676 Td (2432 # .globl alltraps) 104.8443 Tj 0 -341.761 Td (2433 # .globl vector0) 100.4758 Tj 0 -351.2543 Td (2434 # vector0:) 74.2647 Tj 0 -360.7477 Td (2435 # pushl $0) 83.0018 Tj 0 -370.2411 Td (2436 # pushl $0) 83.0018 Tj 0 -379.7344 Td (2437 # jmp alltraps) 100.4758 Tj 0 -389.2278 Td (2438 # ...) 52.4222 Tj 0 -398.7211 Td (2439 #) 26.2111 Tj 0 -408.2145 Td (2440 # # vector table) 100.4758 Tj 0 -417.7079 Td (2441 # .data) 61.1592 Tj 0 -427.2012 Td (2442 # .globl vectors) 100.4758 Tj 0 -436.6946 Td (2443 # vectors:) 74.2647 Tj 0 -446.1879 Td (2444 # .long vector0) 104.8443 Tj 0 -455.6813 Td (2445 # .long vector1) 104.8443 Tj 0 -465.1747 Td (2446 # .long vector2) 104.8443 Tj 0 -474.668 Td (2447 # ...) 52.4222 Tj 0 -484.1614 Td (2448 ) 21.8426 Tj 0 -493.6547 Td (2449 ) 21.8426 Tj 0 -522.1348 Td (Sheet 24) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/trapasm.S Page 1) 174.7406 Tj 0 -28.4801 Td (2450 .text) 43.6851 Tj 0 -37.9735 Td (2451 ) 21.8426 Tj 0 -47.4668 Td (2452 .set SEG_KDATA_SEL, 0x10 # selector for SEG_KDATA) 244.6368 Tj 0 -56.9602 Td (2453 ) 21.8426 Tj 0 -66.4535 Td (2454 # vectors.S sends all traps here.) 174.7406 Tj 0 -75.9469 Td (2455 .globl alltraps) 87.3703 Tj 0 -85.4403 Td (2456 alltraps:) 61.1592 Tj 0 -94.9336 Td (2457 # Build trap frame.) 113.5814 Tj 0 -104.427 Td (2458 pushl %ds) 69.8962 Tj 0 -113.9203 Td (2459 pushl %es) 69.8962 Tj 0 -123.4137 Td (2460 pushal) 56.7907 Tj 0 -132.9071 Td (2461 ) 21.8426 Tj 0 -142.4004 Td (2462 # Set up data segments.) 131.0554 Tj 0 -151.8938 Td (2463 movl $SEG_KDATA_SEL, %eax) 139.7925 Tj 0 -161.3871 Td (2464 movw %ax,%ds) 83.0018 Tj 0 -170.8805 Td (2465 movw %ax,%es) 83.0018 Tj 0 -180.3739 Td (2466 ) 21.8426 Tj 0 -189.8672 Td (2467 # Call trap\(tf\), where tf=%esp) 161.635 Tj 0 -199.3606 Td (2468 pushl %esp) 74.2647 Tj 0 -208.8539 Td (2469 call trap) 69.8962 Tj 0 -218.3473 Td (2470 addl $4, %esp) 87.3703 Tj 0 -227.8407 Td (2471 ) 21.8426 Tj 0 -237.334 Td (2472 # Return falls through to trapret...) 187.8461 Tj 0 -246.8274 Td (2473 .globl trapret) 83.0018 Tj 0 -256.3207 Td (2474 trapret:) 56.7907 Tj 0 -265.8141 Td (2475 popal) 52.4222 Tj 0 -275.3075 Td (2476 popl %es) 65.5277 Tj 0 -284.8008 Td (2477 popl %ds) 65.5277 Tj 0 -294.2942 Td (2478 addl $0x8, %esp # trapno and errcode) 192.2146 Tj 0 -303.7875 Td (2479 iret) 48.0537 Tj 0 -313.2809 Td (2480 ) 21.8426 Tj 0 -322.7743 Td (2481 # A forked process switches to user mode by calling) 253.3738 Tj 0 -332.2676 Td (2482 # forkret1\(tf\), where tf is the trap frame to use.) 249.0053 Tj 0 -341.761 Td (2483 .globl forkret1) 87.3703 Tj 0 -351.2543 Td (2484 forkret1:) 61.1592 Tj 0 -360.7477 Td (2485 movl 4\(%esp\), %esp) 109.2129 Tj 0 -370.2411 Td (2486 jmp trapret) 78.6333 Tj 0 -379.7344 Td (2487 ) 21.8426 Tj 0 -389.2278 Td (2488 ) 21.8426 Tj 0 -398.7211 Td (2489 ) 21.8426 Tj 0 -408.2145 Td (2490 ) 21.8426 Tj 0 -417.7079 Td (2491 ) 21.8426 Tj 0 -427.2012 Td (2492 ) 21.8426 Tj 0 -436.6946 Td (2493 ) 21.8426 Tj 0 -446.1879 Td (2494 ) 21.8426 Tj 0 -455.6813 Td (2495 ) 21.8426 Tj 0 -465.1747 Td (2496 ) 21.8426 Tj 0 -474.668 Td (2497 ) 21.8426 Tj 0 -484.1614 Td (2498 ) 21.8426 Tj 0 -493.6547 Td (2499 ) 21.8426 Tj 0 -522.1348 Td (Sheet 24) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 32 32 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/trap.c Page 1) 161.635 Tj 0 -28.4801 Td (2500 #include "types.h") 100.4758 Tj 0 -37.9735 Td (2501 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (2502 #include "param.h") 100.4758 Tj 0 -56.9602 Td (2503 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (2504 #include "proc.h") 96.1073 Tj 0 -75.9469 Td (2505 #include "x86.h") 91.7388 Tj 0 -85.4403 Td (2506 #include "traps.h") 100.4758 Tj 0 -94.9336 Td (2507 #include "spinlock.h") 113.5814 Tj 0 -104.427 Td (2508 ) 21.8426 Tj 0 -113.9203 Td (2509 // Interrupt descriptor table \(shared by all CPUs\).) 244.6368 Tj 0 -123.4137 Td (2510 struct gatedesc idt[256];) 131.0554 Tj 0 -132.9071 Td (2511 extern uint vectors[]; // in vectors.S: array of 256 entr\ y pointers) 318.9016 Tj 0 -142.4004 Td (2512 struct spinlock tickslock;) 135.4239 Tj 0 -151.8938 Td (2513 int ticks;) 65.5277 Tj 0 -161.3871 Td (2514 ) 21.8426 Tj 0 -170.8805 Td (2515 void) 39.3166 Tj 0 -180.3739 Td (2516 tvinit\(void\)) 74.2647 Tj 0 -189.8672 Td (2517 {) 26.2111 Tj 0 -199.3606 Td (2518 int i;) 56.7907 Tj 0 -208.8539 Td (2519 ) 21.8426 Tj 0 -218.3473 Td (2520 for\(i = 0; i < 256; i++\)) 135.4239 Tj 0 -227.8407 Td (2521 SETGATE\(idt[i], 0, SEG_KCODE<<3, vectors[i], 0\);) 249.0053 Tj 0 -237.334 Td (2522 SETGATE\(idt[T_SYSCALL], 1, SEG_KCODE<<3, vectors[T_SYSC\ ALL], DPL_USER\);) 340.7441 Tj 0 -246.8274 Td (2523 ) 21.8426 Tj 0 -256.3207 Td (2524 initlock\(&tickslock, "time"\);) 157.2665 Tj 0 -265.8141 Td (2525 }) 26.2111 Tj 0 -275.3075 Td (2526 ) 21.8426 Tj 0 -284.8008 Td (2527 void) 39.3166 Tj 0 -294.2942 Td (2528 idtinit\(void\)) 78.6333 Tj 0 -303.7875 Td (2529 {) 26.2111 Tj 0 -313.2809 Td (2530 lidt\(idt, sizeof\(idt\)\);) 131.0554 Tj 0 -322.7743 Td (2531 }) 26.2111 Tj 0 -332.2676 Td (2532 ) 21.8426 Tj 0 -341.761 Td (2533 void) 39.3166 Tj 0 -351.2543 Td (2534 trap\(struct trapframe *tf\)) 135.4239 Tj 0 -360.7477 Td (2535 {) 26.2111 Tj 0 -370.2411 Td (2536 if\(tf->trapno == T_SYSCALL\){) 152.898 Tj 0 -379.7344 Td (2537 if\(cp->killed\)) 100.4758 Tj 0 -389.2278 Td (2538 exit\(\);) 78.6333 Tj 0 -398.7211 Td (2539 cp->tf = tf;) 91.7388 Tj 0 -408.2145 Td (2540 syscall\(\);) 83.0018 Tj 0 -417.7079 Td (2541 if\(cp->killed\)) 100.4758 Tj 0 -427.2012 Td (2542 exit\(\);) 78.6333 Tj 0 -436.6946 Td (2543 return;) 69.8962 Tj 0 -446.1879 Td (2544 }) 34.9481 Tj 0 -455.6813 Td (2545 ) 21.8426 Tj 0 -465.1747 Td (2546 switch\(tf->trapno\){) 113.5814 Tj 0 -474.668 Td (2547 case IRQ_OFFSET + IRQ_TIMER:) 152.898 Tj 0 -484.1614 Td (2548 if\(cpu\(\) == 0\){) 104.8443 Tj 0 -493.6547 Td (2549 acquire\(&tickslock\);) 135.4239 Tj 0 -522.1348 Td (Sheet 25) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/trap.c Page 2) 161.635 Tj 0 -28.4801 Td (2550 ticks++;) 83.0018 Tj 0 -37.9735 Td (2551 wakeup\(&ticks\);) 113.5814 Tj 0 -47.4668 Td (2552 release\(&tickslock\);) 135.4239 Tj 0 -56.9602 Td (2553 }) 43.6851 Tj 0 -66.4535 Td (2554 lapic_eoi\(\);) 91.7388 Tj 0 -75.9469 Td (2555 break;) 65.5277 Tj 0 -85.4403 Td (2556 case IRQ_OFFSET + IRQ_IDE:) 144.161 Tj 0 -94.9336 Td (2557 ide_intr\(\);) 87.3703 Tj 0 -104.427 Td (2558 lapic_eoi\(\);) 91.7388 Tj 0 -113.9203 Td (2559 break;) 65.5277 Tj 0 -123.4137 Td (2560 case IRQ_OFFSET + IRQ_KBD:) 144.161 Tj 0 -132.9071 Td (2561 kbd_intr\(\);) 87.3703 Tj 0 -142.4004 Td (2562 lapic_eoi\(\);) 91.7388 Tj 0 -151.8938 Td (2563 break;) 65.5277 Tj 0 -161.3871 Td (2564 case IRQ_OFFSET + IRQ_SPURIOUS:) 166.0035 Tj 0 -170.8805 Td (2565 cprintf\("cpu%d: spurious interrupt at %x:%x\\n",) 244.6368 Tj 0 -180.3739 Td (2566 cpu\(\), tf->cs, tf->eip\);) 179.1091 Tj 0 -189.8672 Td (2567 lapic_eoi\(\);) 91.7388 Tj 0 -199.3606 Td (2568 break;) 65.5277 Tj 0 -208.8539 Td (2569 ) 21.8426 Tj 0 -218.3473 Td (2570 default:) 65.5277 Tj 0 -227.8407 Td (2571 if\(cp == 0 || \(tf->cs&3\) == 0\){) 174.7406 Tj 0 -237.334 Td (2572 // In kernel, it must be our mistake.) 209.6887 Tj 0 -246.8274 Td (2573 cprintf\("unexpected trap %d from cpu %d eip %x\\n",) 266.4794 Tj 0 -256.3207 Td (2574 tf->trapno, cpu\(\), tf->eip\);) 205.3202 Tj 0 -265.8141 Td (2575 panic\("trap"\);) 109.2129 Tj 0 -275.3075 Td (2576 }) 43.6851 Tj 0 -284.8008 Td (2577 // In user space, assume process misbehaved.) 231.5313 Tj 0 -294.2942 Td (2578 cprintf\("pid %d %s: trap %d err %d on cpu %d eip %x -\ - kill proc\\n",) 336.3756 Tj 0 -303.7875 Td (2579 cp->pid, cp->name, tf->trapno, tf->err, cpu\(\)\ , tf->eip\);) 318.9016 Tj 0 -313.2809 Td (2580 cp->killed = 1;) 104.8443 Tj 0 -322.7743 Td (2581 }) 34.9481 Tj 0 -332.2676 Td (2582 ) 21.8426 Tj 0 -341.761 Td (2583 // Force process exit if it has been killed and is in us\ er space.) 314.533 Tj 0 -351.2543 Td (2584 // \(If it is still executing in the kernel, let it keep\ running) 305.796 Tj 0 -360.7477 Td (2585 // until it gets to the regular system call return.\)) 257.7424 Tj 0 -370.2411 Td (2586 if\(cp && cp->killed && \(tf->cs&3\) == DPL_USER\)) 231.5313 Tj 0 -379.7344 Td (2587 exit\(\);) 69.8962 Tj 0 -389.2278 Td (2588 ) 21.8426 Tj 0 -398.7211 Td (2589 // Force process to give up CPU on clock tick.) 231.5313 Tj 0 -408.2145 Td (2590 // If interrupts were on while locks held, would need to\ check nlock.) 332.0071 Tj 0 -417.7079 Td (2591 if\(cp && cp->state == RUNNING && tf->trapno == IRQ_OFFS\ ET+IRQ_TIMER\)) 327.6386 Tj 0 -427.2012 Td (2592 yield\(\);) 74.2647 Tj 0 -436.6946 Td (2593 }) 26.2111 Tj 0 -446.1879 Td (2594 ) 21.8426 Tj 0 -455.6813 Td (2595 ) 21.8426 Tj 0 -465.1747 Td (2596 ) 21.8426 Tj 0 -474.668 Td (2597 ) 21.8426 Tj 0 -484.1614 Td (2598 ) 21.8426 Tj 0 -493.6547 Td (2599 ) 21.8426 Tj 0 -522.1348 Td (Sheet 25) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 33 33 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/syscall.h Page 1) 174.7406 Tj 0 -28.4801 Td (2600 // System call numbers) 117.9499 Tj 0 -37.9735 Td (2601 #define SYS_fork 1) 113.5814 Tj 0 -47.4668 Td (2602 #define SYS_exit 2) 113.5814 Tj 0 -56.9602 Td (2603 #define SYS_wait 3) 113.5814 Tj 0 -66.4535 Td (2604 #define SYS_pipe 4) 113.5814 Tj 0 -75.9469 Td (2605 #define SYS_write 5) 113.5814 Tj 0 -85.4403 Td (2606 #define SYS_read 6) 113.5814 Tj 0 -94.9336 Td (2607 #define SYS_close 7) 113.5814 Tj 0 -104.427 Td (2608 #define SYS_kill 8) 113.5814 Tj 0 -113.9203 Td (2609 #define SYS_exec 9) 113.5814 Tj 0 -123.4137 Td (2610 #define SYS_open 10) 113.5814 Tj 0 -132.9071 Td (2611 #define SYS_mknod 11) 113.5814 Tj 0 -142.4004 Td (2612 #define SYS_unlink 12) 113.5814 Tj 0 -151.8938 Td (2613 #define SYS_fstat 13) 113.5814 Tj 0 -161.3871 Td (2614 #define SYS_link 14) 113.5814 Tj 0 -170.8805 Td (2615 #define SYS_mkdir 15) 113.5814 Tj 0 -180.3739 Td (2616 #define SYS_chdir 16) 113.5814 Tj 0 -189.8672 Td (2617 #define SYS_dup 17) 113.5814 Tj 0 -199.3606 Td (2618 #define SYS_getpid 18) 113.5814 Tj 0 -208.8539 Td (2619 #define SYS_sbrk 19) 113.5814 Tj 0 -218.3473 Td (2620 #define SYS_sleep 20) 113.5814 Tj 0 -227.8407 Td (2621 ) 21.8426 Tj 0 -237.334 Td (2622 ) 21.8426 Tj 0 -246.8274 Td (2623 ) 21.8426 Tj 0 -256.3207 Td (2624 ) 21.8426 Tj 0 -265.8141 Td (2625 ) 21.8426 Tj 0 -275.3075 Td (2626 ) 21.8426 Tj 0 -284.8008 Td (2627 ) 21.8426 Tj 0 -294.2942 Td (2628 ) 21.8426 Tj 0 -303.7875 Td (2629 ) 21.8426 Tj 0 -313.2809 Td (2630 ) 21.8426 Tj 0 -322.7743 Td (2631 ) 21.8426 Tj 0 -332.2676 Td (2632 ) 21.8426 Tj 0 -341.761 Td (2633 ) 21.8426 Tj 0 -351.2543 Td (2634 ) 21.8426 Tj 0 -360.7477 Td (2635 ) 21.8426 Tj 0 -370.2411 Td (2636 ) 21.8426 Tj 0 -379.7344 Td (2637 ) 21.8426 Tj 0 -389.2278 Td (2638 ) 21.8426 Tj 0 -398.7211 Td (2639 ) 21.8426 Tj 0 -408.2145 Td (2640 ) 21.8426 Tj 0 -417.7079 Td (2641 ) 21.8426 Tj 0 -427.2012 Td (2642 ) 21.8426 Tj 0 -436.6946 Td (2643 ) 21.8426 Tj 0 -446.1879 Td (2644 ) 21.8426 Tj 0 -455.6813 Td (2645 ) 21.8426 Tj 0 -465.1747 Td (2646 ) 21.8426 Tj 0 -474.668 Td (2647 ) 21.8426 Tj 0 -484.1614 Td (2648 ) 21.8426 Tj 0 -493.6547 Td (2649 ) 21.8426 Tj 0 -522.1348 Td (Sheet 26) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/syscall.c Page 1) 174.7406 Tj 0 -28.4801 Td (2650 #include "types.h") 100.4758 Tj 0 -37.9735 Td (2651 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (2652 #include "param.h") 100.4758 Tj 0 -56.9602 Td (2653 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (2654 #include "proc.h") 96.1073 Tj 0 -75.9469 Td (2655 #include "x86.h") 91.7388 Tj 0 -85.4403 Td (2656 #include "syscall.h") 109.2129 Tj 0 -94.9336 Td (2657 ) 21.8426 Tj 0 -104.427 Td (2658 // User code makes a system call with INT T_SYSCALL.) 249.0053 Tj 0 -113.9203 Td (2659 // System call number in %eax.) 152.898 Tj 0 -123.4137 Td (2660 // Arguments on the stack, from the user call to the C) 257.7424 Tj 0 -132.9071 Td (2661 // library system call function. The saved user %esp point\ s) 279.5849 Tj 0 -142.4004 Td (2662 // to a saved program counter, and then the first argument\ .) 279.5849 Tj 0 -151.8938 Td (2663 ) 21.8426 Tj 0 -161.3871 Td (2664 // Fetch the int at addr from process p.) 196.5831 Tj 0 -170.8805 Td (2665 int) 34.9481 Tj 0 -180.3739 Td (2666 fetchint\(struct proc *p, uint addr, int *ip\)) 214.0572 Tj 0 -189.8672 Td (2667 {) 26.2111 Tj 0 -199.3606 Td (2668 if\(addr >= p->sz || addr+4 > p->sz\)) 183.4776 Tj 0 -208.8539 Td (2669 return -1;) 83.0018 Tj 0 -218.3473 Td (2670 *ip = *\(int*\)\(p->mem + addr\);) 157.2665 Tj 0 -227.8407 Td (2671 return 0;) 69.8962 Tj 0 -237.334 Td (2672 }) 26.2111 Tj 0 -246.8274 Td (2673 ) 21.8426 Tj 0 -256.3207 Td (2674 // Fetch the nul-terminated string at addr from process p.) 275.2164 Tj 0 -265.8141 Td (2675 // Doesn't actually copy the string - just sets *pp to poi\ nt at it.) 314.533 Tj 0 -275.3075 Td (2676 // Returns length of string, not including nul.) 227.1628 Tj 0 -284.8008 Td (2677 int) 34.9481 Tj 0 -294.2942 Td (2678 fetchstr\(struct proc *p, uint addr, char **pp\)) 222.7942 Tj 0 -303.7875 Td (2679 {) 26.2111 Tj 0 -313.2809 Td (2680 char *s, *ep;) 87.3703 Tj 0 -322.7743 Td (2681 ) 21.8426 Tj 0 -332.2676 Td (2682 if\(addr >= p->sz\)) 104.8443 Tj 0 -341.761 Td (2683 return -1;) 83.0018 Tj 0 -351.2543 Td (2684 *pp = p->mem + addr;) 117.9499 Tj 0 -360.7477 Td (2685 ep = p->mem + p->sz;) 117.9499 Tj 0 -370.2411 Td (2686 for\(s = *pp; s < ep; s++\)) 139.7925 Tj 0 -379.7344 Td (2687 if\(*s == 0\)) 87.3703 Tj 0 -389.2278 Td (2688 return s - *pp;) 113.5814 Tj 0 -398.7211 Td (2689 return -1;) 74.2647 Tj 0 -408.2145 Td (2690 }) 26.2111 Tj 0 -417.7079 Td (2691 ) 21.8426 Tj 0 -427.2012 Td (2692 // Fetch the nth 32-bit system call argument.) 218.4257 Tj 0 -436.6946 Td (2693 int) 34.9481 Tj 0 -446.1879 Td (2694 argint\(int n, int *ip\)) 117.9499 Tj 0 -455.6813 Td (2695 {) 26.2111 Tj 0 -465.1747 Td (2696 return fetchint\(cp, cp->tf->esp + 4 + 4*n, ip\);) 235.8998 Tj 0 -474.668 Td (2697 }) 26.2111 Tj 0 -484.1614 Td (2698 ) 21.8426 Tj 0 -493.6547 Td (2699 ) 21.8426 Tj 0 -522.1348 Td (Sheet 26) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 34 34 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/syscall.c Page 2) 174.7406 Tj 0 -28.4801 Td (2700 // Fetch the nth word-sized system call argument as a poin\ ter) 288.322 Tj 0 -37.9735 Td (2701 // to a block of memory of size n bytes. Check that the p\ ointer) 301.4275 Tj 0 -47.4668 Td (2702 // lies within the process address space.) 200.9517 Tj 0 -56.9602 Td (2703 int) 34.9481 Tj 0 -66.4535 Td (2704 argptr\(int n, char **pp, int size\)) 170.3721 Tj 0 -75.9469 Td (2705 {) 26.2111 Tj 0 -85.4403 Td (2706 int i;) 56.7907 Tj 0 -94.9336 Td (2707 ) 21.8426 Tj 0 -104.427 Td (2708 if\(argint\(n, &i\) < 0\)) 122.3184 Tj 0 -113.9203 Td (2709 return -1;) 83.0018 Tj 0 -123.4137 Td (2710 if\(\(uint\)i >= cp->sz || \(uint\)i+size >= cp->sz\)) 235.8998 Tj 0 -132.9071 Td (2711 return -1;) 83.0018 Tj 0 -142.4004 Td (2712 *pp = cp->mem + i;) 109.2129 Tj 0 -151.8938 Td (2713 return 0;) 69.8962 Tj 0 -161.3871 Td (2714 }) 26.2111 Tj 0 -170.8805 Td (2715 ) 21.8426 Tj 0 -180.3739 Td (2716 // Fetch the nth word-sized system call argument as a stri\ ng pointer.) 323.2701 Tj 0 -189.8672 Td (2717 // Check that the pointer is valid and the string is nul-t\ erminated.) 318.9016 Tj 0 -199.3606 Td (2718 // \(There is no shared writable memory, so the string can\ 't change) 310.1645 Tj 0 -208.8539 Td (2719 // between this check and being used by the kernel.\)) 249.0053 Tj 0 -218.3473 Td (2720 int) 34.9481 Tj 0 -227.8407 Td (2721 argstr\(int n, char **pp\)) 126.6869 Tj 0 -237.334 Td (2722 {) 26.2111 Tj 0 -246.8274 Td (2723 int addr;) 69.8962 Tj 0 -256.3207 Td (2724 if\(argint\(n, &addr\) < 0\)) 135.4239 Tj 0 -265.8141 Td (2725 return -1;) 83.0018 Tj 0 -275.3075 Td (2726 return fetchstr\(cp, addr, pp\);) 161.635 Tj 0 -284.8008 Td (2727 }) 26.2111 Tj 0 -294.2942 Td (2728 ) 21.8426 Tj 0 -303.7875 Td (2729 extern int sys_chdir\(void\);) 139.7925 Tj 0 -313.2809 Td (2730 extern int sys_close\(void\);) 139.7925 Tj 0 -322.7743 Td (2731 extern int sys_dup\(void\);) 131.0554 Tj 0 -332.2676 Td (2732 extern int sys_exec\(void\);) 135.4239 Tj 0 -341.761 Td (2733 extern int sys_exit\(void\);) 135.4239 Tj 0 -351.2543 Td (2734 extern int sys_fork\(void\);) 135.4239 Tj 0 -360.7477 Td (2735 extern int sys_fstat\(void\);) 139.7925 Tj 0 -370.2411 Td (2736 extern int sys_getpid\(void\);) 144.161 Tj 0 -379.7344 Td (2737 extern int sys_kill\(void\);) 135.4239 Tj 0 -389.2278 Td (2738 extern int sys_link\(void\);) 135.4239 Tj 0 -398.7211 Td (2739 extern int sys_mkdir\(void\);) 139.7925 Tj 0 -408.2145 Td (2740 extern int sys_mknod\(void\);) 139.7925 Tj 0 -417.7079 Td (2741 extern int sys_open\(void\);) 135.4239 Tj 0 -427.2012 Td (2742 extern int sys_pipe\(void\);) 135.4239 Tj 0 -436.6946 Td (2743 extern int sys_read\(void\);) 135.4239 Tj 0 -446.1879 Td (2744 extern int sys_sbrk\(void\);) 135.4239 Tj 0 -455.6813 Td (2745 extern int sys_sleep\(void\);) 139.7925 Tj 0 -465.1747 Td (2746 extern int sys_unlink\(void\);) 144.161 Tj 0 -474.668 Td (2747 extern int sys_wait\(void\);) 135.4239 Tj 0 -484.1614 Td (2748 extern int sys_write\(void\);) 139.7925 Tj 0 -493.6547 Td (2749 ) 21.8426 Tj 0 -522.1348 Td (Sheet 27) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/syscall.c Page 3) 174.7406 Tj 0 -28.4801 Td (2750 static int \(*syscalls[]\)\(void\) = {) 170.3721 Tj 0 -37.9735 Td (2751 [SYS_chdir] sys_chdir,) 126.6869 Tj 0 -47.4668 Td (2752 [SYS_close] sys_close,) 126.6869 Tj 0 -56.9602 Td (2753 [SYS_dup] sys_dup,) 117.9499 Tj 0 -66.4535 Td (2754 [SYS_exec] sys_exec,) 122.3184 Tj 0 -75.9469 Td (2755 [SYS_exit] sys_exit,) 122.3184 Tj 0 -85.4403 Td (2756 [SYS_fork] sys_fork,) 122.3184 Tj 0 -94.9336 Td (2757 [SYS_fstat] sys_fstat,) 126.6869 Tj 0 -104.427 Td (2758 [SYS_getpid] sys_getpid,) 131.0554 Tj 0 -113.9203 Td (2759 [SYS_kill] sys_kill,) 122.3184 Tj 0 -123.4137 Td (2760 [SYS_link] sys_link,) 122.3184 Tj 0 -132.9071 Td (2761 [SYS_mkdir] sys_mkdir,) 126.6869 Tj 0 -142.4004 Td (2762 [SYS_mknod] sys_mknod,) 126.6869 Tj 0 -151.8938 Td (2763 [SYS_open] sys_open,) 122.3184 Tj 0 -161.3871 Td (2764 [SYS_pipe] sys_pipe,) 122.3184 Tj 0 -170.8805 Td (2765 [SYS_read] sys_read,) 122.3184 Tj 0 -180.3739 Td (2766 [SYS_sbrk] sys_sbrk,) 122.3184 Tj 0 -189.8672 Td (2767 [SYS_sleep] sys_sleep,) 126.6869 Tj 0 -199.3606 Td (2768 [SYS_unlink] sys_unlink,) 131.0554 Tj 0 -208.8539 Td (2769 [SYS_wait] sys_wait,) 122.3184 Tj 0 -218.3473 Td (2770 [SYS_write] sys_write,) 126.6869 Tj 0 -227.8407 Td (2771 };) 30.5796 Tj 0 -237.334 Td (2772 ) 21.8426 Tj 0 -246.8274 Td (2773 void) 39.3166 Tj 0 -256.3207 Td (2774 syscall\(void\)) 78.6333 Tj 0 -265.8141 Td (2775 {) 26.2111 Tj 0 -275.3075 Td (2776 int num;) 65.5277 Tj 0 -284.8008 Td (2777 ) 21.8426 Tj 0 -294.2942 Td (2778 num = cp->tf->eax;) 109.2129 Tj 0 -303.7875 Td (2779 if\(num >= 0 && num < NELEM\(syscalls\) && syscalls[num]\ \)) 266.4794 Tj 0 -313.2809 Td (2780 cp->tf->eax = syscalls[num]\(\);) 170.3721 Tj 0 -322.7743 Td (2781 else {) 56.7907 Tj 0 -332.2676 Td (2782 cprintf\("%d %s: unknown sys call %d\\n",) 209.6887 Tj 0 -341.761 Td (2783 cp->pid, cp->name, num\);) 179.1091 Tj 0 -351.2543 Td (2784 cp->tf->eax = -1;) 113.5814 Tj 0 -360.7477 Td (2785 }) 34.9481 Tj 0 -370.2411 Td (2786 }) 26.2111 Tj 0 -379.7344 Td (2787 ) 21.8426 Tj 0 -389.2278 Td (2788 ) 21.8426 Tj 0 -398.7211 Td (2789 ) 21.8426 Tj 0 -408.2145 Td (2790 ) 21.8426 Tj 0 -417.7079 Td (2791 ) 21.8426 Tj 0 -427.2012 Td (2792 ) 21.8426 Tj 0 -436.6946 Td (2793 ) 21.8426 Tj 0 -446.1879 Td (2794 ) 21.8426 Tj 0 -455.6813 Td (2795 ) 21.8426 Tj 0 -465.1747 Td (2796 ) 21.8426 Tj 0 -474.668 Td (2797 ) 21.8426 Tj 0 -484.1614 Td (2798 ) 21.8426 Tj 0 -493.6547 Td (2799 ) 21.8426 Tj 0 -522.1348 Td (Sheet 27) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 35 35 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sysproc.c Page 1) 174.7406 Tj 0 -28.4801 Td (2800 #include "types.h") 100.4758 Tj 0 -37.9735 Td (2801 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (2802 #include "param.h") 100.4758 Tj 0 -56.9602 Td (2803 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (2804 #include "proc.h") 96.1073 Tj 0 -75.9469 Td (2805 ) 21.8426 Tj 0 -85.4403 Td (2806 int) 34.9481 Tj 0 -94.9336 Td (2807 sys_fork\(void\)) 83.0018 Tj 0 -104.427 Td (2808 {) 26.2111 Tj 0 -113.9203 Td (2809 int pid;) 65.5277 Tj 0 -123.4137 Td (2810 struct proc *np;) 100.4758 Tj 0 -132.9071 Td (2811 ) 21.8426 Tj 0 -142.4004 Td (2812 if\(\(np = copyproc\(cp\)\) == 0\)) 152.898 Tj 0 -151.8938 Td (2813 return -1;) 83.0018 Tj 0 -161.3871 Td (2814 pid = np->pid;) 91.7388 Tj 0 -170.8805 Td (2815 np->state = RUNNABLE;) 122.3184 Tj 0 -180.3739 Td (2816 return pid;) 78.6333 Tj 0 -189.8672 Td (2817 }) 26.2111 Tj 0 -199.3606 Td (2818 ) 21.8426 Tj 0 -208.8539 Td (2819 int) 34.9481 Tj 0 -218.3473 Td (2820 sys_exit\(void\)) 83.0018 Tj 0 -227.8407 Td (2821 {) 26.2111 Tj 0 -237.334 Td (2822 exit\(\);) 61.1592 Tj 0 -246.8274 Td (2823 return 0; // not reached) 139.7925 Tj 0 -256.3207 Td (2824 }) 26.2111 Tj 0 -265.8141 Td (2825 ) 21.8426 Tj 0 -275.3075 Td (2826 int) 34.9481 Tj 0 -284.8008 Td (2827 sys_wait\(void\)) 83.0018 Tj 0 -294.2942 Td (2828 {) 26.2111 Tj 0 -303.7875 Td (2829 return wait\(\);) 91.7388 Tj 0 -313.2809 Td (2830 }) 26.2111 Tj 0 -322.7743 Td (2831 ) 21.8426 Tj 0 -332.2676 Td (2832 int) 34.9481 Tj 0 -341.761 Td (2833 sys_kill\(void\)) 83.0018 Tj 0 -351.2543 Td (2834 {) 26.2111 Tj 0 -360.7477 Td (2835 int pid;) 65.5277 Tj 0 -370.2411 Td (2836 ) 21.8426 Tj 0 -379.7344 Td (2837 if\(argint\(0, &pid\) < 0\)) 131.0554 Tj 0 -389.2278 Td (2838 return -1;) 83.0018 Tj 0 -398.7211 Td (2839 return kill\(pid\);) 104.8443 Tj 0 -408.2145 Td (2840 }) 26.2111 Tj 0 -417.7079 Td (2841 ) 21.8426 Tj 0 -427.2012 Td (2842 int) 34.9481 Tj 0 -436.6946 Td (2843 sys_getpid\(void\)) 91.7388 Tj 0 -446.1879 Td (2844 {) 26.2111 Tj 0 -455.6813 Td (2845 return cp->pid;) 96.1073 Tj 0 -465.1747 Td (2846 }) 26.2111 Tj 0 -474.668 Td (2847 ) 21.8426 Tj 0 -484.1614 Td (2848 ) 21.8426 Tj 0 -493.6547 Td (2849 ) 21.8426 Tj 0 -522.1348 Td (Sheet 28) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sysproc.c Page 2) 174.7406 Tj 0 -28.4801 Td (2850 int) 34.9481 Tj 0 -37.9735 Td (2851 sys_sbrk\(void\)) 83.0018 Tj 0 -47.4668 Td (2852 {) 26.2111 Tj 0 -56.9602 Td (2853 int addr;) 69.8962 Tj 0 -66.4535 Td (2854 int n;) 56.7907 Tj 0 -75.9469 Td (2855 ) 21.8426 Tj 0 -85.4403 Td (2856 if\(argint\(0, &n\) < 0\)) 122.3184 Tj 0 -94.9336 Td (2857 return -1;) 83.0018 Tj 0 -104.427 Td (2858 if\(\(addr = growproc\(n\)\) < 0\)) 152.898 Tj 0 -113.9203 Td (2859 return -1;) 83.0018 Tj 0 -123.4137 Td (2860 return addr;) 83.0018 Tj 0 -132.9071 Td (2861 }) 26.2111 Tj 0 -142.4004 Td (2862 ) 21.8426 Tj 0 -151.8938 Td (2863 int) 34.9481 Tj 0 -161.3871 Td (2864 sys_sleep\(void\)) 87.3703 Tj 0 -170.8805 Td (2865 {) 26.2111 Tj 0 -180.3739 Td (2866 int n, ticks0;) 91.7388 Tj 0 -189.8672 Td (2867 ) 21.8426 Tj 0 -199.3606 Td (2868 if\(argint\(0, &n\) < 0\)) 122.3184 Tj 0 -208.8539 Td (2869 return -1;) 83.0018 Tj 0 -218.3473 Td (2870 acquire\(&tickslock\);) 117.9499 Tj 0 -227.8407 Td (2871 ticks0 = ticks;) 96.1073 Tj 0 -237.334 Td (2872 while\(ticks - ticks0 < n\){) 144.161 Tj 0 -246.8274 Td (2873 if\(cp->killed\){) 104.8443 Tj 0 -256.3207 Td (2874 release\(&tickslock\);) 135.4239 Tj 0 -265.8141 Td (2875 return -1;) 91.7388 Tj 0 -275.3075 Td (2876 }) 43.6851 Tj 0 -284.8008 Td (2877 sleep\(&ticks, &tickslock\);) 152.898 Tj 0 -294.2942 Td (2878 }) 34.9481 Tj 0 -303.7875 Td (2879 release\(&tickslock\);) 117.9499 Tj 0 -313.2809 Td (2880 return 0;) 69.8962 Tj 0 -322.7743 Td (2881 }) 26.2111 Tj 0 -332.2676 Td (2882 ) 21.8426 Tj 0 -341.761 Td (2883 ) 21.8426 Tj 0 -351.2543 Td (2884 ) 21.8426 Tj 0 -360.7477 Td (2885 ) 21.8426 Tj 0 -370.2411 Td (2886 ) 21.8426 Tj 0 -379.7344 Td (2887 ) 21.8426 Tj 0 -389.2278 Td (2888 ) 21.8426 Tj 0 -398.7211 Td (2889 ) 21.8426 Tj 0 -408.2145 Td (2890 ) 21.8426 Tj 0 -417.7079 Td (2891 ) 21.8426 Tj 0 -427.2012 Td (2892 ) 21.8426 Tj 0 -436.6946 Td (2893 ) 21.8426 Tj 0 -446.1879 Td (2894 ) 21.8426 Tj 0 -455.6813 Td (2895 ) 21.8426 Tj 0 -465.1747 Td (2896 ) 21.8426 Tj 0 -474.668 Td (2897 ) 21.8426 Tj 0 -484.1614 Td (2898 ) 21.8426 Tj 0 -493.6547 Td (2899 ) 21.8426 Tj 0 -522.1348 Td (Sheet 28) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 36 36 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/buf.h Page 1) 157.2665 Tj 0 -28.4801 Td (2900 struct buf {) 74.2647 Tj 0 -37.9735 Td (2901 int flags;) 74.2647 Tj 0 -47.4668 Td (2902 uint dev;) 69.8962 Tj 0 -56.9602 Td (2903 uint sector;) 83.0018 Tj 0 -66.4535 Td (2904 struct buf *prev; // LRU cache list) 183.4776 Tj 0 -75.9469 Td (2905 struct buf *next;) 104.8443 Tj 0 -85.4403 Td (2906 struct buf *qnext; // disk queue) 170.3721 Tj 0 -94.9336 Td (2907 uchar data[512];) 100.4758 Tj 0 -104.427 Td (2908 };) 30.5796 Tj 0 -113.9203 Td (2909 #define B_BUSY 0x1 // buffer is locked by some process) 266.4794 Tj 0 -123.4137 Td (2910 #define B_VALID 0x2 // buffer has been read from disk) 257.7424 Tj 0 -132.9071 Td (2911 #define B_DIRTY 0x4 // buffer needs to be written to disk) 275.2164 Tj 0 -142.4004 Td (2912 ) 21.8426 Tj 0 -151.8938 Td (2913 ) 21.8426 Tj 0 -161.3871 Td (2914 ) 21.8426 Tj 0 -170.8805 Td (2915 ) 21.8426 Tj 0 -180.3739 Td (2916 ) 21.8426 Tj 0 -189.8672 Td (2917 ) 21.8426 Tj 0 -199.3606 Td (2918 ) 21.8426 Tj 0 -208.8539 Td (2919 ) 21.8426 Tj 0 -218.3473 Td (2920 ) 21.8426 Tj 0 -227.8407 Td (2921 ) 21.8426 Tj 0 -237.334 Td (2922 ) 21.8426 Tj 0 -246.8274 Td (2923 ) 21.8426 Tj 0 -256.3207 Td (2924 ) 21.8426 Tj 0 -265.8141 Td (2925 ) 21.8426 Tj 0 -275.3075 Td (2926 ) 21.8426 Tj 0 -284.8008 Td (2927 ) 21.8426 Tj 0 -294.2942 Td (2928 ) 21.8426 Tj 0 -303.7875 Td (2929 ) 21.8426 Tj 0 -313.2809 Td (2930 ) 21.8426 Tj 0 -322.7743 Td (2931 ) 21.8426 Tj 0 -332.2676 Td (2932 ) 21.8426 Tj 0 -341.761 Td (2933 ) 21.8426 Tj 0 -351.2543 Td (2934 ) 21.8426 Tj 0 -360.7477 Td (2935 ) 21.8426 Tj 0 -370.2411 Td (2936 ) 21.8426 Tj 0 -379.7344 Td (2937 ) 21.8426 Tj 0 -389.2278 Td (2938 ) 21.8426 Tj 0 -398.7211 Td (2939 ) 21.8426 Tj 0 -408.2145 Td (2940 ) 21.8426 Tj 0 -417.7079 Td (2941 ) 21.8426 Tj 0 -427.2012 Td (2942 ) 21.8426 Tj 0 -436.6946 Td (2943 ) 21.8426 Tj 0 -446.1879 Td (2944 ) 21.8426 Tj 0 -455.6813 Td (2945 ) 21.8426 Tj 0 -465.1747 Td (2946 ) 21.8426 Tj 0 -474.668 Td (2947 ) 21.8426 Tj 0 -484.1614 Td (2948 ) 21.8426 Tj 0 -493.6547 Td (2949 ) 21.8426 Tj 0 -522.1348 Td (Sheet 29) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/dev.h Page 1) 157.2665 Tj 0 -28.4801 Td (2950 struct devsw {) 83.0018 Tj 0 -37.9735 Td (2951 int \(*read\)\(struct inode*, char*, int\);) 200.9517 Tj 0 -47.4668 Td (2952 int \(*write\)\(struct inode*, char*, int\);) 205.3202 Tj 0 -56.9602 Td (2953 };) 30.5796 Tj 0 -66.4535 Td (2954 ) 21.8426 Tj 0 -75.9469 Td (2955 extern struct devsw devsw[];) 144.161 Tj 0 -85.4403 Td (2956 ) 21.8426 Tj 0 -94.9336 Td (2957 #define CONSOLE 1) 96.1073 Tj 0 -104.427 Td (2958 ) 21.8426 Tj 0 -113.9203 Td (2959 ) 21.8426 Tj 0 -123.4137 Td (2960 ) 21.8426 Tj 0 -132.9071 Td (2961 ) 21.8426 Tj 0 -142.4004 Td (2962 ) 21.8426 Tj 0 -151.8938 Td (2963 ) 21.8426 Tj 0 -161.3871 Td (2964 ) 21.8426 Tj 0 -170.8805 Td (2965 ) 21.8426 Tj 0 -180.3739 Td (2966 ) 21.8426 Tj 0 -189.8672 Td (2967 ) 21.8426 Tj 0 -199.3606 Td (2968 ) 21.8426 Tj 0 -208.8539 Td (2969 ) 21.8426 Tj 0 -218.3473 Td (2970 ) 21.8426 Tj 0 -227.8407 Td (2971 ) 21.8426 Tj 0 -237.334 Td (2972 ) 21.8426 Tj 0 -246.8274 Td (2973 ) 21.8426 Tj 0 -256.3207 Td (2974 ) 21.8426 Tj 0 -265.8141 Td (2975 ) 21.8426 Tj 0 -275.3075 Td (2976 ) 21.8426 Tj 0 -284.8008 Td (2977 ) 21.8426 Tj 0 -294.2942 Td (2978 ) 21.8426 Tj 0 -303.7875 Td (2979 ) 21.8426 Tj 0 -313.2809 Td (2980 ) 21.8426 Tj 0 -322.7743 Td (2981 ) 21.8426 Tj 0 -332.2676 Td (2982 ) 21.8426 Tj 0 -341.761 Td (2983 ) 21.8426 Tj 0 -351.2543 Td (2984 ) 21.8426 Tj 0 -360.7477 Td (2985 ) 21.8426 Tj 0 -370.2411 Td (2986 ) 21.8426 Tj 0 -379.7344 Td (2987 ) 21.8426 Tj 0 -389.2278 Td (2988 ) 21.8426 Tj 0 -398.7211 Td (2989 ) 21.8426 Tj 0 -408.2145 Td (2990 ) 21.8426 Tj 0 -417.7079 Td (2991 ) 21.8426 Tj 0 -427.2012 Td (2992 ) 21.8426 Tj 0 -436.6946 Td (2993 ) 21.8426 Tj 0 -446.1879 Td (2994 ) 21.8426 Tj 0 -455.6813 Td (2995 ) 21.8426 Tj 0 -465.1747 Td (2996 ) 21.8426 Tj 0 -474.668 Td (2997 ) 21.8426 Tj 0 -484.1614 Td (2998 ) 21.8426 Tj 0 -493.6547 Td (2999 ) 21.8426 Tj 0 -522.1348 Td (Sheet 29) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 37 37 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fcntl.h Page 1) 166.0035 Tj 0 -28.4801 Td (3000 #define O_RDONLY 0x000) 122.3184 Tj 0 -37.9735 Td (3001 #define O_WRONLY 0x001) 122.3184 Tj 0 -47.4668 Td (3002 #define O_RDWR 0x002) 122.3184 Tj 0 -56.9602 Td (3003 #define O_CREATE 0x200) 122.3184 Tj 0 -66.4535 Td (3004 ) 21.8426 Tj 0 -75.9469 Td (3005 ) 21.8426 Tj 0 -85.4403 Td (3006 ) 21.8426 Tj 0 -94.9336 Td (3007 ) 21.8426 Tj 0 -104.427 Td (3008 ) 21.8426 Tj 0 -113.9203 Td (3009 ) 21.8426 Tj 0 -123.4137 Td (3010 ) 21.8426 Tj 0 -132.9071 Td (3011 ) 21.8426 Tj 0 -142.4004 Td (3012 ) 21.8426 Tj 0 -151.8938 Td (3013 ) 21.8426 Tj 0 -161.3871 Td (3014 ) 21.8426 Tj 0 -170.8805 Td (3015 ) 21.8426 Tj 0 -180.3739 Td (3016 ) 21.8426 Tj 0 -189.8672 Td (3017 ) 21.8426 Tj 0 -199.3606 Td (3018 ) 21.8426 Tj 0 -208.8539 Td (3019 ) 21.8426 Tj 0 -218.3473 Td (3020 ) 21.8426 Tj 0 -227.8407 Td (3021 ) 21.8426 Tj 0 -237.334 Td (3022 ) 21.8426 Tj 0 -246.8274 Td (3023 ) 21.8426 Tj 0 -256.3207 Td (3024 ) 21.8426 Tj 0 -265.8141 Td (3025 ) 21.8426 Tj 0 -275.3075 Td (3026 ) 21.8426 Tj 0 -284.8008 Td (3027 ) 21.8426 Tj 0 -294.2942 Td (3028 ) 21.8426 Tj 0 -303.7875 Td (3029 ) 21.8426 Tj 0 -313.2809 Td (3030 ) 21.8426 Tj 0 -322.7743 Td (3031 ) 21.8426 Tj 0 -332.2676 Td (3032 ) 21.8426 Tj 0 -341.761 Td (3033 ) 21.8426 Tj 0 -351.2543 Td (3034 ) 21.8426 Tj 0 -360.7477 Td (3035 ) 21.8426 Tj 0 -370.2411 Td (3036 ) 21.8426 Tj 0 -379.7344 Td (3037 ) 21.8426 Tj 0 -389.2278 Td (3038 ) 21.8426 Tj 0 -398.7211 Td (3039 ) 21.8426 Tj 0 -408.2145 Td (3040 ) 21.8426 Tj 0 -417.7079 Td (3041 ) 21.8426 Tj 0 -427.2012 Td (3042 ) 21.8426 Tj 0 -436.6946 Td (3043 ) 21.8426 Tj 0 -446.1879 Td (3044 ) 21.8426 Tj 0 -455.6813 Td (3045 ) 21.8426 Tj 0 -465.1747 Td (3046 ) 21.8426 Tj 0 -474.668 Td (3047 ) 21.8426 Tj 0 -484.1614 Td (3048 ) 21.8426 Tj 0 -493.6547 Td (3049 ) 21.8426 Tj 0 -522.1348 Td (Sheet 30) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/stat.h Page 1) 161.635 Tj 0 -28.4801 Td (3050 struct stat {) 78.6333 Tj 0 -37.9735 Td (3051 int dev; // Device number) 157.2665 Tj 0 -47.4668 Td (3052 uint ino; // Inode number on device) 196.5831 Tj 0 -56.9602 Td (3053 short type; // Type of file) 152.898 Tj 0 -66.4535 Td (3054 short nlink; // Number of links to file) 200.9517 Tj 0 -75.9469 Td (3055 uint size; // Size of file in bytes) 192.2146 Tj 0 -85.4403 Td (3056 };) 30.5796 Tj 0 -94.9336 Td (3057 ) 21.8426 Tj 0 -104.427 Td (3058 ) 21.8426 Tj 0 -113.9203 Td (3059 ) 21.8426 Tj 0 -123.4137 Td (3060 ) 21.8426 Tj 0 -132.9071 Td (3061 ) 21.8426 Tj 0 -142.4004 Td (3062 ) 21.8426 Tj 0 -151.8938 Td (3063 ) 21.8426 Tj 0 -161.3871 Td (3064 ) 21.8426 Tj 0 -170.8805 Td (3065 ) 21.8426 Tj 0 -180.3739 Td (3066 ) 21.8426 Tj 0 -189.8672 Td (3067 ) 21.8426 Tj 0 -199.3606 Td (3068 ) 21.8426 Tj 0 -208.8539 Td (3069 ) 21.8426 Tj 0 -218.3473 Td (3070 ) 21.8426 Tj 0 -227.8407 Td (3071 ) 21.8426 Tj 0 -237.334 Td (3072 ) 21.8426 Tj 0 -246.8274 Td (3073 ) 21.8426 Tj 0 -256.3207 Td (3074 ) 21.8426 Tj 0 -265.8141 Td (3075 ) 21.8426 Tj 0 -275.3075 Td (3076 ) 21.8426 Tj 0 -284.8008 Td (3077 ) 21.8426 Tj 0 -294.2942 Td (3078 ) 21.8426 Tj 0 -303.7875 Td (3079 ) 21.8426 Tj 0 -313.2809 Td (3080 ) 21.8426 Tj 0 -322.7743 Td (3081 ) 21.8426 Tj 0 -332.2676 Td (3082 ) 21.8426 Tj 0 -341.761 Td (3083 ) 21.8426 Tj 0 -351.2543 Td (3084 ) 21.8426 Tj 0 -360.7477 Td (3085 ) 21.8426 Tj 0 -370.2411 Td (3086 ) 21.8426 Tj 0 -379.7344 Td (3087 ) 21.8426 Tj 0 -389.2278 Td (3088 ) 21.8426 Tj 0 -398.7211 Td (3089 ) 21.8426 Tj 0 -408.2145 Td (3090 ) 21.8426 Tj 0 -417.7079 Td (3091 ) 21.8426 Tj 0 -427.2012 Td (3092 ) 21.8426 Tj 0 -436.6946 Td (3093 ) 21.8426 Tj 0 -446.1879 Td (3094 ) 21.8426 Tj 0 -455.6813 Td (3095 ) 21.8426 Tj 0 -465.1747 Td (3096 ) 21.8426 Tj 0 -474.668 Td (3097 ) 21.8426 Tj 0 -484.1614 Td (3098 ) 21.8426 Tj 0 -493.6547 Td (3099 ) 21.8426 Tj 0 -522.1348 Td (Sheet 30) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 38 38 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/file.h Page 1) 161.635 Tj 0 -28.4801 Td (3100 struct file {) 78.6333 Tj 0 -37.9735 Td (3101 enum { FD_CLOSED, FD_NONE, FD_PIPE, FD_INODE } type;) 257.7424 Tj 0 -47.4668 Td (3102 int ref; // reference count) 148.5295 Tj 0 -56.9602 Td (3103 char readable;) 91.7388 Tj 0 -66.4535 Td (3104 char writable;) 91.7388 Tj 0 -75.9469 Td (3105 struct pipe *pipe;) 109.2129 Tj 0 -85.4403 Td (3106 struct inode *ip;) 104.8443 Tj 0 -94.9336 Td (3107 uint off;) 69.8962 Tj 0 -104.427 Td (3108 };) 30.5796 Tj 0 -113.9203 Td (3109 ) 21.8426 Tj 0 -123.4137 Td (3110 ) 21.8426 Tj 0 -132.9071 Td (3111 ) 21.8426 Tj 0 -142.4004 Td (3112 ) 21.8426 Tj 0 -151.8938 Td (3113 ) 21.8426 Tj 0 -161.3871 Td (3114 ) 21.8426 Tj 0 -170.8805 Td (3115 ) 21.8426 Tj 0 -180.3739 Td (3116 ) 21.8426 Tj 0 -189.8672 Td (3117 ) 21.8426 Tj 0 -199.3606 Td (3118 ) 21.8426 Tj 0 -208.8539 Td (3119 ) 21.8426 Tj 0 -218.3473 Td (3120 ) 21.8426 Tj 0 -227.8407 Td (3121 ) 21.8426 Tj 0 -237.334 Td (3122 ) 21.8426 Tj 0 -246.8274 Td (3123 ) 21.8426 Tj 0 -256.3207 Td (3124 ) 21.8426 Tj 0 -265.8141 Td (3125 ) 21.8426 Tj 0 -275.3075 Td (3126 ) 21.8426 Tj 0 -284.8008 Td (3127 ) 21.8426 Tj 0 -294.2942 Td (3128 ) 21.8426 Tj 0 -303.7875 Td (3129 ) 21.8426 Tj 0 -313.2809 Td (3130 ) 21.8426 Tj 0 -322.7743 Td (3131 ) 21.8426 Tj 0 -332.2676 Td (3132 ) 21.8426 Tj 0 -341.761 Td (3133 ) 21.8426 Tj 0 -351.2543 Td (3134 ) 21.8426 Tj 0 -360.7477 Td (3135 ) 21.8426 Tj 0 -370.2411 Td (3136 ) 21.8426 Tj 0 -379.7344 Td (3137 ) 21.8426 Tj 0 -389.2278 Td (3138 ) 21.8426 Tj 0 -398.7211 Td (3139 ) 21.8426 Tj 0 -408.2145 Td (3140 ) 21.8426 Tj 0 -417.7079 Td (3141 ) 21.8426 Tj 0 -427.2012 Td (3142 ) 21.8426 Tj 0 -436.6946 Td (3143 ) 21.8426 Tj 0 -446.1879 Td (3144 ) 21.8426 Tj 0 -455.6813 Td (3145 ) 21.8426 Tj 0 -465.1747 Td (3146 ) 21.8426 Tj 0 -474.668 Td (3147 ) 21.8426 Tj 0 -484.1614 Td (3148 ) 21.8426 Tj 0 -493.6547 Td (3149 ) 21.8426 Tj 0 -522.1348 Td (Sheet 31) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.h Page 1) 152.898 Tj 0 -28.4801 Td (3150 // On-disk file system format.) 152.898 Tj 0 -37.9735 Td (3151 // Both the kernel and user programs use this header file.) 275.2164 Tj 0 -47.4668 Td (3152 ) 21.8426 Tj 0 -56.9602 Td (3153 // Block 0 is unused.) 113.5814 Tj 0 -66.4535 Td (3154 // Block 1 is super block.) 135.4239 Tj 0 -75.9469 Td (3155 // Inodes start at block 2.) 139.7925 Tj 0 -85.4403 Td (3156 ) 21.8426 Tj 0 -94.9336 Td (3157 #define BSIZE 512 // block size) 161.635 Tj 0 -104.427 Td (3158 ) 21.8426 Tj 0 -113.9203 Td (3159 // File system super block) 135.4239 Tj 0 -123.4137 Td (3160 struct superblock {) 104.8443 Tj 0 -132.9071 Td (3161 uint size; // Size of file system image \(blocks\ \)) 275.2164 Tj 0 -142.4004 Td (3162 uint nblocks; // Number of data blocks) 218.4257 Tj 0 -151.8938 Td (3163 uint ninodes; // Number of inodes.) 200.9517 Tj 0 -161.3871 Td (3164 };) 30.5796 Tj 0 -170.8805 Td (3165 ) 21.8426 Tj 0 -180.3739 Td (3166 #define NADDRS \(NDIRECT+1\)) 135.4239 Tj 0 -189.8672 Td (3167 #define NDIRECT 12) 100.4758 Tj 0 -199.3606 Td (3168 #define INDIRECT 12) 104.8443 Tj 0 -208.8539 Td (3169 #define NINDIRECT \(BSIZE / sizeof\(uint\)\)) 196.5831 Tj 0 -218.3473 Td (3170 #define MAXFILE \(NDIRECT + NINDIRECT\)) 187.8461 Tj 0 -227.8407 Td (3171 ) 21.8426 Tj 0 -237.334 Td (3172 // On-disk inode structure) 135.4239 Tj 0 -246.8274 Td (3173 struct dinode {) 87.3703 Tj 0 -256.3207 Td (3174 short type; // File type) 179.1091 Tj 0 -265.8141 Td (3175 short major; // Major device number \(T_DEV onl\ y\)) 279.5849 Tj 0 -275.3075 Td (3176 short minor; // Minor device number \(T_DEV onl\ y\)) 279.5849 Tj 0 -284.8008 Td (3177 short nlink; // Number of links to inode in fil\ e system) 310.1645 Tj 0 -294.2942 Td (3178 uint size; // Size of file \(bytes\)) 227.1628 Tj 0 -303.7875 Td (3179 uint addrs[NADDRS]; // Data block addresses) 227.1628 Tj 0 -313.2809 Td (3180 };) 30.5796 Tj 0 -322.7743 Td (3181 ) 21.8426 Tj 0 -332.2676 Td (3182 #define T_DIR 1 // Directory) 157.2665 Tj 0 -341.761 Td (3183 #define T_FILE 2 // File) 135.4239 Tj 0 -351.2543 Td (3184 #define T_DEV 3 // Special device) 179.1091 Tj 0 -360.7477 Td (3185 ) 21.8426 Tj 0 -370.2411 Td (3186 // Inodes per block.) 109.2129 Tj 0 -379.7344 Td (3187 #define IPB \(BSIZE / sizeof\(struct dinode\)\)) 253.3738 Tj 0 -389.2278 Td (3188 ) 21.8426 Tj 0 -398.7211 Td (3189 // Block containing inode i) 139.7925 Tj 0 -408.2145 Td (3190 #define IBLOCK\(i\) \(\(i\) / IPB + 2\)) 183.4776 Tj 0 -417.7079 Td (3191 ) 21.8426 Tj 0 -427.2012 Td (3192 // Bitmap bits per block) 126.6869 Tj 0 -436.6946 Td (3193 #define BPB \(BSIZE*8\)) 157.2665 Tj 0 -446.1879 Td (3194 ) 21.8426 Tj 0 -455.6813 Td (3195 // Block containing bit for block b) 174.7406 Tj 0 -465.1747 Td (3196 #define BBLOCK\(b, ninodes\) \(b/BPB + \(ninodes\)/IPB + 3\ \)) 257.7424 Tj 0 -474.668 Td (3197 ) 21.8426 Tj 0 -484.1614 Td (3198 ) 21.8426 Tj 0 -493.6547 Td (3199 ) 21.8426 Tj 0 -522.1348 Td (Sheet 31) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 39 39 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.h Page 2) 152.898 Tj 0 -28.4801 Td (3200 // Directory is a file containing a sequence of dirent str\ uctures.) 310.1645 Tj 0 -37.9735 Td (3201 #define DIRSIZ 14) 96.1073 Tj 0 -47.4668 Td (3202 ) 21.8426 Tj 0 -56.9602 Td (3203 struct dirent {) 87.3703 Tj 0 -66.4535 Td (3204 ushort inum;) 83.0018 Tj 0 -75.9469 Td (3205 char name[DIRSIZ];) 109.2129 Tj 0 -85.4403 Td (3206 };) 30.5796 Tj 0 -94.9336 Td (3207 ) 21.8426 Tj 0 -104.427 Td (3208 ) 21.8426 Tj 0 -113.9203 Td (3209 ) 21.8426 Tj 0 -123.4137 Td (3210 ) 21.8426 Tj 0 -132.9071 Td (3211 ) 21.8426 Tj 0 -142.4004 Td (3212 ) 21.8426 Tj 0 -151.8938 Td (3213 ) 21.8426 Tj 0 -161.3871 Td (3214 ) 21.8426 Tj 0 -170.8805 Td (3215 ) 21.8426 Tj 0 -180.3739 Td (3216 ) 21.8426 Tj 0 -189.8672 Td (3217 ) 21.8426 Tj 0 -199.3606 Td (3218 ) 21.8426 Tj 0 -208.8539 Td (3219 ) 21.8426 Tj 0 -218.3473 Td (3220 ) 21.8426 Tj 0 -227.8407 Td (3221 ) 21.8426 Tj 0 -237.334 Td (3222 ) 21.8426 Tj 0 -246.8274 Td (3223 ) 21.8426 Tj 0 -256.3207 Td (3224 ) 21.8426 Tj 0 -265.8141 Td (3225 ) 21.8426 Tj 0 -275.3075 Td (3226 ) 21.8426 Tj 0 -284.8008 Td (3227 ) 21.8426 Tj 0 -294.2942 Td (3228 ) 21.8426 Tj 0 -303.7875 Td (3229 ) 21.8426 Tj 0 -313.2809 Td (3230 ) 21.8426 Tj 0 -322.7743 Td (3231 ) 21.8426 Tj 0 -332.2676 Td (3232 ) 21.8426 Tj 0 -341.761 Td (3233 ) 21.8426 Tj 0 -351.2543 Td (3234 ) 21.8426 Tj 0 -360.7477 Td (3235 ) 21.8426 Tj 0 -370.2411 Td (3236 ) 21.8426 Tj 0 -379.7344 Td (3237 ) 21.8426 Tj 0 -389.2278 Td (3238 ) 21.8426 Tj 0 -398.7211 Td (3239 ) 21.8426 Tj 0 -408.2145 Td (3240 ) 21.8426 Tj 0 -417.7079 Td (3241 ) 21.8426 Tj 0 -427.2012 Td (3242 ) 21.8426 Tj 0 -436.6946 Td (3243 ) 21.8426 Tj 0 -446.1879 Td (3244 ) 21.8426 Tj 0 -455.6813 Td (3245 ) 21.8426 Tj 0 -465.1747 Td (3246 ) 21.8426 Tj 0 -474.668 Td (3247 ) 21.8426 Tj 0 -484.1614 Td (3248 ) 21.8426 Tj 0 -493.6547 Td (3249 ) 21.8426 Tj 0 -522.1348 Td (Sheet 32) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fsvar.h Page 1) 166.0035 Tj 0 -28.4801 Td (3250 // in-core file system types) 144.161 Tj 0 -37.9735 Td (3251 ) 21.8426 Tj 0 -47.4668 Td (3252 struct inode {) 83.0018 Tj 0 -56.9602 Td (3253 uint dev; // Device number) 187.8461 Tj 0 -66.4535 Td (3254 uint inum; // Inode number) 183.4776 Tj 0 -75.9469 Td (3255 int ref; // Reference count) 196.5831 Tj 0 -85.4403 Td (3256 int flags; // I_BUSY, I_VALID) 196.5831 Tj 0 -94.9336 Td (3257 ) 21.8426 Tj 0 -104.427 Td (3258 short type; // copy of disk inode) 209.6887 Tj 0 -113.9203 Td (3259 short major;) 83.0018 Tj 0 -123.4137 Td (3260 short minor;) 83.0018 Tj 0 -132.9071 Td (3261 short nlink;) 83.0018 Tj 0 -142.4004 Td (3262 uint size;) 74.2647 Tj 0 -151.8938 Td (3263 uint addrs[NADDRS];) 113.5814 Tj 0 -161.3871 Td (3264 };) 30.5796 Tj 0 -170.8805 Td (3265 ) 21.8426 Tj 0 -180.3739 Td (3266 #define I_BUSY 0x1) 100.4758 Tj 0 -189.8672 Td (3267 #define I_VALID 0x2) 104.8443 Tj 0 -199.3606 Td (3268 ) 21.8426 Tj 0 -208.8539 Td (3269 ) 21.8426 Tj 0 -218.3473 Td (3270 ) 21.8426 Tj 0 -227.8407 Td (3271 ) 21.8426 Tj 0 -237.334 Td (3272 ) 21.8426 Tj 0 -246.8274 Td (3273 ) 21.8426 Tj 0 -256.3207 Td (3274 ) 21.8426 Tj 0 -265.8141 Td (3275 ) 21.8426 Tj 0 -275.3075 Td (3276 ) 21.8426 Tj 0 -284.8008 Td (3277 ) 21.8426 Tj 0 -294.2942 Td (3278 ) 21.8426 Tj 0 -303.7875 Td (3279 ) 21.8426 Tj 0 -313.2809 Td (3280 ) 21.8426 Tj 0 -322.7743 Td (3281 ) 21.8426 Tj 0 -332.2676 Td (3282 ) 21.8426 Tj 0 -341.761 Td (3283 ) 21.8426 Tj 0 -351.2543 Td (3284 ) 21.8426 Tj 0 -360.7477 Td (3285 ) 21.8426 Tj 0 -370.2411 Td (3286 ) 21.8426 Tj 0 -379.7344 Td (3287 ) 21.8426 Tj 0 -389.2278 Td (3288 ) 21.8426 Tj 0 -398.7211 Td (3289 ) 21.8426 Tj 0 -408.2145 Td (3290 ) 21.8426 Tj 0 -417.7079 Td (3291 ) 21.8426 Tj 0 -427.2012 Td (3292 ) 21.8426 Tj 0 -436.6946 Td (3293 ) 21.8426 Tj 0 -446.1879 Td (3294 ) 21.8426 Tj 0 -455.6813 Td (3295 ) 21.8426 Tj 0 -465.1747 Td (3296 ) 21.8426 Tj 0 -474.668 Td (3297 ) 21.8426 Tj 0 -484.1614 Td (3298 ) 21.8426 Tj 0 -493.6547 Td (3299 ) 21.8426 Tj 0 -522.1348 Td (Sheet 32) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 40 40 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/ide.c Page 1) 157.2665 Tj 0 -28.4801 Td (3300 // Simple PIO-based \(non-DMA\) IDE driver code.) 222.7942 Tj 0 -37.9735 Td (3301 ) 21.8426 Tj 0 -47.4668 Td (3302 #include "types.h") 100.4758 Tj 0 -56.9602 Td (3303 #include "defs.h") 96.1073 Tj 0 -66.4535 Td (3304 #include "param.h") 100.4758 Tj 0 -75.9469 Td (3305 #include "mmu.h") 91.7388 Tj 0 -85.4403 Td (3306 #include "proc.h") 96.1073 Tj 0 -94.9336 Td (3307 #include "x86.h") 91.7388 Tj 0 -104.427 Td (3308 #include "traps.h") 100.4758 Tj 0 -113.9203 Td (3309 #include "spinlock.h") 113.5814 Tj 0 -123.4137 Td (3310 #include "buf.h") 91.7388 Tj 0 -132.9071 Td (3311 ) 21.8426 Tj 0 -142.4004 Td (3312 #define IDE_BSY 0x80) 135.4239 Tj 0 -151.8938 Td (3313 #define IDE_DRDY 0x40) 135.4239 Tj 0 -161.3871 Td (3314 #define IDE_DF 0x20) 135.4239 Tj 0 -170.8805 Td (3315 #define IDE_ERR 0x01) 135.4239 Tj 0 -180.3739 Td (3316 ) 21.8426 Tj 0 -189.8672 Td (3317 #define IDE_CMD_READ 0x20) 135.4239 Tj 0 -199.3606 Td (3318 #define IDE_CMD_WRITE 0x30) 135.4239 Tj 0 -208.8539 Td (3319 ) 21.8426 Tj 0 -218.3473 Td (3320 // ide_queue points to the buf now being read/written to t\ he disk.) 310.1645 Tj 0 -227.8407 Td (3321 // ide_queue->qnext points to the next buf to be processed\ .) 279.5849 Tj 0 -237.334 Td (3322 // You must hold ide_lock while manipulating queue.) 244.6368 Tj 0 -246.8274 Td (3323 ) 21.8426 Tj 0 -256.3207 Td (3324 static struct spinlock ide_lock;) 161.635 Tj 0 -265.8141 Td (3325 static struct buf *ide_queue;) 148.5295 Tj 0 -275.3075 Td (3326 ) 21.8426 Tj 0 -284.8008 Td (3327 static int disk_1_present;) 135.4239 Tj 0 -294.2942 Td (3328 static void ide_start_request\(\);) 161.635 Tj 0 -303.7875 Td (3329 ) 21.8426 Tj 0 -313.2809 Td (3330 // Wait for IDE disk to become ready.) 183.4776 Tj 0 -322.7743 Td (3331 static int) 65.5277 Tj 0 -332.2676 Td (3332 ide_wait_ready\(int check_error\)) 157.2665 Tj 0 -341.761 Td (3333 {) 26.2111 Tj 0 -351.2543 Td (3334 int r;) 56.7907 Tj 0 -360.7477 Td (3335 ) 21.8426 Tj 0 -370.2411 Td (3336 while\(\(\(r = inb\(0x1f7\)\) & IDE_BSY\) || !\(r & IDE_\ DRDY\)\)) 266.4794 Tj 0 -379.7344 Td (3337 ;) 43.6851 Tj 0 -389.2278 Td (3338 if\(check_error && \(r & \(IDE_DF|IDE_ERR\)\) != 0\)) 231.5313 Tj 0 -398.7211 Td (3339 return -1;) 83.0018 Tj 0 -408.2145 Td (3340 return 0;) 69.8962 Tj 0 -417.7079 Td (3341 }) 26.2111 Tj 0 -427.2012 Td (3342 ) 21.8426 Tj 0 -436.6946 Td (3343 ) 21.8426 Tj 0 -446.1879 Td (3344 ) 21.8426 Tj 0 -455.6813 Td (3345 ) 21.8426 Tj 0 -465.1747 Td (3346 ) 21.8426 Tj 0 -474.668 Td (3347 ) 21.8426 Tj 0 -484.1614 Td (3348 ) 21.8426 Tj 0 -493.6547 Td (3349 ) 21.8426 Tj 0 -522.1348 Td (Sheet 33) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/ide.c Page 2) 157.2665 Tj 0 -28.4801 Td (3350 void) 39.3166 Tj 0 -37.9735 Td (3351 ide_init\(void\)) 83.0018 Tj 0 -47.4668 Td (3352 {) 26.2111 Tj 0 -56.9602 Td (3353 int i;) 56.7907 Tj 0 -66.4535 Td (3354 ) 21.8426 Tj 0 -75.9469 Td (3355 initlock\(&ide_lock, "ide"\);) 148.5295 Tj 0 -85.4403 Td (3356 pic_enable\(IRQ_IDE\);) 117.9499 Tj 0 -94.9336 Td (3357 ioapic_enable\(IRQ_IDE, ncpu - 1\);) 174.7406 Tj 0 -104.427 Td (3358 ide_wait_ready\(0\);) 109.2129 Tj 0 -113.9203 Td (3359 ) 21.8426 Tj 0 -123.4137 Td (3360 // Check if disk 1 is present) 157.2665 Tj 0 -132.9071 Td (3361 outb\(0x1f6, 0xe0 | \(1<<4\)\);) 148.5295 Tj 0 -142.4004 Td (3362 for\(i=0; i<1000; i++\){) 126.6869 Tj 0 -151.8938 Td (3363 if\(inb\(0x1f7\) != 0\){) 126.6869 Tj 0 -161.3871 Td (3364 disk_1_present = 1;) 131.0554 Tj 0 -170.8805 Td (3365 break;) 74.2647 Tj 0 -180.3739 Td (3366 }) 43.6851 Tj 0 -189.8672 Td (3367 }) 34.9481 Tj 0 -199.3606 Td (3368 ) 21.8426 Tj 0 -208.8539 Td (3369 // Switch back to disk 0.) 139.7925 Tj 0 -218.3473 Td (3370 outb\(0x1f6, 0xe0 | \(0<<4\)\);) 148.5295 Tj 0 -227.8407 Td (3371 }) 26.2111 Tj 0 -237.334 Td (3372 ) 21.8426 Tj 0 -246.8274 Td (3373 // Start the request for b. Caller must hold ide_lock.) 262.1109 Tj 0 -256.3207 Td (3374 static void) 69.8962 Tj 0 -265.8141 Td (3375 ide_start_request\(struct buf *b\)) 161.635 Tj 0 -275.3075 Td (3376 {) 26.2111 Tj 0 -284.8008 Td (3377 if\(b == 0\)) 74.2647 Tj 0 -294.2942 Td (3378 panic\("ide_start_request"\);) 157.2665 Tj 0 -303.7875 Td (3379 ) 21.8426 Tj 0 -313.2809 Td (3380 ide_wait_ready\(0\);) 109.2129 Tj 0 -322.7743 Td (3381 outb\(0x3f6, 0\); // generate interrupt) 196.5831 Tj 0 -332.2676 Td (3382 outb\(0x1f2, 1\); // number of sectors) 192.2146 Tj 0 -341.761 Td (3383 outb\(0x1f3, b->sector & 0xff\);) 161.635 Tj 0 -351.2543 Td (3384 outb\(0x1f4, \(b->sector >> 8\) & 0xff\);) 192.2146 Tj 0 -360.7477 Td (3385 outb\(0x1f5, \(b->sector >> 16\) & 0xff\);) 196.5831 Tj 0 -370.2411 Td (3386 outb\(0x1f6, 0xe0 | \(\(b->dev&1\)<<4\) | \(\(b->sector>\ >24\)&0x0f\)\);) 297.059 Tj 0 -379.7344 Td (3387 if\(b->flags & B_DIRTY\){) 131.0554 Tj 0 -389.2278 Td (3388 outb\(0x1f7, IDE_CMD_WRITE\);) 157.2665 Tj 0 -398.7211 Td (3389 outsl\(0x1f0, b->data, 512/4\);) 166.0035 Tj 0 -408.2145 Td (3390 } else {) 65.5277 Tj 0 -417.7079 Td (3391 outb\(0x1f7, IDE_CMD_READ\);) 152.898 Tj 0 -427.2012 Td (3392 }) 34.9481 Tj 0 -436.6946 Td (3393 }) 26.2111 Tj 0 -446.1879 Td (3394 ) 21.8426 Tj 0 -455.6813 Td (3395 ) 21.8426 Tj 0 -465.1747 Td (3396 ) 21.8426 Tj 0 -474.668 Td (3397 ) 21.8426 Tj 0 -484.1614 Td (3398 ) 21.8426 Tj 0 -493.6547 Td (3399 ) 21.8426 Tj 0 -522.1348 Td (Sheet 33) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 41 41 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/ide.c Page 3) 157.2665 Tj 0 -28.4801 Td (3400 // Interrupt handler.) 113.5814 Tj 0 -37.9735 Td (3401 void) 39.3166 Tj 0 -47.4668 Td (3402 ide_intr\(void\)) 83.0018 Tj 0 -56.9602 Td (3403 {) 26.2111 Tj 0 -66.4535 Td (3404 struct buf *b;) 91.7388 Tj 0 -75.9469 Td (3405 ) 21.8426 Tj 0 -85.4403 Td (3406 acquire\(&ide_lock\);) 113.5814 Tj 0 -94.9336 Td (3407 if\(\(b = ide_queue\) == 0\){) 139.7925 Tj 0 -104.427 Td (3408 release\(&ide_lock\);) 122.3184 Tj 0 -113.9203 Td (3409 return;) 69.8962 Tj 0 -123.4137 Td (3410 }) 34.9481 Tj 0 -132.9071 Td (3411 ) 21.8426 Tj 0 -142.4004 Td (3412 // Read data if needed.) 131.0554 Tj 0 -151.8938 Td (3413 if\(!\(b->flags & B_DIRTY\) && ide_wait_ready\(1\) >= 0\)) 253.3738 Tj 0 -161.3871 Td (3414 insl\(0x1f0, b->data, 512/4\);) 161.635 Tj 0 -170.8805 Td (3415 ) 21.8426 Tj 0 -180.3739 Td (3416 // Wake process waiting for this buf.) 192.2146 Tj 0 -189.8672 Td (3417 b->flags |= B_VALID;) 117.9499 Tj 0 -199.3606 Td (3418 b->flags &= ~B_DIRTY;) 122.3184 Tj 0 -208.8539 Td (3419 wakeup\(b\);) 74.2647 Tj 0 -218.3473 Td (3420 ) 21.8426 Tj 0 -227.8407 Td (3421 // Start disk on next buf in queue.) 183.4776 Tj 0 -237.334 Td (3422 if\(\(ide_queue = b->qnext\) != 0\)) 166.0035 Tj 0 -246.8274 Td (3423 ide_start_request\(ide_queue\);) 166.0035 Tj 0 -256.3207 Td (3424 ) 21.8426 Tj 0 -265.8141 Td (3425 release\(&ide_lock\);) 113.5814 Tj 0 -275.3075 Td (3426 }) 26.2111 Tj 0 -284.8008 Td (3427 ) 21.8426 Tj 0 -294.2942 Td (3428 ) 21.8426 Tj 0 -303.7875 Td (3429 ) 21.8426 Tj 0 -313.2809 Td (3430 ) 21.8426 Tj 0 -322.7743 Td (3431 ) 21.8426 Tj 0 -332.2676 Td (3432 ) 21.8426 Tj 0 -341.761 Td (3433 ) 21.8426 Tj 0 -351.2543 Td (3434 ) 21.8426 Tj 0 -360.7477 Td (3435 ) 21.8426 Tj 0 -370.2411 Td (3436 ) 21.8426 Tj 0 -379.7344 Td (3437 ) 21.8426 Tj 0 -389.2278 Td (3438 ) 21.8426 Tj 0 -398.7211 Td (3439 ) 21.8426 Tj 0 -408.2145 Td (3440 ) 21.8426 Tj 0 -417.7079 Td (3441 ) 21.8426 Tj 0 -427.2012 Td (3442 ) 21.8426 Tj 0 -436.6946 Td (3443 ) 21.8426 Tj 0 -446.1879 Td (3444 ) 21.8426 Tj 0 -455.6813 Td (3445 ) 21.8426 Tj 0 -465.1747 Td (3446 ) 21.8426 Tj 0 -474.668 Td (3447 ) 21.8426 Tj 0 -484.1614 Td (3448 ) 21.8426 Tj 0 -493.6547 Td (3449 ) 21.8426 Tj 0 -522.1348 Td (Sheet 34) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/ide.c Page 4) 157.2665 Tj 0 -28.4801 Td (3450 // Sync buf with disk.) 117.9499 Tj 0 -37.9735 Td (3451 // If B_DIRTY is set, write buf to disk, clear B_DIRTY, se\ t B_VALID.) 318.9016 Tj 0 -47.4668 Td (3452 // Else if B_VALID is not set, read buf from disk, set B_V\ ALID.) 297.059 Tj 0 -56.9602 Td (3453 void) 39.3166 Tj 0 -66.4535 Td (3454 ide_rw\(struct buf *b\)) 113.5814 Tj 0 -75.9469 Td (3455 {) 26.2111 Tj 0 -85.4403 Td (3456 struct buf **pp;) 100.4758 Tj 0 -94.9336 Td (3457 ) 21.8426 Tj 0 -104.427 Td (3458 if\(!\(b->flags & B_BUSY\)\)) 135.4239 Tj 0 -113.9203 Td (3459 panic\("ide_rw: buf not busy"\);) 170.3721 Tj 0 -123.4137 Td (3460 if\(\(b->flags & \(B_VALID|B_DIRTY\)\) == B_VALID\)) 227.1628 Tj 0 -132.9071 Td (3461 panic\("ide_rw: nothing to do"\);) 174.7406 Tj 0 -142.4004 Td (3462 if\(b->dev != 0 && !disk_1_present\)) 179.1091 Tj 0 -151.8938 Td (3463 panic\("ide disk 1 not present"\);) 179.1091 Tj 0 -161.3871 Td (3464 ) 21.8426 Tj 0 -170.8805 Td (3465 acquire\(&ide_lock\);) 113.5814 Tj 0 -180.3739 Td (3466 ) 21.8426 Tj 0 -189.8672 Td (3467 // Append b to ide_queue.) 139.7925 Tj 0 -199.3606 Td (3468 b->qnext = 0;) 87.3703 Tj 0 -208.8539 Td (3469 for\(pp=&ide_queue; *pp; pp=&\(*pp\)->qnext\)) 209.6887 Tj 0 -218.3473 Td (3470 ;) 43.6851 Tj 0 -227.8407 Td (3471 *pp = b;) 65.5277 Tj 0 -237.334 Td (3472 ) 21.8426 Tj 0 -246.8274 Td (3473 // Start disk if necessary.) 148.5295 Tj 0 -256.3207 Td (3474 if\(ide_queue == b\)) 109.2129 Tj 0 -265.8141 Td (3475 ide_start_request\(b\);) 131.0554 Tj 0 -275.3075 Td (3476 ) 21.8426 Tj 0 -284.8008 Td (3477 // Wait for request to finish.) 161.635 Tj 0 -294.2942 Td (3478 // Assuming will not sleep too long: ignore cp->killed.) 270.8479 Tj 0 -303.7875 Td (3479 while\(\(b->flags & \(B_VALID|B_DIRTY\)\) != B_VALID\)) 240.2683 Tj 0 -313.2809 Td (3480 sleep\(b, &ide_lock\);) 126.6869 Tj 0 -322.7743 Td (3481 ) 21.8426 Tj 0 -332.2676 Td (3482 release\(&ide_lock\);) 113.5814 Tj 0 -341.761 Td (3483 }) 26.2111 Tj 0 -351.2543 Td (3484 ) 21.8426 Tj 0 -360.7477 Td (3485 ) 21.8426 Tj 0 -370.2411 Td (3486 ) 21.8426 Tj 0 -379.7344 Td (3487 ) 21.8426 Tj 0 -389.2278 Td (3488 ) 21.8426 Tj 0 -398.7211 Td (3489 ) 21.8426 Tj 0 -408.2145 Td (3490 ) 21.8426 Tj 0 -417.7079 Td (3491 ) 21.8426 Tj 0 -427.2012 Td (3492 ) 21.8426 Tj 0 -436.6946 Td (3493 ) 21.8426 Tj 0 -446.1879 Td (3494 ) 21.8426 Tj 0 -455.6813 Td (3495 ) 21.8426 Tj 0 -465.1747 Td (3496 ) 21.8426 Tj 0 -474.668 Td (3497 ) 21.8426 Tj 0 -484.1614 Td (3498 ) 21.8426 Tj 0 -493.6547 Td (3499 ) 21.8426 Tj 0 -522.1348 Td (Sheet 34) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 42 42 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/bio.c Page 1) 157.2665 Tj 0 -28.4801 Td (3500 // Buffer cache.) 91.7388 Tj 0 -37.9735 Td (3501 //) 30.5796 Tj 0 -47.4668 Td (3502 // The buffer cache is a linked list of buf structures hol\ ding) 292.6905 Tj 0 -56.9602 Td (3503 // cached copies of disk block contents. Caching disk blo\ cks) 288.322 Tj 0 -66.4535 Td (3504 // in memory reduces the number of disk reads and also pro\ vides) 297.059 Tj 0 -75.9469 Td (3505 // a synchronization point for disk blocks used by multipl\ e processes.) 327.6386 Tj 0 -85.4403 Td (3506 //) 30.5796 Tj 0 -94.9336 Td (3507 // Interface:) 78.6333 Tj 0 -104.427 Td (3508 // * To get a buffer for a particular disk block, call bre\ ad.) 288.322 Tj 0 -113.9203 Td (3509 // * After changing buffer data, call bwrite to flush it t\ o disk.) 305.796 Tj 0 -123.4137 Td (3510 // * When done with the buffer, call brelse.) 214.0572 Tj 0 -132.9071 Td (3511 // * Do not use the buffer after calling brelse.) 231.5313 Tj 0 -142.4004 Td (3512 // * Only one process at a time can use a buffer,) 235.8998 Tj 0 -151.8938 Td (3513 // so do not keep them longer than necessary.) 235.8998 Tj 0 -161.3871 Td (3514 //) 30.5796 Tj 0 -170.8805 Td (3515 // The implementation uses three state flags internally:) 266.4794 Tj 0 -180.3739 Td (3516 // * B_BUSY: the block has been returned from bread) 244.6368 Tj 0 -189.8672 Td (3517 // and has not been passed back to brelse.) 222.7942 Tj 0 -199.3606 Td (3518 // * B_VALID: the buffer data has been initialized) 240.2683 Tj 0 -208.8539 Td (3519 // with the associated disk block contents.) 227.1628 Tj 0 -218.3473 Td (3520 // * B_DIRTY: the buffer data has been modified) 227.1628 Tj 0 -227.8407 Td (3521 // and needs to be written to disk.) 192.2146 Tj 0 -237.334 Td (3522 ) 21.8426 Tj 0 -246.8274 Td (3523 #include "types.h") 100.4758 Tj 0 -256.3207 Td (3524 #include "defs.h") 96.1073 Tj 0 -265.8141 Td (3525 #include "param.h") 100.4758 Tj 0 -275.3075 Td (3526 #include "spinlock.h") 113.5814 Tj 0 -284.8008 Td (3527 #include "buf.h") 91.7388 Tj 0 -294.2942 Td (3528 ) 21.8426 Tj 0 -303.7875 Td (3529 struct buf buf[NBUF];) 113.5814 Tj 0 -313.2809 Td (3530 struct spinlock buf_table_lock;) 157.2665 Tj 0 -322.7743 Td (3531 ) 21.8426 Tj 0 -332.2676 Td (3532 // Linked list of all buffers, through prev/next.) 235.8998 Tj 0 -341.761 Td (3533 // bufhead->next is most recently used.) 192.2146 Tj 0 -351.2543 Td (3534 // bufhead->tail is least recently used.) 196.5831 Tj 0 -360.7477 Td (3535 struct buf bufhead;) 104.8443 Tj 0 -370.2411 Td (3536 ) 21.8426 Tj 0 -379.7344 Td (3537 void) 39.3166 Tj 0 -389.2278 Td (3538 binit\(void\)) 69.8962 Tj 0 -398.7211 Td (3539 {) 26.2111 Tj 0 -408.2145 Td (3540 struct buf *b;) 91.7388 Tj 0 -417.7079 Td (3541 ) 21.8426 Tj 0 -427.2012 Td (3542 initlock\(&buf_table_lock, "buf_table"\);) 200.9517 Tj 0 -436.6946 Td (3543 ) 21.8426 Tj 0 -446.1879 Td (3544 ) 21.8426 Tj 0 -455.6813 Td (3545 ) 21.8426 Tj 0 -465.1747 Td (3546 ) 21.8426 Tj 0 -474.668 Td (3547 ) 21.8426 Tj 0 -484.1614 Td (3548 ) 21.8426 Tj 0 -493.6547 Td (3549 ) 21.8426 Tj 0 -522.1348 Td (Sheet 35) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/bio.c Page 2) 157.2665 Tj 0 -28.4801 Td (3550 // Create linked list of buffers) 170.3721 Tj 0 -37.9735 Td (3551 bufhead.prev = &bufhead;) 135.4239 Tj 0 -47.4668 Td (3552 bufhead.next = &bufhead;) 135.4239 Tj 0 -56.9602 Td (3553 for\(b = buf; b < buf+NBUF; b++\){) 170.3721 Tj 0 -66.4535 Td (3554 b->next = bufhead.next;) 139.7925 Tj 0 -75.9469 Td (3555 b->prev = &bufhead;) 122.3184 Tj 0 -85.4403 Td (3556 bufhead.next->prev = b;) 139.7925 Tj 0 -94.9336 Td (3557 bufhead.next = b;) 113.5814 Tj 0 -104.427 Td (3558 }) 34.9481 Tj 0 -113.9203 Td (3559 }) 26.2111 Tj 0 -123.4137 Td (3560 ) 21.8426 Tj 0 -132.9071 Td (3561 // Look through buffer cache for sector on device dev.) 257.7424 Tj 0 -142.4004 Td (3562 // If not found, allocate fresh block.) 187.8461 Tj 0 -151.8938 Td (3563 // In either case, return locked buffer.) 196.5831 Tj 0 -161.3871 Td (3564 static struct buf*) 100.4758 Tj 0 -170.8805 Td (3565 bget\(uint dev, uint sector\)) 139.7925 Tj 0 -180.3739 Td (3566 {) 26.2111 Tj 0 -189.8672 Td (3567 struct buf *b;) 91.7388 Tj 0 -199.3606 Td (3568 ) 21.8426 Tj 0 -208.8539 Td (3569 acquire\(&buf_table_lock\);) 139.7925 Tj 0 -218.3473 Td (3570 ) 21.8426 Tj 0 -227.8407 Td (3571 loop:) 48.0537 Tj 0 -237.334 Td (3572 // Try for cached block.) 135.4239 Tj 0 -246.8274 Td (3573 for\(b = bufhead.next; b != &bufhead; b = b->next\){) 249.0053 Tj 0 -256.3207 Td (3574 if\(\(b->flags & \(B_BUSY|B_VALID\)\) &&) 192.2146 Tj 0 -265.8141 Td (3575 b->dev == dev && b->sector == sector\){) 218.4257 Tj 0 -275.3075 Td (3576 if\(b->flags & B_BUSY\){) 144.161 Tj 0 -284.8008 Td (3577 sleep\(buf, &buf_table_lock\);) 179.1091 Tj 0 -294.2942 Td (3578 goto loop;) 100.4758 Tj 0 -303.7875 Td (3579 }) 52.4222 Tj 0 -313.2809 Td (3580 b->flags |= B_BUSY;) 131.0554 Tj 0 -322.7743 Td (3581 release\(&buf_table_lock\);) 157.2665 Tj 0 -332.2676 Td (3582 return b;) 87.3703 Tj 0 -341.761 Td (3583 }) 43.6851 Tj 0 -351.2543 Td (3584 }) 34.9481 Tj 0 -360.7477 Td (3585 ) 21.8426 Tj 0 -370.2411 Td (3586 // Allocate fresh block.) 135.4239 Tj 0 -379.7344 Td (3587 for\(b = bufhead.prev; b != &bufhead; b = b->prev\){) 249.0053 Tj 0 -389.2278 Td (3588 if\(\(b->flags & B_BUSY\) == 0\){) 166.0035 Tj 0 -398.7211 Td (3589 b->flags = B_BUSY;) 126.6869 Tj 0 -408.2145 Td (3590 b->dev = dev;) 104.8443 Tj 0 -417.7079 Td (3591 b->sector = sector;) 131.0554 Tj 0 -427.2012 Td (3592 release\(&buf_table_lock\);) 157.2665 Tj 0 -436.6946 Td (3593 return b;) 87.3703 Tj 0 -446.1879 Td (3594 }) 43.6851 Tj 0 -455.6813 Td (3595 }) 34.9481 Tj 0 -465.1747 Td (3596 panic\("bget: no buffers"\);) 144.161 Tj 0 -474.668 Td (3597 }) 26.2111 Tj 0 -484.1614 Td (3598 ) 21.8426 Tj 0 -493.6547 Td (3599 ) 21.8426 Tj 0 -522.1348 Td (Sheet 35) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 43 43 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/bio.c Page 3) 157.2665 Tj 0 -28.4801 Td (3600 // Return a B_BUSY buf with the contents of the indicated \ disk sector.) 327.6386 Tj 0 -37.9735 Td (3601 struct buf*) 69.8962 Tj 0 -47.4668 Td (3602 bread\(uint dev, uint sector\)) 144.161 Tj 0 -56.9602 Td (3603 {) 26.2111 Tj 0 -66.4535 Td (3604 struct buf *b;) 91.7388 Tj 0 -75.9469 Td (3605 ) 21.8426 Tj 0 -85.4403 Td (3606 b = bget\(dev, sector\);) 126.6869 Tj 0 -94.9336 Td (3607 if\(!\(b->flags & B_VALID\)\)) 139.7925 Tj 0 -104.427 Td (3608 ide_rw\(b\);) 83.0018 Tj 0 -113.9203 Td (3609 return b;) 69.8962 Tj 0 -123.4137 Td (3610 }) 26.2111 Tj 0 -132.9071 Td (3611 ) 21.8426 Tj 0 -142.4004 Td (3612 // Write buf's contents to disk. Must be locked.) 235.8998 Tj 0 -151.8938 Td (3613 void) 39.3166 Tj 0 -161.3871 Td (3614 bwrite\(struct buf *b\)) 113.5814 Tj 0 -170.8805 Td (3615 {) 26.2111 Tj 0 -180.3739 Td (3616 if\(\(b->flags & B_BUSY\) == 0\)) 152.898 Tj 0 -189.8672 Td (3617 panic\("bwrite"\);) 109.2129 Tj 0 -199.3606 Td (3618 b->flags |= B_DIRTY;) 117.9499 Tj 0 -208.8539 Td (3619 ide_rw\(b\);) 74.2647 Tj 0 -218.3473 Td (3620 }) 26.2111 Tj 0 -227.8407 Td (3621 ) 21.8426 Tj 0 -237.334 Td (3622 // Release the buffer buf.) 135.4239 Tj 0 -246.8274 Td (3623 void) 39.3166 Tj 0 -256.3207 Td (3624 brelse\(struct buf *b\)) 113.5814 Tj 0 -265.8141 Td (3625 {) 26.2111 Tj 0 -275.3075 Td (3626 if\(\(b->flags & B_BUSY\) == 0\)) 152.898 Tj 0 -284.8008 Td (3627 panic\("brelse"\);) 109.2129 Tj 0 -294.2942 Td (3628 ) 21.8426 Tj 0 -303.7875 Td (3629 acquire\(&buf_table_lock\);) 139.7925 Tj 0 -313.2809 Td (3630 ) 21.8426 Tj 0 -322.7743 Td (3631 b->next->prev = b->prev;) 135.4239 Tj 0 -332.2676 Td (3632 b->prev->next = b->next;) 135.4239 Tj 0 -341.761 Td (3633 b->next = bufhead.next;) 131.0554 Tj 0 -351.2543 Td (3634 b->prev = &bufhead;) 113.5814 Tj 0 -360.7477 Td (3635 bufhead.next->prev = b;) 131.0554 Tj 0 -370.2411 Td (3636 bufhead.next = b;) 104.8443 Tj 0 -379.7344 Td (3637 ) 21.8426 Tj 0 -389.2278 Td (3638 b->flags &= ~B_BUSY;) 117.9499 Tj 0 -398.7211 Td (3639 wakeup\(buf\);) 83.0018 Tj 0 -408.2145 Td (3640 ) 21.8426 Tj 0 -417.7079 Td (3641 release\(&buf_table_lock\);) 139.7925 Tj 0 -427.2012 Td (3642 }) 26.2111 Tj 0 -436.6946 Td (3643 ) 21.8426 Tj 0 -446.1879 Td (3644 ) 21.8426 Tj 0 -455.6813 Td (3645 ) 21.8426 Tj 0 -465.1747 Td (3646 ) 21.8426 Tj 0 -474.668 Td (3647 ) 21.8426 Tj 0 -484.1614 Td (3648 ) 21.8426 Tj 0 -493.6547 Td (3649 ) 21.8426 Tj 0 -522.1348 Td (Sheet 36) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 1) 152.898 Tj 0 -28.4801 Td (3650 // File system implementation. Four layers:) 214.0572 Tj 0 -37.9735 Td (3651 // + Blocks: allocator for raw disk blocks.) 218.4257 Tj 0 -47.4668 Td (3652 // + Files: inode allocator, reading, writing, metadata.) 275.2164 Tj 0 -56.9602 Td (3653 // + Directories: inode with special contents \(list of \ other inodes!\)) 332.0071 Tj 0 -66.4535 Td (3654 // + Names: paths like /usr/rtm/xv6/fs.c for convenient \ naming.) 305.796 Tj 0 -75.9469 Td (3655 //) 30.5796 Tj 0 -85.4403 Td (3656 // Disk layout is: superblock, inodes, block in-use bitmap\ , data blocks.) 336.3756 Tj 0 -94.9336 Td (3657 //) 30.5796 Tj 0 -104.427 Td (3658 // This file contains the low-level file system manipulati\ on) 283.9534 Tj 0 -113.9203 Td (3659 // routines. The \(higher-level\) system call implementat\ ions) 283.9534 Tj 0 -123.4137 Td (3660 // are in sysfile.c.) 109.2129 Tj 0 -132.9071 Td (3661 ) 21.8426 Tj 0 -142.4004 Td (3662 #include "types.h") 100.4758 Tj 0 -151.8938 Td (3663 #include "defs.h") 96.1073 Tj 0 -161.3871 Td (3664 #include "param.h") 100.4758 Tj 0 -170.8805 Td (3665 #include "stat.h") 96.1073 Tj 0 -180.3739 Td (3666 #include "mmu.h") 91.7388 Tj 0 -189.8672 Td (3667 #include "proc.h") 96.1073 Tj 0 -199.3606 Td (3668 #include "spinlock.h") 113.5814 Tj 0 -208.8539 Td (3669 #include "buf.h") 91.7388 Tj 0 -218.3473 Td (3670 #include "fs.h") 87.3703 Tj 0 -227.8407 Td (3671 #include "fsvar.h") 100.4758 Tj 0 -237.334 Td (3672 #include "dev.h") 91.7388 Tj 0 -246.8274 Td (3673 ) 21.8426 Tj 0 -256.3207 Td (3674 #define min\(a, b\) \(\(a\) < \(b\) ? \(a\) : \(b\)\)) 200.9517 Tj 0 -265.8141 Td (3675 static void itrunc\(struct inode*\);) 170.3721 Tj 0 -275.3075 Td (3676 ) 21.8426 Tj 0 -284.8008 Td (3677 // Read the super block.) 126.6869 Tj 0 -294.2942 Td (3678 static void) 69.8962 Tj 0 -303.7875 Td (3679 readsb\(int dev, struct superblock *sb\)) 187.8461 Tj 0 -313.2809 Td (3680 {) 26.2111 Tj 0 -322.7743 Td (3681 struct buf *bp;) 96.1073 Tj 0 -332.2676 Td (3682 ) 21.8426 Tj 0 -341.761 Td (3683 bp = bread\(dev, 1\);) 113.5814 Tj 0 -351.2543 Td (3684 memmove\(sb, bp->data, sizeof\(*sb\)\);) 183.4776 Tj 0 -360.7477 Td (3685 brelse\(bp\);) 78.6333 Tj 0 -370.2411 Td (3686 }) 26.2111 Tj 0 -379.7344 Td (3687 ) 21.8426 Tj 0 -389.2278 Td (3688 // Zero a block.) 91.7388 Tj 0 -398.7211 Td (3689 static void) 69.8962 Tj 0 -408.2145 Td (3690 bzero\(int dev, int bno\)) 122.3184 Tj 0 -417.7079 Td (3691 {) 26.2111 Tj 0 -427.2012 Td (3692 struct buf *bp;) 96.1073 Tj 0 -436.6946 Td (3693 ) 21.8426 Tj 0 -446.1879 Td (3694 bp = bread\(dev, bno\);) 122.3184 Tj 0 -455.6813 Td (3695 memset\(bp->data, 0, BSIZE\);) 148.5295 Tj 0 -465.1747 Td (3696 bwrite\(bp\);) 78.6333 Tj 0 -474.668 Td (3697 brelse\(bp\);) 78.6333 Tj 0 -484.1614 Td (3698 }) 26.2111 Tj 0 -493.6547 Td (3699 ) 21.8426 Tj 0 -522.1348 Td (Sheet 36) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 44 44 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 2) 152.898 Tj 0 -28.4801 Td (3700 // Blocks.) 65.5277 Tj 0 -37.9735 Td (3701 ) 21.8426 Tj 0 -47.4668 Td (3702 // Allocate a disk block.) 131.0554 Tj 0 -56.9602 Td (3703 static uint) 69.8962 Tj 0 -66.4535 Td (3704 balloc\(uint dev\)) 91.7388 Tj 0 -75.9469 Td (3705 {) 26.2111 Tj 0 -85.4403 Td (3706 int b, bi, m;) 87.3703 Tj 0 -94.9336 Td (3707 struct buf *bp;) 96.1073 Tj 0 -104.427 Td (3708 struct superblock sb;) 122.3184 Tj 0 -113.9203 Td (3709 ) 21.8426 Tj 0 -123.4137 Td (3710 bp = 0;) 61.1592 Tj 0 -132.9071 Td (3711 readsb\(dev, &sb\);) 104.8443 Tj 0 -142.4004 Td (3712 for\(b = 0; b < sb.size; b += BPB\){) 179.1091 Tj 0 -151.8938 Td (3713 bp = bread\(dev, BBLOCK\(b, sb.ninodes\)\);) 209.6887 Tj 0 -161.3871 Td (3714 for\(bi = 0; bi < BPB; bi++\){) 161.635 Tj 0 -170.8805 Td (3715 m = 1 << \(bi % 8\);) 126.6869 Tj 0 -180.3739 Td (3716 if\(\(bp->data[bi/8] & m\) == 0\){ // Is block free\ ?) 262.1109 Tj 0 -189.8672 Td (3717 bp->data[bi/8] |= m; // Mark block in use on disk\ .) 279.5849 Tj 0 -199.3606 Td (3718 bwrite\(bp\);) 104.8443 Tj 0 -208.8539 Td (3719 brelse\(bp\);) 104.8443 Tj 0 -218.3473 Td (3720 return b + bi;) 117.9499 Tj 0 -227.8407 Td (3721 }) 52.4222 Tj 0 -237.334 Td (3722 }) 43.6851 Tj 0 -246.8274 Td (3723 brelse\(bp\);) 87.3703 Tj 0 -256.3207 Td (3724 }) 34.9481 Tj 0 -265.8141 Td (3725 panic\("balloc: out of blocks"\);) 166.0035 Tj 0 -275.3075 Td (3726 }) 26.2111 Tj 0 -284.8008 Td (3727 ) 21.8426 Tj 0 -294.2942 Td (3728 // Free a disk block.) 113.5814 Tj 0 -303.7875 Td (3729 static void) 69.8962 Tj 0 -313.2809 Td (3730 bfree\(int dev, uint b\)) 117.9499 Tj 0 -322.7743 Td (3731 {) 26.2111 Tj 0 -332.2676 Td (3732 struct buf *bp;) 96.1073 Tj 0 -341.761 Td (3733 struct superblock sb;) 122.3184 Tj 0 -351.2543 Td (3734 int bi, m;) 74.2647 Tj 0 -360.7477 Td (3735 ) 21.8426 Tj 0 -370.2411 Td (3736 bzero\(dev, b\);) 91.7388 Tj 0 -379.7344 Td (3737 ) 21.8426 Tj 0 -389.2278 Td (3738 readsb\(dev, &sb\);) 104.8443 Tj 0 -398.7211 Td (3739 bp = bread\(dev, BBLOCK\(b, sb.ninodes\)\);) 200.9517 Tj 0 -408.2145 Td (3740 bi = b % BPB;) 87.3703 Tj 0 -417.7079 Td (3741 m = 1 << \(bi % 8\);) 109.2129 Tj 0 -427.2012 Td (3742 if\(\(bp->data[bi/8] & m\) == 0\)) 157.2665 Tj 0 -436.6946 Td (3743 panic\("freeing free block"\);) 161.635 Tj 0 -446.1879 Td (3744 bp->data[bi/8] &= ~m; // Mark block free on disk.) 249.0053 Tj 0 -455.6813 Td (3745 bwrite\(bp\);) 78.6333 Tj 0 -465.1747 Td (3746 brelse\(bp\);) 78.6333 Tj 0 -474.668 Td (3747 }) 26.2111 Tj 0 -484.1614 Td (3748 ) 21.8426 Tj 0 -493.6547 Td (3749 ) 21.8426 Tj 0 -522.1348 Td (Sheet 37) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 3) 152.898 Tj 0 -28.4801 Td (3750 // Inodes.) 65.5277 Tj 0 -37.9735 Td (3751 //) 30.5796 Tj 0 -47.4668 Td (3752 // An inode is a single, unnamed file in the file system.) 270.8479 Tj 0 -56.9602 Td (3753 // The inode disk structure holds metadata \(the type, dev\ ice numbers,) 323.2701 Tj 0 -66.4535 Td (3754 // and data size\) along with a list of blocks where the a\ ssociated) 310.1645 Tj 0 -75.9469 Td (3755 // data can be found.) 113.5814 Tj 0 -85.4403 Td (3756 //) 30.5796 Tj 0 -94.9336 Td (3757 // The inodes are laid out sequentially on disk immediatel\ y after) 305.796 Tj 0 -104.427 Td (3758 // the superblock. The kernel keeps a cache of the in-use) 275.2164 Tj 0 -113.9203 Td (3759 // on-disk structures to provide a place for synchronizing\ access) 305.796 Tj 0 -123.4137 Td (3760 // to inodes shared between multiple processes.) 227.1628 Tj 0 -132.9071 Td (3761 //) 30.5796 Tj 0 -142.4004 Td (3762 // ip->ref counts the number of pointer references to this\ cached) 305.796 Tj 0 -151.8938 Td (3763 // inode; references are typically kept in struct file and\ in cp->cwd.) 327.6386 Tj 0 -161.3871 Td (3764 // When ip->ref falls to zero, the inode is no longer cach\ ed.) 288.322 Tj 0 -170.8805 Td (3765 // It is an error to use an inode without holding a refere\ nce to it.) 318.9016 Tj 0 -180.3739 Td (3766 //) 30.5796 Tj 0 -189.8672 Td (3767 // Processes are only allowed to read and write inode) 253.3738 Tj 0 -199.3606 Td (3768 // metadata and contents when holding the inode's lock,) 262.1109 Tj 0 -208.8539 Td (3769 // represented by the I_BUSY flag in the in-memory copy.) 266.4794 Tj 0 -218.3473 Td (3770 // Because inode locks are held during disk accesses,) 253.3738 Tj 0 -227.8407 Td (3771 // they are implemented using a flag rather than with) 253.3738 Tj 0 -237.334 Td (3772 // spin locks. Callers are responsible for locking) 244.6368 Tj 0 -246.8274 Td (3773 // inodes before passing them to routines in this file; le\ aving) 297.059 Tj 0 -256.3207 Td (3774 // this responsibility with the caller makes it possible f\ or them) 305.796 Tj 0 -265.8141 Td (3775 // to create arbitrarily-sized atomic operations.) 235.8998 Tj 0 -275.3075 Td (3776 //) 30.5796 Tj 0 -284.8008 Td (3777 // To give maximum control over locking to the callers,) 262.1109 Tj 0 -294.2942 Td (3778 // the routines in this file that return inode pointers) 262.1109 Tj 0 -303.7875 Td (3779 // return pointers to *unlocked* inodes. It is the caller\ s') 283.9534 Tj 0 -313.2809 Td (3780 // responsibility to lock them before using them. A non-z\ ero) 288.322 Tj 0 -322.7743 Td (3781 // ip->ref keeps these unlocked inodes in the cache.) 249.0053 Tj 0 -332.2676 Td (3782 ) 21.8426 Tj 0 -341.761 Td (3783 struct {) 56.7907 Tj 0 -351.2543 Td (3784 struct spinlock lock;) 122.3184 Tj 0 -360.7477 Td (3785 struct inode inode[NINODE];) 148.5295 Tj 0 -370.2411 Td (3786 } icache;) 61.1592 Tj 0 -379.7344 Td (3787 ) 21.8426 Tj 0 -389.2278 Td (3788 void) 39.3166 Tj 0 -398.7211 Td (3789 iinit\(void\)) 69.8962 Tj 0 -408.2145 Td (3790 {) 26.2111 Tj 0 -417.7079 Td (3791 initlock\(&icache.lock, "icache.lock"\);) 196.5831 Tj 0 -427.2012 Td (3792 }) 26.2111 Tj 0 -436.6946 Td (3793 ) 21.8426 Tj 0 -446.1879 Td (3794 ) 21.8426 Tj 0 -455.6813 Td (3795 ) 21.8426 Tj 0 -465.1747 Td (3796 ) 21.8426 Tj 0 -474.668 Td (3797 ) 21.8426 Tj 0 -484.1614 Td (3798 ) 21.8426 Tj 0 -493.6547 Td (3799 ) 21.8426 Tj 0 -522.1348 Td (Sheet 37) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 45 45 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 4) 152.898 Tj 0 -28.4801 Td (3800 // Find the inode with number inum on device dev) 231.5313 Tj 0 -37.9735 Td (3801 // and return the in-memory copy.) 166.0035 Tj 0 -47.4668 Td (3802 static struct inode*) 109.2129 Tj 0 -56.9602 Td (3803 iget\(uint dev, uint inum\)) 131.0554 Tj 0 -66.4535 Td (3804 {) 26.2111 Tj 0 -75.9469 Td (3805 struct inode *ip, *empty;) 139.7925 Tj 0 -85.4403 Td (3806 ) 21.8426 Tj 0 -94.9336 Td (3807 acquire\(&icache.lock\);) 126.6869 Tj 0 -104.427 Td (3808 ) 21.8426 Tj 0 -113.9203 Td (3809 // Try for cached inode.) 135.4239 Tj 0 -123.4137 Td (3810 empty = 0;) 74.2647 Tj 0 -132.9071 Td (3811 for\(ip = &icache.inode[0]; ip < &icache.inode[NINODE]; \ ip++\){) 297.059 Tj 0 -142.4004 Td (3812 if\(ip->ref > 0 && ip->dev == dev && ip->inum == inum\)\ {) 275.2164 Tj 0 -151.8938 Td (3813 ip->ref++;) 91.7388 Tj 0 -161.3871 Td (3814 release\(&icache.lock\);) 144.161 Tj 0 -170.8805 Td (3815 return ip;) 91.7388 Tj 0 -180.3739 Td (3816 }) 43.6851 Tj 0 -189.8672 Td (3817 if\(empty == 0 && ip->ref == 0\) // Remember empty \ slot.) 288.322 Tj 0 -199.3606 Td (3818 empty = ip;) 96.1073 Tj 0 -208.8539 Td (3819 }) 34.9481 Tj 0 -218.3473 Td (3820 ) 21.8426 Tj 0 -227.8407 Td (3821 // Allocate fresh inode.) 135.4239 Tj 0 -237.334 Td (3822 if\(empty == 0\)) 91.7388 Tj 0 -246.8274 Td (3823 panic\("iget: no inodes"\);) 148.5295 Tj 0 -256.3207 Td (3824 ) 21.8426 Tj 0 -265.8141 Td (3825 ip = empty;) 78.6333 Tj 0 -275.3075 Td (3826 ip->dev = dev;) 91.7388 Tj 0 -284.8008 Td (3827 ip->inum = inum;) 100.4758 Tj 0 -294.2942 Td (3828 ip->ref = 1;) 83.0018 Tj 0 -303.7875 Td (3829 ip->flags = 0;) 91.7388 Tj 0 -313.2809 Td (3830 release\(&icache.lock\);) 126.6869 Tj 0 -322.7743 Td (3831 ) 21.8426 Tj 0 -332.2676 Td (3832 return ip;) 74.2647 Tj 0 -341.761 Td (3833 }) 26.2111 Tj 0 -351.2543 Td (3834 ) 21.8426 Tj 0 -360.7477 Td (3835 // Increment reference count for ip.) 179.1091 Tj 0 -370.2411 Td (3836 // Returns ip to enable ip = idup\(ip1\) idiom.) 218.4257 Tj 0 -379.7344 Td (3837 struct inode*) 78.6333 Tj 0 -389.2278 Td (3838 idup\(struct inode *ip\)) 117.9499 Tj 0 -398.7211 Td (3839 {) 26.2111 Tj 0 -408.2145 Td (3840 acquire\(&icache.lock\);) 126.6869 Tj 0 -417.7079 Td (3841 ip->ref++;) 74.2647 Tj 0 -427.2012 Td (3842 release\(&icache.lock\);) 126.6869 Tj 0 -436.6946 Td (3843 return ip;) 74.2647 Tj 0 -446.1879 Td (3844 }) 26.2111 Tj 0 -455.6813 Td (3845 ) 21.8426 Tj 0 -465.1747 Td (3846 ) 21.8426 Tj 0 -474.668 Td (3847 ) 21.8426 Tj 0 -484.1614 Td (3848 ) 21.8426 Tj 0 -493.6547 Td (3849 ) 21.8426 Tj 0 -522.1348 Td (Sheet 38) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 5) 152.898 Tj 0 -28.4801 Td (3850 // Lock the given inode.) 126.6869 Tj 0 -37.9735 Td (3851 void) 39.3166 Tj 0 -47.4668 Td (3852 ilock\(struct inode *ip\)) 122.3184 Tj 0 -56.9602 Td (3853 {) 26.2111 Tj 0 -66.4535 Td (3854 struct buf *bp;) 96.1073 Tj 0 -75.9469 Td (3855 struct dinode *dip;) 113.5814 Tj 0 -85.4403 Td (3856 ) 21.8426 Tj 0 -94.9336 Td (3857 if\(ip == 0 || ip->ref < 1\)) 144.161 Tj 0 -104.427 Td (3858 panic\("ilock"\);) 104.8443 Tj 0 -113.9203 Td (3859 ) 21.8426 Tj 0 -123.4137 Td (3860 acquire\(&icache.lock\);) 126.6869 Tj 0 -132.9071 Td (3861 while\(ip->flags & I_BUSY\)) 139.7925 Tj 0 -142.4004 Td (3862 sleep\(ip, &icache.lock\);) 144.161 Tj 0 -151.8938 Td (3863 ip->flags |= I_BUSY;) 117.9499 Tj 0 -161.3871 Td (3864 release\(&icache.lock\);) 126.6869 Tj 0 -170.8805 Td (3865 ) 21.8426 Tj 0 -180.3739 Td (3866 if\(!\(ip->flags & I_VALID\)\){) 148.5295 Tj 0 -189.8672 Td (3867 bp = bread\(ip->dev, IBLOCK\(ip->inum\)\);) 205.3202 Tj 0 -199.3606 Td (3868 dip = \(struct dinode*\)bp->data + ip->inum%IPB;) 240.2683 Tj 0 -208.8539 Td (3869 ip->type = dip->type;) 131.0554 Tj 0 -218.3473 Td (3870 ip->major = dip->major;) 139.7925 Tj 0 -227.8407 Td (3871 ip->minor = dip->minor;) 139.7925 Tj 0 -237.334 Td (3872 ip->nlink = dip->nlink;) 139.7925 Tj 0 -246.8274 Td (3873 ip->size = dip->size;) 131.0554 Tj 0 -256.3207 Td (3874 memmove\(ip->addrs, dip->addrs, sizeof\(ip->addrs\)\);) 257.7424 Tj 0 -265.8141 Td (3875 brelse\(bp\);) 87.3703 Tj 0 -275.3075 Td (3876 ip->flags |= I_VALID;) 131.0554 Tj 0 -284.8008 Td (3877 if\(ip->type == 0\)) 113.5814 Tj 0 -294.2942 Td (3878 panic\("ilock: no type"\);) 152.898 Tj 0 -303.7875 Td (3879 }) 34.9481 Tj 0 -313.2809 Td (3880 }) 26.2111 Tj 0 -322.7743 Td (3881 ) 21.8426 Tj 0 -332.2676 Td (3882 // Unlock the given inode.) 135.4239 Tj 0 -341.761 Td (3883 void) 39.3166 Tj 0 -351.2543 Td (3884 iunlock\(struct inode *ip\)) 131.0554 Tj 0 -360.7477 Td (3885 {) 26.2111 Tj 0 -370.2411 Td (3886 if\(ip == 0 || !\(ip->flags & I_BUSY\) || ip->ref < 1\)) 253.3738 Tj 0 -379.7344 Td (3887 panic\("iunlock"\);) 113.5814 Tj 0 -389.2278 Td (3888 ) 21.8426 Tj 0 -398.7211 Td (3889 acquire\(&icache.lock\);) 126.6869 Tj 0 -408.2145 Td (3890 ip->flags &= ~I_BUSY;) 122.3184 Tj 0 -417.7079 Td (3891 wakeup\(ip\);) 78.6333 Tj 0 -427.2012 Td (3892 release\(&icache.lock\);) 126.6869 Tj 0 -436.6946 Td (3893 }) 26.2111 Tj 0 -446.1879 Td (3894 ) 21.8426 Tj 0 -455.6813 Td (3895 ) 21.8426 Tj 0 -465.1747 Td (3896 ) 21.8426 Tj 0 -474.668 Td (3897 ) 21.8426 Tj 0 -484.1614 Td (3898 ) 21.8426 Tj 0 -493.6547 Td (3899 ) 21.8426 Tj 0 -522.1348 Td (Sheet 38) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 46 46 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 6) 152.898 Tj 0 -28.4801 Td (3900 // Caller holds reference to unlocked ip. Drop reference.) 275.2164 Tj 0 -37.9735 Td (3901 void) 39.3166 Tj 0 -47.4668 Td (3902 iput\(struct inode *ip\)) 117.9499 Tj 0 -56.9602 Td (3903 {) 26.2111 Tj 0 -66.4535 Td (3904 acquire\(&icache.lock\);) 126.6869 Tj 0 -75.9469 Td (3905 if\(ip->ref == 1 && \(ip->flags & I_VALID\) && ip->nlink\ == 0\){) 292.6905 Tj 0 -85.4403 Td (3906 // inode is no longer used: truncate and free inode.) 266.4794 Tj 0 -94.9336 Td (3907 if\(ip->flags & I_BUSY\)) 135.4239 Tj 0 -104.427 Td (3908 panic\("iput busy"\);) 131.0554 Tj 0 -113.9203 Td (3909 ip->flags |= I_BUSY;) 126.6869 Tj 0 -123.4137 Td (3910 release\(&icache.lock\);) 135.4239 Tj 0 -132.9071 Td (3911 itrunc\(ip\);) 87.3703 Tj 0 -142.4004 Td (3912 ip->type = 0;) 96.1073 Tj 0 -151.8938 Td (3913 iupdate\(ip\);) 91.7388 Tj 0 -161.3871 Td (3914 acquire\(&icache.lock\);) 135.4239 Tj 0 -170.8805 Td (3915 ip->flags &= ~I_BUSY;) 131.0554 Tj 0 -180.3739 Td (3916 wakeup\(ip\);) 87.3703 Tj 0 -189.8672 Td (3917 }) 34.9481 Tj 0 -199.3606 Td (3918 ip->ref--;) 74.2647 Tj 0 -208.8539 Td (3919 release\(&icache.lock\);) 126.6869 Tj 0 -218.3473 Td (3920 }) 26.2111 Tj 0 -227.8407 Td (3921 ) 21.8426 Tj 0 -237.334 Td (3922 // Common idiom: unlock, then put.) 170.3721 Tj 0 -246.8274 Td (3923 void) 39.3166 Tj 0 -256.3207 Td (3924 iunlockput\(struct inode *ip\)) 144.161 Tj 0 -265.8141 Td (3925 {) 26.2111 Tj 0 -275.3075 Td (3926 iunlock\(ip\);) 83.0018 Tj 0 -284.8008 Td (3927 iput\(ip\);) 69.8962 Tj 0 -294.2942 Td (3928 }) 26.2111 Tj 0 -303.7875 Td (3929 ) 21.8426 Tj 0 -313.2809 Td (3930 ) 21.8426 Tj 0 -322.7743 Td (3931 ) 21.8426 Tj 0 -332.2676 Td (3932 ) 21.8426 Tj 0 -341.761 Td (3933 ) 21.8426 Tj 0 -351.2543 Td (3934 ) 21.8426 Tj 0 -360.7477 Td (3935 ) 21.8426 Tj 0 -370.2411 Td (3936 ) 21.8426 Tj 0 -379.7344 Td (3937 ) 21.8426 Tj 0 -389.2278 Td (3938 ) 21.8426 Tj 0 -398.7211 Td (3939 ) 21.8426 Tj 0 -408.2145 Td (3940 ) 21.8426 Tj 0 -417.7079 Td (3941 ) 21.8426 Tj 0 -427.2012 Td (3942 ) 21.8426 Tj 0 -436.6946 Td (3943 ) 21.8426 Tj 0 -446.1879 Td (3944 ) 21.8426 Tj 0 -455.6813 Td (3945 ) 21.8426 Tj 0 -465.1747 Td (3946 ) 21.8426 Tj 0 -474.668 Td (3947 ) 21.8426 Tj 0 -484.1614 Td (3948 ) 21.8426 Tj 0 -493.6547 Td (3949 ) 21.8426 Tj 0 -522.1348 Td (Sheet 39) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 7) 152.898 Tj 0 -28.4801 Td (3950 // Allocate a new inode with the given type on device dev.) 275.2164 Tj 0 -37.9735 Td (3951 struct inode*) 78.6333 Tj 0 -47.4668 Td (3952 ialloc\(uint dev, short type\)) 144.161 Tj 0 -56.9602 Td (3953 {) 26.2111 Tj 0 -66.4535 Td (3954 int inum;) 69.8962 Tj 0 -75.9469 Td (3955 struct buf *bp;) 96.1073 Tj 0 -85.4403 Td (3956 struct dinode *dip;) 113.5814 Tj 0 -94.9336 Td (3957 struct superblock sb;) 122.3184 Tj 0 -104.427 Td (3958 ) 21.8426 Tj 0 -113.9203 Td (3959 readsb\(dev, &sb\);) 104.8443 Tj 0 -123.4137 Td (3960 for\(inum = 1; inum < sb.ninodes; inum++\){ // loop ove\ r inode blocks) 327.6386 Tj 0 -132.9071 Td (3961 bp = bread\(dev, IBLOCK\(inum\)\);) 170.3721 Tj 0 -142.4004 Td (3962 dip = \(struct dinode*\)bp->data + inum%IPB;) 222.7942 Tj 0 -151.8938 Td (3963 if\(dip->type == 0\){ // a free inode) 196.5831 Tj 0 -161.3871 Td (3964 memset\(dip, 0, sizeof\(*dip\)\);) 174.7406 Tj 0 -170.8805 Td (3965 dip->type = type;) 122.3184 Tj 0 -180.3739 Td (3966 bwrite\(bp\); // mark it allocated on the disk) 249.0053 Tj 0 -189.8672 Td (3967 brelse\(bp\);) 96.1073 Tj 0 -199.3606 Td (3968 return iget\(dev, inum\);) 148.5295 Tj 0 -208.8539 Td (3969 }) 43.6851 Tj 0 -218.3473 Td (3970 brelse\(bp\);) 87.3703 Tj 0 -227.8407 Td (3971 }) 34.9481 Tj 0 -237.334 Td (3972 panic\("ialloc: no inodes"\);) 148.5295 Tj 0 -246.8274 Td (3973 }) 26.2111 Tj 0 -256.3207 Td (3974 ) 21.8426 Tj 0 -265.8141 Td (3975 // Copy inode, which has changed, from memory to disk.) 257.7424 Tj 0 -275.3075 Td (3976 void) 39.3166 Tj 0 -284.8008 Td (3977 iupdate\(struct inode *ip\)) 131.0554 Tj 0 -294.2942 Td (3978 {) 26.2111 Tj 0 -303.7875 Td (3979 struct buf *bp;) 96.1073 Tj 0 -313.2809 Td (3980 struct dinode *dip;) 113.5814 Tj 0 -322.7743 Td (3981 ) 21.8426 Tj 0 -332.2676 Td (3982 bp = bread\(ip->dev, IBLOCK\(ip->inum\)\);) 196.5831 Tj 0 -341.761 Td (3983 dip = \(struct dinode*\)bp->data + ip->inum%IPB;) 231.5313 Tj 0 -351.2543 Td (3984 dip->type = ip->type;) 122.3184 Tj 0 -360.7477 Td (3985 dip->major = ip->major;) 131.0554 Tj 0 -370.2411 Td (3986 dip->minor = ip->minor;) 131.0554 Tj 0 -379.7344 Td (3987 dip->nlink = ip->nlink;) 131.0554 Tj 0 -389.2278 Td (3988 dip->size = ip->size;) 122.3184 Tj 0 -398.7211 Td (3989 memmove\(dip->addrs, ip->addrs, sizeof\(ip->addrs\)\);) 249.0053 Tj 0 -408.2145 Td (3990 bwrite\(bp\);) 78.6333 Tj 0 -417.7079 Td (3991 brelse\(bp\);) 78.6333 Tj 0 -427.2012 Td (3992 }) 26.2111 Tj 0 -436.6946 Td (3993 ) 21.8426 Tj 0 -446.1879 Td (3994 ) 21.8426 Tj 0 -455.6813 Td (3995 ) 21.8426 Tj 0 -465.1747 Td (3996 ) 21.8426 Tj 0 -474.668 Td (3997 ) 21.8426 Tj 0 -484.1614 Td (3998 ) 21.8426 Tj 0 -493.6547 Td (3999 ) 21.8426 Tj 0 -522.1348 Td (Sheet 39) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 47 47 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 8) 152.898 Tj 0 -28.4801 Td (4000 // Inode contents) 96.1073 Tj 0 -37.9735 Td (4001 //) 30.5796 Tj 0 -47.4668 Td (4002 // The contents \(data\) associated with each inode is sto\ red) 279.5849 Tj 0 -56.9602 Td (4003 // in a sequence of blocks on the disk. The first NDIRECT\ blocks) 305.796 Tj 0 -66.4535 Td (4004 // are listed in ip->addrs[]. The next NINDIRECT blocks a\ re) 283.9534 Tj 0 -75.9469 Td (4005 // listed in the block ip->addrs[INDIRECT].) 209.6887 Tj 0 -85.4403 Td (4006 ) 21.8426 Tj 0 -94.9336 Td (4007 // Return the disk block address of the nth block in inode\ ip.) 292.6905 Tj 0 -104.427 Td (4008 // If there is no such block, alloc controls whether one i\ s allocated.) 327.6386 Tj 0 -113.9203 Td (4009 static uint) 69.8962 Tj 0 -123.4137 Td (4010 bmap\(struct inode *ip, uint bn, int alloc\)) 205.3202 Tj 0 -132.9071 Td (4011 {) 26.2111 Tj 0 -142.4004 Td (4012 uint addr, *a;) 91.7388 Tj 0 -151.8938 Td (4013 struct buf *bp;) 96.1073 Tj 0 -161.3871 Td (4014 ) 21.8426 Tj 0 -170.8805 Td (4015 if\(bn < NDIRECT\){) 104.8443 Tj 0 -180.3739 Td (4016 if\(\(addr = ip->addrs[bn]\) == 0\){) 179.1091 Tj 0 -189.8672 Td (4017 if\(!alloc\)) 91.7388 Tj 0 -199.3606 Td (4018 return -1;) 100.4758 Tj 0 -208.8539 Td (4019 ip->addrs[bn] = addr = balloc\(ip->dev\);) 218.4257 Tj 0 -218.3473 Td (4020 }) 43.6851 Tj 0 -227.8407 Td (4021 return addr;) 91.7388 Tj 0 -237.334 Td (4022 }) 34.9481 Tj 0 -246.8274 Td (4023 bn -= NDIRECT;) 91.7388 Tj 0 -256.3207 Td (4024 ) 21.8426 Tj 0 -265.8141 Td (4025 if\(bn < NINDIRECT\){) 113.5814 Tj 0 -275.3075 Td (4026 // Load indirect block, allocating if necessary.) 249.0053 Tj 0 -284.8008 Td (4027 if\(\(addr = ip->addrs[INDIRECT]\) == 0\){) 205.3202 Tj 0 -294.2942 Td (4028 if\(!alloc\)) 91.7388 Tj 0 -303.7875 Td (4029 return -1;) 100.4758 Tj 0 -313.2809 Td (4030 ip->addrs[INDIRECT] = addr = balloc\(ip->dev\);) 244.6368 Tj 0 -322.7743 Td (4031 }) 43.6851 Tj 0 -332.2676 Td (4032 bp = bread\(ip->dev, addr\);) 152.898 Tj 0 -341.761 Td (4033 a = \(uint*\)bp->data;) 126.6869 Tj 0 -351.2543 Td (4034 ) 21.8426 Tj 0 -360.7477 Td (4035 if\(\(addr = a[bn]\) == 0\){) 144.161 Tj 0 -370.2411 Td (4036 if\(!alloc\){) 96.1073 Tj 0 -379.7344 Td (4037 brelse\(bp\);) 104.8443 Tj 0 -389.2278 Td (4038 return -1;) 100.4758 Tj 0 -398.7211 Td (4039 }) 52.4222 Tj 0 -408.2145 Td (4040 a[bn] = addr = balloc\(ip->dev\);) 183.4776 Tj 0 -417.7079 Td (4041 bwrite\(bp\);) 96.1073 Tj 0 -427.2012 Td (4042 }) 43.6851 Tj 0 -436.6946 Td (4043 brelse\(bp\);) 87.3703 Tj 0 -446.1879 Td (4044 return addr;) 91.7388 Tj 0 -455.6813 Td (4045 }) 34.9481 Tj 0 -465.1747 Td (4046 ) 21.8426 Tj 0 -474.668 Td (4047 panic\("bmap: out of range"\);) 152.898 Tj 0 -484.1614 Td (4048 }) 26.2111 Tj 0 -493.6547 Td (4049 ) 21.8426 Tj 0 -522.1348 Td (Sheet 40) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 9) 152.898 Tj 0 -28.4801 Td (4050 // Truncate inode \(discard contents\).) 183.4776 Tj 0 -37.9735 Td (4051 static void) 69.8962 Tj 0 -47.4668 Td (4052 itrunc\(struct inode *ip\)) 126.6869 Tj 0 -56.9602 Td (4053 {) 26.2111 Tj 0 -66.4535 Td (4054 int i, j;) 69.8962 Tj 0 -75.9469 Td (4055 struct buf *bp;) 96.1073 Tj 0 -85.4403 Td (4056 uint *a;) 65.5277 Tj 0 -94.9336 Td (4057 ) 21.8426 Tj 0 -104.427 Td (4058 for\(i = 0; i < NDIRECT; i++\){) 157.2665 Tj 0 -113.9203 Td (4059 if\(ip->addrs[i]\){) 113.5814 Tj 0 -123.4137 Td (4060 bfree\(ip->dev, ip->addrs[i]\);) 174.7406 Tj 0 -132.9071 Td (4061 ip->addrs[i] = 0;) 122.3184 Tj 0 -142.4004 Td (4062 }) 43.6851 Tj 0 -151.8938 Td (4063 }) 34.9481 Tj 0 -161.3871 Td (4064 ) 21.8426 Tj 0 -170.8805 Td (4065 if\(ip->addrs[INDIRECT]\){) 135.4239 Tj 0 -180.3739 Td (4066 bp = bread\(ip->dev, ip->addrs[INDIRECT]\);) 218.4257 Tj 0 -189.8672 Td (4067 a = \(uint*\)bp->data;) 126.6869 Tj 0 -199.3606 Td (4068 for\(j = 0; j < NINDIRECT; j++\){) 174.7406 Tj 0 -208.8539 Td (4069 if\(a[j]\)) 83.0018 Tj 0 -218.3473 Td (4070 bfree\(ip->dev, a[j]\);) 148.5295 Tj 0 -227.8407 Td (4071 }) 43.6851 Tj 0 -237.334 Td (4072 brelse\(bp\);) 87.3703 Tj 0 -246.8274 Td (4073 ip->addrs[INDIRECT] = 0;) 144.161 Tj 0 -256.3207 Td (4074 }) 34.9481 Tj 0 -265.8141 Td (4075 ) 21.8426 Tj 0 -275.3075 Td (4076 ip->size = 0;) 87.3703 Tj 0 -284.8008 Td (4077 iupdate\(ip\);) 83.0018 Tj 0 -294.2942 Td (4078 }) 26.2111 Tj 0 -303.7875 Td (4079 ) 21.8426 Tj 0 -313.2809 Td (4080 // Copy stat information from inode.) 179.1091 Tj 0 -322.7743 Td (4081 void) 39.3166 Tj 0 -332.2676 Td (4082 stati\(struct inode *ip, struct stat *st\)) 196.5831 Tj 0 -341.761 Td (4083 {) 26.2111 Tj 0 -351.2543 Td (4084 st->dev = ip->dev;) 109.2129 Tj 0 -360.7477 Td (4085 st->ino = ip->inum;) 113.5814 Tj 0 -370.2411 Td (4086 st->type = ip->type;) 117.9499 Tj 0 -379.7344 Td (4087 st->nlink = ip->nlink;) 126.6869 Tj 0 -389.2278 Td (4088 st->size = ip->size;) 117.9499 Tj 0 -398.7211 Td (4089 }) 26.2111 Tj 0 -408.2145 Td (4090 ) 21.8426 Tj 0 -417.7079 Td (4091 ) 21.8426 Tj 0 -427.2012 Td (4092 ) 21.8426 Tj 0 -436.6946 Td (4093 ) 21.8426 Tj 0 -446.1879 Td (4094 ) 21.8426 Tj 0 -455.6813 Td (4095 ) 21.8426 Tj 0 -465.1747 Td (4096 ) 21.8426 Tj 0 -474.668 Td (4097 ) 21.8426 Tj 0 -484.1614 Td (4098 ) 21.8426 Tj 0 -493.6547 Td (4099 ) 21.8426 Tj 0 -522.1348 Td (Sheet 40) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 48 48 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 10) 157.2665 Tj 0 -28.4801 Td (4100 // Read data from inode.) 126.6869 Tj 0 -37.9735 Td (4101 int) 34.9481 Tj 0 -47.4668 Td (4102 readi\(struct inode *ip, char *dst, uint off, uint n\)) 249.0053 Tj 0 -56.9602 Td (4103 {) 26.2111 Tj 0 -66.4535 Td (4104 uint tot, m;) 83.0018 Tj 0 -75.9469 Td (4105 struct buf *bp;) 96.1073 Tj 0 -85.4403 Td (4106 ) 21.8426 Tj 0 -94.9336 Td (4107 if\(ip->type == T_DEV\){) 126.6869 Tj 0 -104.427 Td (4108 if\(ip->major < 0 || ip->major >= NDEV || !devsw[ip->m\ ajor].read\)) 318.9016 Tj 0 -113.9203 Td (4109 return -1;) 91.7388 Tj 0 -123.4137 Td (4110 return devsw[ip->major].read\(ip, dst, n\);) 218.4257 Tj 0 -132.9071 Td (4111 }) 34.9481 Tj 0 -142.4004 Td (4112 ) 21.8426 Tj 0 -151.8938 Td (4113 if\(off > ip->size || off + n < off\)) 183.4776 Tj 0 -161.3871 Td (4114 return -1;) 83.0018 Tj 0 -170.8805 Td (4115 if\(off + n > ip->size\)) 126.6869 Tj 0 -180.3739 Td (4116 n = ip->size - off;) 122.3184 Tj 0 -189.8672 Td (4117 ) 21.8426 Tj 0 -199.3606 Td (4118 for\(tot=0; totdev, bmap\(ip, off/BSIZE, 0\)\);) 231.5313 Tj 0 -218.3473 Td (4120 m = min\(n - tot, BSIZE - off%BSIZE\);) 196.5831 Tj 0 -227.8407 Td (4121 memmove\(dst, bp->data + off%BSIZE, m\);) 205.3202 Tj 0 -237.334 Td (4122 brelse\(bp\);) 87.3703 Tj 0 -246.8274 Td (4123 }) 34.9481 Tj 0 -256.3207 Td (4124 return n;) 69.8962 Tj 0 -265.8141 Td (4125 }) 26.2111 Tj 0 -275.3075 Td (4126 ) 21.8426 Tj 0 -284.8008 Td (4127 ) 21.8426 Tj 0 -294.2942 Td (4128 ) 21.8426 Tj 0 -303.7875 Td (4129 ) 21.8426 Tj 0 -313.2809 Td (4130 ) 21.8426 Tj 0 -322.7743 Td (4131 ) 21.8426 Tj 0 -332.2676 Td (4132 ) 21.8426 Tj 0 -341.761 Td (4133 ) 21.8426 Tj 0 -351.2543 Td (4134 ) 21.8426 Tj 0 -360.7477 Td (4135 ) 21.8426 Tj 0 -370.2411 Td (4136 ) 21.8426 Tj 0 -379.7344 Td (4137 ) 21.8426 Tj 0 -389.2278 Td (4138 ) 21.8426 Tj 0 -398.7211 Td (4139 ) 21.8426 Tj 0 -408.2145 Td (4140 ) 21.8426 Tj 0 -417.7079 Td (4141 ) 21.8426 Tj 0 -427.2012 Td (4142 ) 21.8426 Tj 0 -436.6946 Td (4143 ) 21.8426 Tj 0 -446.1879 Td (4144 ) 21.8426 Tj 0 -455.6813 Td (4145 ) 21.8426 Tj 0 -465.1747 Td (4146 ) 21.8426 Tj 0 -474.668 Td (4147 ) 21.8426 Tj 0 -484.1614 Td (4148 ) 21.8426 Tj 0 -493.6547 Td (4149 ) 21.8426 Tj 0 -522.1348 Td (Sheet 41) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 11) 157.2665 Tj 0 -28.4801 Td (4150 // Write data to inode.) 122.3184 Tj 0 -37.9735 Td (4151 int) 34.9481 Tj 0 -47.4668 Td (4152 writei\(struct inode *ip, char *src, uint off, uint n\)) 253.3738 Tj 0 -56.9602 Td (4153 {) 26.2111 Tj 0 -66.4535 Td (4154 uint tot, m;) 83.0018 Tj 0 -75.9469 Td (4155 struct buf *bp;) 96.1073 Tj 0 -85.4403 Td (4156 ) 21.8426 Tj 0 -94.9336 Td (4157 if\(ip->type == T_DEV\){) 126.6869 Tj 0 -104.427 Td (4158 if\(ip->major < 0 || ip->major >= NDEV || !devsw[ip->m\ ajor].write\)) 323.2701 Tj 0 -113.9203 Td (4159 return -1;) 91.7388 Tj 0 -123.4137 Td (4160 return devsw[ip->major].write\(ip, src, n\);) 222.7942 Tj 0 -132.9071 Td (4161 }) 34.9481 Tj 0 -142.4004 Td (4162 ) 21.8426 Tj 0 -151.8938 Td (4163 if\(off + n < off\)) 104.8443 Tj 0 -161.3871 Td (4164 return -1;) 83.0018 Tj 0 -170.8805 Td (4165 if\(off + n > MAXFILE*BSIZE\)) 148.5295 Tj 0 -180.3739 Td (4166 n = MAXFILE*BSIZE - off;) 144.161 Tj 0 -189.8672 Td (4167 ) 21.8426 Tj 0 -199.3606 Td (4168 for\(tot=0; totdev, bmap\(ip, off/BSIZE, 1\)\);) 231.5313 Tj 0 -218.3473 Td (4170 m = min\(n - tot, BSIZE - off%BSIZE\);) 196.5831 Tj 0 -227.8407 Td (4171 memmove\(bp->data + off%BSIZE, src, m\);) 205.3202 Tj 0 -237.334 Td (4172 bwrite\(bp\);) 87.3703 Tj 0 -246.8274 Td (4173 brelse\(bp\);) 87.3703 Tj 0 -256.3207 Td (4174 }) 34.9481 Tj 0 -265.8141 Td (4175 ) 21.8426 Tj 0 -275.3075 Td (4176 if\(n > 0 && off > ip->size\){) 152.898 Tj 0 -284.8008 Td (4177 ip->size = off;) 104.8443 Tj 0 -294.2942 Td (4178 iupdate\(ip\);) 91.7388 Tj 0 -303.7875 Td (4179 }) 34.9481 Tj 0 -313.2809 Td (4180 return n;) 69.8962 Tj 0 -322.7743 Td (4181 }) 26.2111 Tj 0 -332.2676 Td (4182 ) 21.8426 Tj 0 -341.761 Td (4183 ) 21.8426 Tj 0 -351.2543 Td (4184 ) 21.8426 Tj 0 -360.7477 Td (4185 ) 21.8426 Tj 0 -370.2411 Td (4186 ) 21.8426 Tj 0 -379.7344 Td (4187 ) 21.8426 Tj 0 -389.2278 Td (4188 ) 21.8426 Tj 0 -398.7211 Td (4189 ) 21.8426 Tj 0 -408.2145 Td (4190 ) 21.8426 Tj 0 -417.7079 Td (4191 ) 21.8426 Tj 0 -427.2012 Td (4192 ) 21.8426 Tj 0 -436.6946 Td (4193 ) 21.8426 Tj 0 -446.1879 Td (4194 ) 21.8426 Tj 0 -455.6813 Td (4195 ) 21.8426 Tj 0 -465.1747 Td (4196 ) 21.8426 Tj 0 -474.668 Td (4197 ) 21.8426 Tj 0 -484.1614 Td (4198 ) 21.8426 Tj 0 -493.6547 Td (4199 ) 21.8426 Tj 0 -522.1348 Td (Sheet 41) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 49 49 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 12) 157.2665 Tj 0 -28.4801 Td (4200 // Directories) 83.0018 Tj 0 -37.9735 Td (4201 ) 21.8426 Tj 0 -47.4668 Td (4202 int) 34.9481 Tj 0 -56.9602 Td (4203 namecmp\(const char *s, const char *t\)) 183.4776 Tj 0 -66.4535 Td (4204 {) 26.2111 Tj 0 -75.9469 Td (4205 return strncmp\(s, t, DIRSIZ\);) 157.2665 Tj 0 -85.4403 Td (4206 }) 26.2111 Tj 0 -94.9336 Td (4207 ) 21.8426 Tj 0 -104.427 Td (4208 // Look for a directory entry in a directory.) 218.4257 Tj 0 -113.9203 Td (4209 // If found, set *poff to byte offset of entry.) 227.1628 Tj 0 -123.4137 Td (4210 // Caller must have already locked dp.) 187.8461 Tj 0 -132.9071 Td (4211 struct inode*) 78.6333 Tj 0 -142.4004 Td (4212 dirlookup\(struct inode *dp, char *name, uint *poff\)) 244.6368 Tj 0 -151.8938 Td (4213 {) 26.2111 Tj 0 -161.3871 Td (4214 uint off, inum;) 96.1073 Tj 0 -170.8805 Td (4215 struct buf *bp;) 96.1073 Tj 0 -180.3739 Td (4216 struct dirent *de;) 109.2129 Tj 0 -189.8672 Td (4217 ) 21.8426 Tj 0 -199.3606 Td (4218 if\(dp->type != T_DIR\)) 122.3184 Tj 0 -208.8539 Td (4219 panic\("dirlookup not DIR"\);) 157.2665 Tj 0 -218.3473 Td (4220 ) 21.8426 Tj 0 -227.8407 Td (4221 for\(off = 0; off < dp->size; off += BSIZE\){) 218.4257 Tj 0 -237.334 Td (4222 bp = bread\(dp->dev, bmap\(dp, off / BSIZE, 0\)\);) 240.2683 Tj 0 -246.8274 Td (4223 for\(de = \(struct dirent*\)bp->data;) 187.8461 Tj 0 -256.3207 Td (4224 de < \(struct dirent*\)\(bp->data + BSIZE\);) 231.5313 Tj 0 -265.8141 Td (4225 de++\){) 83.0018 Tj 0 -275.3075 Td (4226 if\(de->inum == 0\)) 122.3184 Tj 0 -284.8008 Td (4227 continue;) 96.1073 Tj 0 -294.2942 Td (4228 if\(namecmp\(name, de->name\) == 0\){) 192.2146 Tj 0 -303.7875 Td (4229 // entry matches path element) 183.4776 Tj 0 -313.2809 Td (4230 if\(poff\)) 91.7388 Tj 0 -322.7743 Td (4231 *poff = off + \(uchar*\)de - bp->data;) 222.7942 Tj 0 -332.2676 Td (4232 inum = de->inum;) 126.6869 Tj 0 -341.761 Td (4233 brelse\(bp\);) 104.8443 Tj 0 -351.2543 Td (4234 return iget\(dp->dev, inum\);) 174.7406 Tj 0 -360.7477 Td (4235 }) 52.4222 Tj 0 -370.2411 Td (4236 }) 43.6851 Tj 0 -379.7344 Td (4237 brelse\(bp\);) 87.3703 Tj 0 -389.2278 Td (4238 }) 34.9481 Tj 0 -398.7211 Td (4239 return 0;) 69.8962 Tj 0 -408.2145 Td (4240 }) 26.2111 Tj 0 -417.7079 Td (4241 ) 21.8426 Tj 0 -427.2012 Td (4242 ) 21.8426 Tj 0 -436.6946 Td (4243 ) 21.8426 Tj 0 -446.1879 Td (4244 ) 21.8426 Tj 0 -455.6813 Td (4245 ) 21.8426 Tj 0 -465.1747 Td (4246 ) 21.8426 Tj 0 -474.668 Td (4247 ) 21.8426 Tj 0 -484.1614 Td (4248 ) 21.8426 Tj 0 -493.6547 Td (4249 ) 21.8426 Tj 0 -522.1348 Td (Sheet 42) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 13) 157.2665 Tj 0 -28.4801 Td (4250 // Write a new directory entry \(name, ino\) into the dire\ ctory dp.) 305.796 Tj 0 -37.9735 Td (4251 int) 34.9481 Tj 0 -47.4668 Td (4252 dirlink\(struct inode *dp, char *name, uint ino\)) 227.1628 Tj 0 -56.9602 Td (4253 {) 26.2111 Tj 0 -66.4535 Td (4254 int off;) 65.5277 Tj 0 -75.9469 Td (4255 struct dirent de;) 104.8443 Tj 0 -85.4403 Td (4256 struct inode *ip;) 104.8443 Tj 0 -94.9336 Td (4257 ) 21.8426 Tj 0 -104.427 Td (4258 // Check that name is not present.) 179.1091 Tj 0 -113.9203 Td (4259 if\(\(ip = dirlookup\(dp, name, 0\)\) != 0\){) 200.9517 Tj 0 -123.4137 Td (4260 iput\(ip\);) 78.6333 Tj 0 -132.9071 Td (4261 return -1;) 83.0018 Tj 0 -142.4004 Td (4262 }) 34.9481 Tj 0 -151.8938 Td (4263 ) 21.8426 Tj 0 -161.3871 Td (4264 // Look for an empty dirent.) 152.898 Tj 0 -170.8805 Td (4265 for\(off = 0; off < dp->size; off += sizeof\(de\)\){) 240.2683 Tj 0 -180.3739 Td (4266 if\(readi\(dp, \(char*\)&de, off, sizeof\(de\)\) != si\ zeof\(de\)\)) 283.9534 Tj 0 -189.8672 Td (4267 panic\("dirlink read"\);) 144.161 Tj 0 -199.3606 Td (4268 if\(de.inum == 0\)) 109.2129 Tj 0 -208.8539 Td (4269 break;) 74.2647 Tj 0 -218.3473 Td (4270 }) 34.9481 Tj 0 -227.8407 Td (4271 ) 21.8426 Tj 0 -237.334 Td (4272 strncpy\(de.name, name, DIRSIZ\);) 166.0035 Tj 0 -246.8274 Td (4273 de.inum = ino;) 91.7388 Tj 0 -256.3207 Td (4274 if\(writei\(dp, \(char*\)&de, off, sizeof\(de\)\) != siz\ eof\(de\)\)) 279.5849 Tj 0 -265.8141 Td (4275 panic\("dirlink"\);) 113.5814 Tj 0 -275.3075 Td (4276 ) 21.8426 Tj 0 -284.8008 Td (4277 return 0;) 69.8962 Tj 0 -294.2942 Td (4278 }) 26.2111 Tj 0 -303.7875 Td (4279 ) 21.8426 Tj 0 -313.2809 Td (4280 ) 21.8426 Tj 0 -322.7743 Td (4281 ) 21.8426 Tj 0 -332.2676 Td (4282 ) 21.8426 Tj 0 -341.761 Td (4283 ) 21.8426 Tj 0 -351.2543 Td (4284 ) 21.8426 Tj 0 -360.7477 Td (4285 ) 21.8426 Tj 0 -370.2411 Td (4286 ) 21.8426 Tj 0 -379.7344 Td (4287 ) 21.8426 Tj 0 -389.2278 Td (4288 ) 21.8426 Tj 0 -398.7211 Td (4289 ) 21.8426 Tj 0 -408.2145 Td (4290 ) 21.8426 Tj 0 -417.7079 Td (4291 ) 21.8426 Tj 0 -427.2012 Td (4292 ) 21.8426 Tj 0 -436.6946 Td (4293 ) 21.8426 Tj 0 -446.1879 Td (4294 ) 21.8426 Tj 0 -455.6813 Td (4295 ) 21.8426 Tj 0 -465.1747 Td (4296 ) 21.8426 Tj 0 -474.668 Td (4297 ) 21.8426 Tj 0 -484.1614 Td (4298 ) 21.8426 Tj 0 -493.6547 Td (4299 ) 21.8426 Tj 0 -522.1348 Td (Sheet 42) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 50 50 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 14) 157.2665 Tj 0 -28.4801 Td (4300 // Paths) 56.7907 Tj 0 -37.9735 Td (4301 ) 21.8426 Tj 0 -47.4668 Td (4302 // Copy the next path element from path into name.) 240.2683 Tj 0 -56.9602 Td (4303 // Return a pointer to the element following the copied on\ e.) 283.9534 Tj 0 -66.4535 Td (4304 // The returned path has no leading slashes,) 214.0572 Tj 0 -75.9469 Td (4305 // so the caller can check *path=='\\0' to see if the name\ is the last one.) 345.1126 Tj 0 -85.4403 Td (4306 // If no name to remove, return 0.) 170.3721 Tj 0 -94.9336 Td (4307 //) 30.5796 Tj 0 -104.427 Td (4308 // Examples:) 74.2647 Tj 0 -113.9203 Td (4309 // skipelem\("a/bb/c", name\) = "bb/c", setting name = "\ a") 275.2164 Tj 0 -123.4137 Td (4310 // skipelem\("///a//bb", name\) = "bb", setting name = "\ a") 275.2164 Tj 0 -132.9071 Td (4311 // skipelem\("", name\) = skipelem\("////", name\) = 0) 249.0053 Tj 0 -142.4004 Td (4312 //) 30.5796 Tj 0 -151.8938 Td (4313 static char*) 74.2647 Tj 0 -161.3871 Td (4314 skipelem\(char *path, char *name\)) 161.635 Tj 0 -170.8805 Td (4315 {) 26.2111 Tj 0 -180.3739 Td (4316 char *s;) 65.5277 Tj 0 -189.8672 Td (4317 int len;) 65.5277 Tj 0 -199.3606 Td (4318 ) 21.8426 Tj 0 -208.8539 Td (4319 while\(*path == '/'\)) 113.5814 Tj 0 -218.3473 Td (4320 path++;) 69.8962 Tj 0 -227.8407 Td (4321 if\(*path == 0\)) 91.7388 Tj 0 -237.334 Td (4322 return 0;) 78.6333 Tj 0 -246.8274 Td (4323 s = path;) 69.8962 Tj 0 -256.3207 Td (4324 while\(*path != '/' && *path != 0\)) 174.7406 Tj 0 -265.8141 Td (4325 path++;) 69.8962 Tj 0 -275.3075 Td (4326 len = path - s;) 96.1073 Tj 0 -284.8008 Td (4327 if\(len >= DIRSIZ\)) 104.8443 Tj 0 -294.2942 Td (4328 memmove\(name, s, DIRSIZ\);) 148.5295 Tj 0 -303.7875 Td (4329 else {) 56.7907 Tj 0 -313.2809 Td (4330 memmove\(name, s, len\);) 135.4239 Tj 0 -322.7743 Td (4331 name[len] = 0;) 100.4758 Tj 0 -332.2676 Td (4332 }) 34.9481 Tj 0 -341.761 Td (4333 while\(*path == '/'\)) 113.5814 Tj 0 -351.2543 Td (4334 path++;) 69.8962 Tj 0 -360.7477 Td (4335 return path;) 83.0018 Tj 0 -370.2411 Td (4336 }) 26.2111 Tj 0 -379.7344 Td (4337 ) 21.8426 Tj 0 -389.2278 Td (4338 ) 21.8426 Tj 0 -398.7211 Td (4339 ) 21.8426 Tj 0 -408.2145 Td (4340 ) 21.8426 Tj 0 -417.7079 Td (4341 ) 21.8426 Tj 0 -427.2012 Td (4342 ) 21.8426 Tj 0 -436.6946 Td (4343 ) 21.8426 Tj 0 -446.1879 Td (4344 ) 21.8426 Tj 0 -455.6813 Td (4345 ) 21.8426 Tj 0 -465.1747 Td (4346 ) 21.8426 Tj 0 -474.668 Td (4347 ) 21.8426 Tj 0 -484.1614 Td (4348 ) 21.8426 Tj 0 -493.6547 Td (4349 ) 21.8426 Tj 0 -522.1348 Td (Sheet 43) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/fs.c Page 15) 157.2665 Tj 0 -28.4801 Td (4350 // Look up and return the inode for a path name.) 231.5313 Tj 0 -37.9735 Td (4351 // If parent != 0, return the inode for the parent and cop\ y the final) 323.2701 Tj 0 -47.4668 Td (4352 // path element into name, which must have room for DIRSIZ\ bytes.) 305.796 Tj 0 -56.9602 Td (4353 static struct inode*) 109.2129 Tj 0 -66.4535 Td (4354 _namei\(char *path, int parent, char *name\)) 205.3202 Tj 0 -75.9469 Td (4355 {) 26.2111 Tj 0 -85.4403 Td (4356 struct inode *ip, *next;) 135.4239 Tj 0 -94.9336 Td (4357 ) 21.8426 Tj 0 -104.427 Td (4358 if\(*path == '/'\)) 100.4758 Tj 0 -113.9203 Td (4359 ip = iget\(ROOTDEV, 1\);) 135.4239 Tj 0 -123.4137 Td (4360 else) 48.0537 Tj 0 -132.9071 Td (4361 ip = idup\(cp->cwd\);) 122.3184 Tj 0 -142.4004 Td (4362 ) 21.8426 Tj 0 -151.8938 Td (4363 while\(\(path = skipelem\(path, name\)\) != 0\){) 214.0572 Tj 0 -161.3871 Td (4364 ilock\(ip\);) 83.0018 Tj 0 -170.8805 Td (4365 if\(ip->type != T_DIR\){) 135.4239 Tj 0 -180.3739 Td (4366 iunlockput\(ip\);) 113.5814 Tj 0 -189.8672 Td (4367 return 0;) 87.3703 Tj 0 -199.3606 Td (4368 }) 43.6851 Tj 0 -208.8539 Td (4369 if\(parent && *path == '\\0'\){) 161.635 Tj 0 -218.3473 Td (4370 // Stop one level early.) 152.898 Tj 0 -227.8407 Td (4371 iunlock\(ip\);) 100.4758 Tj 0 -237.334 Td (4372 return ip;) 91.7388 Tj 0 -246.8274 Td (4373 }) 43.6851 Tj 0 -256.3207 Td (4374 if\(\(next = dirlookup\(ip, name, 0\)\) == 0\){) 218.4257 Tj 0 -265.8141 Td (4375 iunlockput\(ip\);) 113.5814 Tj 0 -275.3075 Td (4376 return 0;) 87.3703 Tj 0 -284.8008 Td (4377 }) 43.6851 Tj 0 -294.2942 Td (4378 iunlockput\(ip\);) 104.8443 Tj 0 -303.7875 Td (4379 ip = next;) 83.0018 Tj 0 -313.2809 Td (4380 }) 34.9481 Tj 0 -322.7743 Td (4381 if\(parent\){) 78.6333 Tj 0 -332.2676 Td (4382 iput\(ip\);) 78.6333 Tj 0 -341.761 Td (4383 return 0;) 78.6333 Tj 0 -351.2543 Td (4384 }) 34.9481 Tj 0 -360.7477 Td (4385 return ip;) 74.2647 Tj 0 -370.2411 Td (4386 }) 26.2111 Tj 0 -379.7344 Td (4387 ) 21.8426 Tj 0 -389.2278 Td (4388 struct inode*) 78.6333 Tj 0 -398.7211 Td (4389 namei\(char *path\)) 96.1073 Tj 0 -408.2145 Td (4390 {) 26.2111 Tj 0 -417.7079 Td (4391 char name[DIRSIZ];) 109.2129 Tj 0 -427.2012 Td (4392 return _namei\(path, 0, name\);) 157.2665 Tj 0 -436.6946 Td (4393 }) 26.2111 Tj 0 -446.1879 Td (4394 ) 21.8426 Tj 0 -455.6813 Td (4395 struct inode*) 78.6333 Tj 0 -465.1747 Td (4396 nameiparent\(char *path, char *name\)) 174.7406 Tj 0 -474.668 Td (4397 {) 26.2111 Tj 0 -484.1614 Td (4398 return _namei\(path, 1, name\);) 157.2665 Tj 0 -493.6547 Td (4399 }) 26.2111 Tj 0 -522.1348 Td (Sheet 43) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 51 51 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/file.c Page 1) 161.635 Tj 0 -28.4801 Td (4400 #include "types.h") 100.4758 Tj 0 -37.9735 Td (4401 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (4402 #include "param.h") 100.4758 Tj 0 -56.9602 Td (4403 #include "file.h") 96.1073 Tj 0 -66.4535 Td (4404 #include "spinlock.h") 113.5814 Tj 0 -75.9469 Td (4405 #include "dev.h") 91.7388 Tj 0 -85.4403 Td (4406 ) 21.8426 Tj 0 -94.9336 Td (4407 struct devsw devsw[NDEV];) 131.0554 Tj 0 -104.427 Td (4408 struct spinlock file_table_lock;) 161.635 Tj 0 -113.9203 Td (4409 struct file file[NFILE];) 126.6869 Tj 0 -123.4137 Td (4410 ) 21.8426 Tj 0 -132.9071 Td (4411 void) 39.3166 Tj 0 -142.4004 Td (4412 fileinit\(void\)) 83.0018 Tj 0 -151.8938 Td (4413 {) 26.2111 Tj 0 -161.3871 Td (4414 initlock\(&file_table_lock, "file_table"\);) 209.6887 Tj 0 -170.8805 Td (4415 }) 26.2111 Tj 0 -180.3739 Td (4416 ) 21.8426 Tj 0 -189.8672 Td (4417 // Allocate a file structure.) 148.5295 Tj 0 -199.3606 Td (4418 struct file*) 74.2647 Tj 0 -208.8539 Td (4419 filealloc\(void\)) 87.3703 Tj 0 -218.3473 Td (4420 {) 26.2111 Tj 0 -227.8407 Td (4421 int i;) 56.7907 Tj 0 -237.334 Td (4422 ) 21.8426 Tj 0 -246.8274 Td (4423 acquire\(&file_table_lock\);) 144.161 Tj 0 -256.3207 Td (4424 for\(i = 0; i < NFILE; i++\){) 148.5295 Tj 0 -265.8141 Td (4425 if\(file[i].type == FD_CLOSED\){) 170.3721 Tj 0 -275.3075 Td (4426 file[i].type = FD_NONE;) 148.5295 Tj 0 -284.8008 Td (4427 file[i].ref = 1;) 117.9499 Tj 0 -294.2942 Td (4428 release\(&file_table_lock\);) 161.635 Tj 0 -303.7875 Td (4429 return file + i;) 117.9499 Tj 0 -313.2809 Td (4430 }) 43.6851 Tj 0 -322.7743 Td (4431 }) 34.9481 Tj 0 -332.2676 Td (4432 release\(&file_table_lock\);) 144.161 Tj 0 -341.761 Td (4433 return 0;) 69.8962 Tj 0 -351.2543 Td (4434 }) 26.2111 Tj 0 -360.7477 Td (4435 ) 21.8426 Tj 0 -370.2411 Td (4436 // Increment ref count for file f.) 170.3721 Tj 0 -379.7344 Td (4437 struct file*) 74.2647 Tj 0 -389.2278 Td (4438 filedup\(struct file *f\)) 122.3184 Tj 0 -398.7211 Td (4439 {) 26.2111 Tj 0 -408.2145 Td (4440 acquire\(&file_table_lock\);) 144.161 Tj 0 -417.7079 Td (4441 if\(f->ref < 1 || f->type == FD_CLOSED\)) 196.5831 Tj 0 -427.2012 Td (4442 panic\("filedup"\);) 113.5814 Tj 0 -436.6946 Td (4443 f->ref++;) 69.8962 Tj 0 -446.1879 Td (4444 release\(&file_table_lock\);) 144.161 Tj 0 -455.6813 Td (4445 return f;) 69.8962 Tj 0 -465.1747 Td (4446 }) 26.2111 Tj 0 -474.668 Td (4447 ) 21.8426 Tj 0 -484.1614 Td (4448 ) 21.8426 Tj 0 -493.6547 Td (4449 ) 21.8426 Tj 0 -522.1348 Td (Sheet 44) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/file.c Page 2) 161.635 Tj 0 -28.4801 Td (4450 // Close file f. \(Decrement ref count, close when reache\ s 0.\)) 292.6905 Tj 0 -37.9735 Td (4451 void) 39.3166 Tj 0 -47.4668 Td (4452 fileclose\(struct file *f\)) 131.0554 Tj 0 -56.9602 Td (4453 {) 26.2111 Tj 0 -66.4535 Td (4454 struct file ff;) 96.1073 Tj 0 -75.9469 Td (4455 ) 21.8426 Tj 0 -85.4403 Td (4456 acquire\(&file_table_lock\);) 144.161 Tj 0 -94.9336 Td (4457 if\(f->ref < 1 || f->type == FD_CLOSED\)) 196.5831 Tj 0 -104.427 Td (4458 panic\("fileclose"\);) 122.3184 Tj 0 -113.9203 Td (4459 if\(--f->ref > 0\){) 104.8443 Tj 0 -123.4137 Td (4460 release\(&file_table_lock\);) 152.898 Tj 0 -132.9071 Td (4461 return;) 69.8962 Tj 0 -142.4004 Td (4462 }) 34.9481 Tj 0 -151.8938 Td (4463 ff = *f;) 65.5277 Tj 0 -161.3871 Td (4464 f->ref = 0;) 78.6333 Tj 0 -170.8805 Td (4465 f->type = FD_CLOSED;) 117.9499 Tj 0 -180.3739 Td (4466 release\(&file_table_lock\);) 144.161 Tj 0 -189.8672 Td (4467 ) 21.8426 Tj 0 -199.3606 Td (4468 if\(ff.type == FD_PIPE\)) 126.6869 Tj 0 -208.8539 Td (4469 pipeclose\(ff.pipe, ff.writable\);) 179.1091 Tj 0 -218.3473 Td (4470 else if\(ff.type == FD_INODE\)) 152.898 Tj 0 -227.8407 Td (4471 iput\(ff.ip\);) 91.7388 Tj 0 -237.334 Td (4472 else) 48.0537 Tj 0 -246.8274 Td (4473 panic\("fileclose"\);) 122.3184 Tj 0 -256.3207 Td (4474 }) 26.2111 Tj 0 -265.8141 Td (4475 ) 21.8426 Tj 0 -275.3075 Td (4476 // Get metadata about file f.) 148.5295 Tj 0 -284.8008 Td (4477 int) 34.9481 Tj 0 -294.2942 Td (4478 filestat\(struct file *f, struct stat *st\)) 200.9517 Tj 0 -303.7875 Td (4479 {) 26.2111 Tj 0 -313.2809 Td (4480 if\(f->type == FD_INODE\){) 135.4239 Tj 0 -322.7743 Td (4481 ilock\(f->ip\);) 96.1073 Tj 0 -332.2676 Td (4482 stati\(f->ip, st\);) 113.5814 Tj 0 -341.761 Td (4483 iunlock\(f->ip\);) 104.8443 Tj 0 -351.2543 Td (4484 return 0;) 78.6333 Tj 0 -360.7477 Td (4485 }) 34.9481 Tj 0 -370.2411 Td (4486 return -1;) 74.2647 Tj 0 -379.7344 Td (4487 }) 26.2111 Tj 0 -389.2278 Td (4488 ) 21.8426 Tj 0 -398.7211 Td (4489 ) 21.8426 Tj 0 -408.2145 Td (4490 ) 21.8426 Tj 0 -417.7079 Td (4491 ) 21.8426 Tj 0 -427.2012 Td (4492 ) 21.8426 Tj 0 -436.6946 Td (4493 ) 21.8426 Tj 0 -446.1879 Td (4494 ) 21.8426 Tj 0 -455.6813 Td (4495 ) 21.8426 Tj 0 -465.1747 Td (4496 ) 21.8426 Tj 0 -474.668 Td (4497 ) 21.8426 Tj 0 -484.1614 Td (4498 ) 21.8426 Tj 0 -493.6547 Td (4499 ) 21.8426 Tj 0 -522.1348 Td (Sheet 44) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 52 52 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/file.c Page 3) 161.635 Tj 0 -28.4801 Td (4500 // Read from file f. Addr is kernel address.) 218.4257 Tj 0 -37.9735 Td (4501 int) 34.9481 Tj 0 -47.4668 Td (4502 fileread\(struct file *f, char *addr, int n\)) 209.6887 Tj 0 -56.9602 Td (4503 {) 26.2111 Tj 0 -66.4535 Td (4504 int r;) 56.7907 Tj 0 -75.9469 Td (4505 ) 21.8426 Tj 0 -85.4403 Td (4506 if\(f->readable == 0\)) 117.9499 Tj 0 -94.9336 Td (4507 return -1;) 83.0018 Tj 0 -104.427 Td (4508 if\(f->type == FD_PIPE\)) 126.6869 Tj 0 -113.9203 Td (4509 return piperead\(f->pipe, addr, n\);) 187.8461 Tj 0 -123.4137 Td (4510 if\(f->type == FD_INODE\){) 135.4239 Tj 0 -132.9071 Td (4511 ilock\(f->ip\);) 96.1073 Tj 0 -142.4004 Td (4512 if\(\(r = readi\(f->ip, addr, f->off, n\)\) > 0\)) 227.1628 Tj 0 -151.8938 Td (4513 f->off += r;) 100.4758 Tj 0 -161.3871 Td (4514 iunlock\(f->ip\);) 104.8443 Tj 0 -170.8805 Td (4515 return r;) 78.6333 Tj 0 -180.3739 Td (4516 }) 34.9481 Tj 0 -189.8672 Td (4517 panic\("fileread"\);) 109.2129 Tj 0 -199.3606 Td (4518 }) 26.2111 Tj 0 -208.8539 Td (4519 ) 21.8426 Tj 0 -218.3473 Td (4520 // Write to file f. Addr is kernel address.) 214.0572 Tj 0 -227.8407 Td (4521 int) 34.9481 Tj 0 -237.334 Td (4522 filewrite\(struct file *f, char *addr, int n\)) 214.0572 Tj 0 -246.8274 Td (4523 {) 26.2111 Tj 0 -256.3207 Td (4524 int r;) 56.7907 Tj 0 -265.8141 Td (4525 ) 21.8426 Tj 0 -275.3075 Td (4526 if\(f->writable == 0\)) 117.9499 Tj 0 -284.8008 Td (4527 return -1;) 83.0018 Tj 0 -294.2942 Td (4528 if\(f->type == FD_PIPE\)) 126.6869 Tj 0 -303.7875 Td (4529 return pipewrite\(f->pipe, addr, n\);) 192.2146 Tj 0 -313.2809 Td (4530 if\(f->type == FD_INODE\){) 135.4239 Tj 0 -322.7743 Td (4531 ilock\(f->ip\);) 96.1073 Tj 0 -332.2676 Td (4532 if\(\(r = writei\(f->ip, addr, f->off, n\)\) > 0\)) 231.5313 Tj 0 -341.761 Td (4533 f->off += r;) 100.4758 Tj 0 -351.2543 Td (4534 iunlock\(f->ip\);) 104.8443 Tj 0 -360.7477 Td (4535 return r;) 78.6333 Tj 0 -370.2411 Td (4536 }) 34.9481 Tj 0 -379.7344 Td (4537 panic\("filewrite"\);) 113.5814 Tj 0 -389.2278 Td (4538 }) 26.2111 Tj 0 -398.7211 Td (4539 ) 21.8426 Tj 0 -408.2145 Td (4540 ) 21.8426 Tj 0 -417.7079 Td (4541 ) 21.8426 Tj 0 -427.2012 Td (4542 ) 21.8426 Tj 0 -436.6946 Td (4543 ) 21.8426 Tj 0 -446.1879 Td (4544 ) 21.8426 Tj 0 -455.6813 Td (4545 ) 21.8426 Tj 0 -465.1747 Td (4546 ) 21.8426 Tj 0 -474.668 Td (4547 ) 21.8426 Tj 0 -484.1614 Td (4548 ) 21.8426 Tj 0 -493.6547 Td (4549 ) 21.8426 Tj 0 -522.1348 Td (Sheet 45) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sysfile.c Page 1) 174.7406 Tj 0 -28.4801 Td (4550 #include "types.h") 100.4758 Tj 0 -37.9735 Td (4551 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (4552 #include "param.h") 100.4758 Tj 0 -56.9602 Td (4553 #include "stat.h") 96.1073 Tj 0 -66.4535 Td (4554 #include "mmu.h") 91.7388 Tj 0 -75.9469 Td (4555 #include "proc.h") 96.1073 Tj 0 -85.4403 Td (4556 #include "fs.h") 87.3703 Tj 0 -94.9336 Td (4557 #include "fsvar.h") 100.4758 Tj 0 -104.427 Td (4558 #include "file.h") 96.1073 Tj 0 -113.9203 Td (4559 #include "fcntl.h") 100.4758 Tj 0 -123.4137 Td (4560 ) 21.8426 Tj 0 -132.9071 Td (4561 // Fetch the nth word-sized system call argument as a file\ descriptor) 323.2701 Tj 0 -142.4004 Td (4562 // and return both the descriptor and the corresponding st\ ruct file.) 318.9016 Tj 0 -151.8938 Td (4563 static int) 65.5277 Tj 0 -161.3871 Td (4564 argfd\(int n, int *pfd, struct file **pf\)) 196.5831 Tj 0 -170.8805 Td (4565 {) 26.2111 Tj 0 -180.3739 Td (4566 int fd;) 61.1592 Tj 0 -189.8672 Td (4567 struct file *f;) 96.1073 Tj 0 -199.3606 Td (4568 ) 21.8426 Tj 0 -208.8539 Td (4569 if\(argint\(n, &fd\) < 0\)) 126.6869 Tj 0 -218.3473 Td (4570 return -1;) 83.0018 Tj 0 -227.8407 Td (4571 if\(fd < 0 || fd >= NOFILE || \(f=cp->ofile[fd]\) == 0\)) 257.7424 Tj 0 -237.334 Td (4572 return -1;) 83.0018 Tj 0 -246.8274 Td (4573 if\(pfd\)) 61.1592 Tj 0 -256.3207 Td (4574 *pfd = fd;) 83.0018 Tj 0 -265.8141 Td (4575 if\(pf\)) 56.7907 Tj 0 -275.3075 Td (4576 *pf = f;) 74.2647 Tj 0 -284.8008 Td (4577 return 0;) 69.8962 Tj 0 -294.2942 Td (4578 }) 26.2111 Tj 0 -303.7875 Td (4579 ) 21.8426 Tj 0 -313.2809 Td (4580 // Allocate a file descriptor for the given file.) 235.8998 Tj 0 -322.7743 Td (4581 // Takes over file reference from caller on success.) 249.0053 Tj 0 -332.2676 Td (4582 static int) 65.5277 Tj 0 -341.761 Td (4583 fdalloc\(struct file *f\)) 122.3184 Tj 0 -351.2543 Td (4584 {) 26.2111 Tj 0 -360.7477 Td (4585 int fd;) 61.1592 Tj 0 -370.2411 Td (4586 ) 21.8426 Tj 0 -379.7344 Td (4587 for\(fd = 0; fd < NOFILE; fd++\){) 166.0035 Tj 0 -389.2278 Td (4588 if\(cp->ofile[fd] == 0\){) 139.7925 Tj 0 -398.7211 Td (4589 cp->ofile[fd] = f;) 126.6869 Tj 0 -408.2145 Td (4590 return fd;) 91.7388 Tj 0 -417.7079 Td (4591 }) 43.6851 Tj 0 -427.2012 Td (4592 }) 34.9481 Tj 0 -436.6946 Td (4593 return -1;) 74.2647 Tj 0 -446.1879 Td (4594 }) 26.2111 Tj 0 -455.6813 Td (4595 ) 21.8426 Tj 0 -465.1747 Td (4596 ) 21.8426 Tj 0 -474.668 Td (4597 ) 21.8426 Tj 0 -484.1614 Td (4598 ) 21.8426 Tj 0 -493.6547 Td (4599 ) 21.8426 Tj 0 -522.1348 Td (Sheet 45) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 53 53 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sysfile.c Page 2) 174.7406 Tj 0 -28.4801 Td (4600 int) 34.9481 Tj 0 -37.9735 Td (4601 sys_read\(void\)) 83.0018 Tj 0 -47.4668 Td (4602 {) 26.2111 Tj 0 -56.9602 Td (4603 struct file *f;) 96.1073 Tj 0 -66.4535 Td (4604 int n;) 56.7907 Tj 0 -75.9469 Td (4605 char *p;) 65.5277 Tj 0 -85.4403 Td (4606 ) 21.8426 Tj 0 -94.9336 Td (4607 if\(argfd\(0, 0, &f\) < 0 || argint\(2, &n\) < 0 || argp\ tr\(1, &p, n\) < 0\)) 327.6386 Tj 0 -104.427 Td (4608 return -1;) 83.0018 Tj 0 -113.9203 Td (4609 return fileread\(f, p, n\);) 139.7925 Tj 0 -123.4137 Td (4610 }) 26.2111 Tj 0 -132.9071 Td (4611 ) 21.8426 Tj 0 -142.4004 Td (4612 int) 34.9481 Tj 0 -151.8938 Td (4613 sys_write\(void\)) 87.3703 Tj 0 -161.3871 Td (4614 {) 26.2111 Tj 0 -170.8805 Td (4615 struct file *f;) 96.1073 Tj 0 -180.3739 Td (4616 int n;) 56.7907 Tj 0 -189.8672 Td (4617 char *p;) 65.5277 Tj 0 -199.3606 Td (4618 ) 21.8426 Tj 0 -208.8539 Td (4619 if\(argfd\(0, 0, &f\) < 0 || argint\(2, &n\) < 0 || argp\ tr\(1, &p, n\) < 0\)) 327.6386 Tj 0 -218.3473 Td (4620 return -1;) 83.0018 Tj 0 -227.8407 Td (4621 return filewrite\(f, p, n\);) 144.161 Tj 0 -237.334 Td (4622 }) 26.2111 Tj 0 -246.8274 Td (4623 ) 21.8426 Tj 0 -256.3207 Td (4624 int) 34.9481 Tj 0 -265.8141 Td (4625 sys_dup\(void\)) 78.6333 Tj 0 -275.3075 Td (4626 {) 26.2111 Tj 0 -284.8008 Td (4627 struct file *f;) 96.1073 Tj 0 -294.2942 Td (4628 int fd;) 61.1592 Tj 0 -303.7875 Td (4629 ) 21.8426 Tj 0 -313.2809 Td (4630 if\(argfd\(0, 0, &f\) < 0\)) 131.0554 Tj 0 -322.7743 Td (4631 return -1;) 83.0018 Tj 0 -332.2676 Td (4632 if\(\(fd=fdalloc\(f\)\) < 0\)) 131.0554 Tj 0 -341.761 Td (4633 return -1;) 83.0018 Tj 0 -351.2543 Td (4634 filedup\(f\);) 78.6333 Tj 0 -360.7477 Td (4635 return fd;) 74.2647 Tj 0 -370.2411 Td (4636 }) 26.2111 Tj 0 -379.7344 Td (4637 ) 21.8426 Tj 0 -389.2278 Td (4638 int) 34.9481 Tj 0 -398.7211 Td (4639 sys_close\(void\)) 87.3703 Tj 0 -408.2145 Td (4640 {) 26.2111 Tj 0 -417.7079 Td (4641 int fd;) 61.1592 Tj 0 -427.2012 Td (4642 struct file *f;) 96.1073 Tj 0 -436.6946 Td (4643 ) 21.8426 Tj 0 -446.1879 Td (4644 if\(argfd\(0, &fd, &f\) < 0\)) 139.7925 Tj 0 -455.6813 Td (4645 return -1;) 83.0018 Tj 0 -465.1747 Td (4646 cp->ofile[fd] = 0;) 109.2129 Tj 0 -474.668 Td (4647 fileclose\(f\);) 87.3703 Tj 0 -484.1614 Td (4648 return 0;) 69.8962 Tj 0 -493.6547 Td (4649 }) 26.2111 Tj 0 -522.1348 Td (Sheet 46) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sysfile.c Page 3) 174.7406 Tj 0 -28.4801 Td (4650 int) 34.9481 Tj 0 -37.9735 Td (4651 sys_fstat\(void\)) 87.3703 Tj 0 -47.4668 Td (4652 {) 26.2111 Tj 0 -56.9602 Td (4653 struct file *f;) 96.1073 Tj 0 -66.4535 Td (4654 struct stat *st;) 100.4758 Tj 0 -75.9469 Td (4655 ) 21.8426 Tj 0 -85.4403 Td (4656 if\(argfd\(0, 0, &f\) < 0 || argptr\(1, \(void*\)&st, si\ zeof\(*st\)\) < 0\)) 314.533 Tj 0 -94.9336 Td (4657 return -1;) 83.0018 Tj 0 -104.427 Td (4658 return filestat\(f, st\);) 131.0554 Tj 0 -113.9203 Td (4659 }) 26.2111 Tj 0 -123.4137 Td (4660 ) 21.8426 Tj 0 -132.9071 Td (4661 // Create the path new as a link to the same inode as old.) 275.2164 Tj 0 -142.4004 Td (4662 int) 34.9481 Tj 0 -151.8938 Td (4663 sys_link\(void\)) 83.0018 Tj 0 -161.3871 Td (4664 {) 26.2111 Tj 0 -170.8805 Td (4665 char name[DIRSIZ], *new, *old;) 161.635 Tj 0 -180.3739 Td (4666 struct inode *dp, *ip;) 126.6869 Tj 0 -189.8672 Td (4667 ) 21.8426 Tj 0 -199.3606 Td (4668 if\(argstr\(0, &old\) < 0 || argstr\(1, &new\) < 0\)) 231.5313 Tj 0 -208.8539 Td (4669 return -1;) 83.0018 Tj 0 -218.3473 Td (4670 if\(\(ip = namei\(old\)\) == 0\)) 144.161 Tj 0 -227.8407 Td (4671 return -1;) 83.0018 Tj 0 -237.334 Td (4672 ilock\(ip\);) 74.2647 Tj 0 -246.8274 Td (4673 if\(ip->type == T_DIR\){) 126.6869 Tj 0 -256.3207 Td (4674 iunlockput\(ip\);) 104.8443 Tj 0 -265.8141 Td (4675 return -1;) 83.0018 Tj 0 -275.3075 Td (4676 }) 34.9481 Tj 0 -284.8008 Td (4677 ip->nlink++;) 83.0018 Tj 0 -294.2942 Td (4678 iupdate\(ip\);) 83.0018 Tj 0 -303.7875 Td (4679 iunlock\(ip\);) 83.0018 Tj 0 -313.2809 Td (4680 ) 21.8426 Tj 0 -322.7743 Td (4681 if\(\(dp = nameiparent\(new, name\)\) == 0\)) 196.5831 Tj 0 -332.2676 Td (4682 goto bad;) 83.0018 Tj 0 -341.761 Td (4683 ilock\(dp\);) 74.2647 Tj 0 -351.2543 Td (4684 if\(dp->dev != ip->dev || dirlink\(dp, name, ip->inum\) \ < 0\)) 279.5849 Tj 0 -360.7477 Td (4685 goto bad;) 78.6333 Tj 0 -370.2411 Td (4686 iunlockput\(dp\);) 96.1073 Tj 0 -379.7344 Td (4687 iput\(ip\);) 69.8962 Tj 0 -389.2278 Td (4688 return 0;) 69.8962 Tj 0 -398.7211 Td (4689 ) 21.8426 Tj 0 -408.2145 Td (4690 bad:) 39.3166 Tj 0 -417.7079 Td (4691 if\(dp\)) 56.7907 Tj 0 -427.2012 Td (4692 iunlockput\(dp\);) 104.8443 Tj 0 -436.6946 Td (4693 ilock\(ip\);) 74.2647 Tj 0 -446.1879 Td (4694 ip->nlink--;) 83.0018 Tj 0 -455.6813 Td (4695 iupdate\(ip\);) 83.0018 Tj 0 -465.1747 Td (4696 iunlockput\(ip\);) 96.1073 Tj 0 -474.668 Td (4697 return -1;) 74.2647 Tj 0 -484.1614 Td (4698 }) 26.2111 Tj 0 -493.6547 Td (4699 ) 21.8426 Tj 0 -522.1348 Td (Sheet 46) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 54 54 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sysfile.c Page 4) 174.7406 Tj 0 -28.4801 Td (4700 // Is the directory dp empty except for "." and ".." ?) 257.7424 Tj 0 -37.9735 Td (4701 static int) 65.5277 Tj 0 -47.4668 Td (4702 isdirempty\(struct inode *dp\)) 144.161 Tj 0 -56.9602 Td (4703 {) 26.2111 Tj 0 -66.4535 Td (4704 int off;) 65.5277 Tj 0 -75.9469 Td (4705 struct dirent de;) 104.8443 Tj 0 -85.4403 Td (4706 ) 21.8426 Tj 0 -94.9336 Td (4707 for\(off=2*sizeof\(de\); offsize; off+=sizeof\(de\)\ \){) 262.1109 Tj 0 -104.427 Td (4708 if\(readi\(dp, \(char*\)&de, off, sizeof\(de\)\) != si\ zeof\(de\)\)) 283.9534 Tj 0 -113.9203 Td (4709 panic\("isdirempty: readi"\);) 166.0035 Tj 0 -123.4137 Td (4710 if\(de.inum != 0\)) 109.2129 Tj 0 -132.9071 Td (4711 return 0;) 87.3703 Tj 0 -142.4004 Td (4712 }) 34.9481 Tj 0 -151.8938 Td (4713 return 1;) 69.8962 Tj 0 -161.3871 Td (4714 }) 26.2111 Tj 0 -170.8805 Td (4715 ) 21.8426 Tj 0 -180.3739 Td (4716 ) 21.8426 Tj 0 -189.8672 Td (4717 ) 21.8426 Tj 0 -199.3606 Td (4718 ) 21.8426 Tj 0 -208.8539 Td (4719 ) 21.8426 Tj 0 -218.3473 Td (4720 ) 21.8426 Tj 0 -227.8407 Td (4721 ) 21.8426 Tj 0 -237.334 Td (4722 ) 21.8426 Tj 0 -246.8274 Td (4723 ) 21.8426 Tj 0 -256.3207 Td (4724 ) 21.8426 Tj 0 -265.8141 Td (4725 ) 21.8426 Tj 0 -275.3075 Td (4726 ) 21.8426 Tj 0 -284.8008 Td (4727 ) 21.8426 Tj 0 -294.2942 Td (4728 ) 21.8426 Tj 0 -303.7875 Td (4729 ) 21.8426 Tj 0 -313.2809 Td (4730 ) 21.8426 Tj 0 -322.7743 Td (4731 ) 21.8426 Tj 0 -332.2676 Td (4732 ) 21.8426 Tj 0 -341.761 Td (4733 ) 21.8426 Tj 0 -351.2543 Td (4734 ) 21.8426 Tj 0 -360.7477 Td (4735 ) 21.8426 Tj 0 -370.2411 Td (4736 ) 21.8426 Tj 0 -379.7344 Td (4737 ) 21.8426 Tj 0 -389.2278 Td (4738 ) 21.8426 Tj 0 -398.7211 Td (4739 ) 21.8426 Tj 0 -408.2145 Td (4740 ) 21.8426 Tj 0 -417.7079 Td (4741 ) 21.8426 Tj 0 -427.2012 Td (4742 ) 21.8426 Tj 0 -436.6946 Td (4743 ) 21.8426 Tj 0 -446.1879 Td (4744 ) 21.8426 Tj 0 -455.6813 Td (4745 ) 21.8426 Tj 0 -465.1747 Td (4746 ) 21.8426 Tj 0 -474.668 Td (4747 ) 21.8426 Tj 0 -484.1614 Td (4748 ) 21.8426 Tj 0 -493.6547 Td (4749 ) 21.8426 Tj 0 -522.1348 Td (Sheet 47) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sysfile.c Page 5) 174.7406 Tj 0 -28.4801 Td (4750 int) 34.9481 Tj 0 -37.9735 Td (4751 sys_unlink\(void\)) 91.7388 Tj 0 -47.4668 Td (4752 {) 26.2111 Tj 0 -56.9602 Td (4753 struct inode *ip, *dp;) 126.6869 Tj 0 -66.4535 Td (4754 struct dirent de;) 104.8443 Tj 0 -75.9469 Td (4755 char name[DIRSIZ], *path;) 139.7925 Tj 0 -85.4403 Td (4756 uint off;) 69.8962 Tj 0 -94.9336 Td (4757 ) 21.8426 Tj 0 -104.427 Td (4758 if\(argstr\(0, &path\) < 0\)) 135.4239 Tj 0 -113.9203 Td (4759 return -1;) 83.0018 Tj 0 -123.4137 Td (4760 if\(\(dp = nameiparent\(path, name\)\) == 0\)) 200.9517 Tj 0 -132.9071 Td (4761 return -1;) 83.0018 Tj 0 -142.4004 Td (4762 ilock\(dp\);) 74.2647 Tj 0 -151.8938 Td (4763 ) 21.8426 Tj 0 -161.3871 Td (4764 // Cannot unlink "." or "..".) 157.2665 Tj 0 -170.8805 Td (4765 if\(namecmp\(name, "."\) == 0 || namecmp\(name, ".."\) =\ = 0\){) 275.2164 Tj 0 -180.3739 Td (4766 iunlockput\(dp\);) 104.8443 Tj 0 -189.8672 Td (4767 return -1;) 83.0018 Tj 0 -199.3606 Td (4768 }) 34.9481 Tj 0 -208.8539 Td (4769 ) 21.8426 Tj 0 -218.3473 Td (4770 if\(\(ip = dirlookup\(dp, name, &off\)\) == 0\){) 214.0572 Tj 0 -227.8407 Td (4771 iunlockput\(dp\);) 104.8443 Tj 0 -237.334 Td (4772 return -1;) 83.0018 Tj 0 -246.8274 Td (4773 }) 34.9481 Tj 0 -256.3207 Td (4774 ilock\(ip\);) 74.2647 Tj 0 -265.8141 Td (4775 ) 21.8426 Tj 0 -275.3075 Td (4776 if\(ip->nlink < 1\)) 104.8443 Tj 0 -284.8008 Td (4777 panic\("unlink: nlink < 1"\);) 157.2665 Tj 0 -294.2942 Td (4778 if\(ip->type == T_DIR && !isdirempty\(ip\)\){) 209.6887 Tj 0 -303.7875 Td (4779 iunlockput\(ip\);) 104.8443 Tj 0 -313.2809 Td (4780 iunlockput\(dp\);) 104.8443 Tj 0 -322.7743 Td (4781 return -1;) 83.0018 Tj 0 -332.2676 Td (4782 }) 34.9481 Tj 0 -341.761 Td (4783 ) 21.8426 Tj 0 -351.2543 Td (4784 memset\(&de, 0, sizeof\(de\)\);) 148.5295 Tj 0 -360.7477 Td (4785 if\(writei\(dp, \(char*\)&de, off, sizeof\(de\)\) != siz\ eof\(de\)\)) 279.5849 Tj 0 -370.2411 Td (4786 panic\("unlink: writei"\);) 144.161 Tj 0 -379.7344 Td (4787 iunlockput\(dp\);) 96.1073 Tj 0 -389.2278 Td (4788 ) 21.8426 Tj 0 -398.7211 Td (4789 ip->nlink--;) 83.0018 Tj 0 -408.2145 Td (4790 iupdate\(ip\);) 83.0018 Tj 0 -417.7079 Td (4791 iunlockput\(ip\);) 96.1073 Tj 0 -427.2012 Td (4792 return 0;) 69.8962 Tj 0 -436.6946 Td (4793 }) 26.2111 Tj 0 -446.1879 Td (4794 ) 21.8426 Tj 0 -455.6813 Td (4795 ) 21.8426 Tj 0 -465.1747 Td (4796 ) 21.8426 Tj 0 -474.668 Td (4797 ) 21.8426 Tj 0 -484.1614 Td (4798 ) 21.8426 Tj 0 -493.6547 Td (4799 ) 21.8426 Tj 0 -522.1348 Td (Sheet 47) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 55 55 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sysfile.c Page 6) 174.7406 Tj 0 -28.4801 Td (4800 static struct inode*) 109.2129 Tj 0 -37.9735 Td (4801 create\(char *path, int canexist, short type, short major,\ short minor\)) 327.6386 Tj 0 -47.4668 Td (4802 {) 26.2111 Tj 0 -56.9602 Td (4803 uint off;) 69.8962 Tj 0 -66.4535 Td (4804 struct inode *ip, *dp;) 126.6869 Tj 0 -75.9469 Td (4805 char name[DIRSIZ];) 109.2129 Tj 0 -85.4403 Td (4806 ) 21.8426 Tj 0 -94.9336 Td (4807 if\(\(dp = nameiparent\(path, name\)\) == 0\)) 200.9517 Tj 0 -104.427 Td (4808 return 0;) 78.6333 Tj 0 -113.9203 Td (4809 ilock\(dp\);) 74.2647 Tj 0 -123.4137 Td (4810 ) 21.8426 Tj 0 -132.9071 Td (4811 if\(canexist && \(ip = dirlookup\(dp, name, &off\)\) != \ 0\){) 266.4794 Tj 0 -142.4004 Td (4812 iunlockput\(dp\);) 104.8443 Tj 0 -151.8938 Td (4813 ilock\(ip\);) 83.0018 Tj 0 -161.3871 Td (4814 if\(ip->type != type || ip->major != major || ip->mino\ r != minor\){) 323.2701 Tj 0 -170.8805 Td (4815 iunlockput\(ip\);) 113.5814 Tj 0 -180.3739 Td (4816 return 0;) 87.3703 Tj 0 -189.8672 Td (4817 }) 43.6851 Tj 0 -199.3606 Td (4818 return ip;) 83.0018 Tj 0 -208.8539 Td (4819 }) 34.9481 Tj 0 -218.3473 Td (4820 ) 21.8426 Tj 0 -227.8407 Td (4821 if\(\(ip = ialloc\(dp->dev, type\)\) == 0\){) 196.5831 Tj 0 -237.334 Td (4822 iunlockput\(dp\);) 104.8443 Tj 0 -246.8274 Td (4823 return 0;) 78.6333 Tj 0 -256.3207 Td (4824 }) 34.9481 Tj 0 -265.8141 Td (4825 ilock\(ip\);) 74.2647 Tj 0 -275.3075 Td (4826 ip->major = major;) 109.2129 Tj 0 -284.8008 Td (4827 ip->minor = minor;) 109.2129 Tj 0 -294.2942 Td (4828 ip->nlink = 1;) 91.7388 Tj 0 -303.7875 Td (4829 iupdate\(ip\);) 83.0018 Tj 0 -313.2809 Td (4830 ) 21.8426 Tj 0 -322.7743 Td (4831 if\(dirlink\(dp, name, ip->inum\) < 0\){) 187.8461 Tj 0 -332.2676 Td (4832 ip->nlink = 0;) 100.4758 Tj 0 -341.761 Td (4833 iunlockput\(ip\);) 104.8443 Tj 0 -351.2543 Td (4834 iunlockput\(dp\);) 104.8443 Tj 0 -360.7477 Td (4835 return 0;) 78.6333 Tj 0 -370.2411 Td (4836 }) 34.9481 Tj 0 -379.7344 Td (4837 ) 21.8426 Tj 0 -389.2278 Td (4838 if\(type == T_DIR\){ // Create . and .. entries.) 235.8998 Tj 0 -398.7211 Td (4839 dp->nlink++; // for "..") 148.5295 Tj 0 -408.2145 Td (4840 iupdate\(dp\);) 91.7388 Tj 0 -417.7079 Td (4841 // No ip->nlink++ for ".": avoid cyclic ref count.) 257.7424 Tj 0 -427.2012 Td (4842 if\(dirlink\(ip, ".", ip->inum\) < 0 || dirlink\(ip, "\ ..", dp->inum\) < 0\)) 340.7441 Tj 0 -436.6946 Td (4843 panic\("create dots"\);) 139.7925 Tj 0 -446.1879 Td (4844 }) 34.9481 Tj 0 -455.6813 Td (4845 iunlockput\(dp\);) 96.1073 Tj 0 -465.1747 Td (4846 return ip;) 74.2647 Tj 0 -474.668 Td (4847 }) 26.2111 Tj 0 -484.1614 Td (4848 ) 21.8426 Tj 0 -493.6547 Td (4849 ) 21.8426 Tj 0 -522.1348 Td (Sheet 48) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sysfile.c Page 7) 174.7406 Tj 0 -28.4801 Td (4850 int) 34.9481 Tj 0 -37.9735 Td (4851 sys_open\(void\)) 83.0018 Tj 0 -47.4668 Td (4852 {) 26.2111 Tj 0 -56.9602 Td (4853 char *path;) 78.6333 Tj 0 -66.4535 Td (4854 int fd, omode;) 91.7388 Tj 0 -75.9469 Td (4855 struct file *f;) 96.1073 Tj 0 -85.4403 Td (4856 struct inode *ip;) 104.8443 Tj 0 -94.9336 Td (4857 ) 21.8426 Tj 0 -104.427 Td (4858 if\(argstr\(0, &path\) < 0 || argint\(1, &omode\) < 0\)) 244.6368 Tj 0 -113.9203 Td (4859 return -1;) 83.0018 Tj 0 -123.4137 Td (4860 ) 21.8426 Tj 0 -132.9071 Td (4861 if\(omode & O_CREATE\){) 122.3184 Tj 0 -142.4004 Td (4862 if\(\(ip = create\(path, 1, T_FILE, 0, 0\)\) == 0\)) 235.8998 Tj 0 -151.8938 Td (4863 return -1;) 91.7388 Tj 0 -161.3871 Td (4864 } else {) 65.5277 Tj 0 -170.8805 Td (4865 if\(\(ip = namei\(path\)\) == 0\)) 157.2665 Tj 0 -180.3739 Td (4866 return -1;) 91.7388 Tj 0 -189.8672 Td (4867 ilock\(ip\);) 83.0018 Tj 0 -199.3606 Td (4868 if\(ip->type == T_DIR && \(omode & \(O_RDWR|O_WRONLY\)\ \)\){) 270.8479 Tj 0 -208.8539 Td (4869 iunlockput\(ip\);) 113.5814 Tj 0 -218.3473 Td (4870 return -1;) 91.7388 Tj 0 -227.8407 Td (4871 }) 43.6851 Tj 0 -237.334 Td (4872 }) 34.9481 Tj 0 -246.8274 Td (4873 ) 21.8426 Tj 0 -256.3207 Td (4874 if\(\(f = filealloc\(\)\) == 0 || \(fd = fdalloc\(f\)\) \ < 0\){) 257.7424 Tj 0 -265.8141 Td (4875 if\(f\)) 61.1592 Tj 0 -275.3075 Td (4876 fileclose\(f\);) 104.8443 Tj 0 -284.8008 Td (4877 iunlockput\(ip\);) 104.8443 Tj 0 -294.2942 Td (4878 return -1;) 83.0018 Tj 0 -303.7875 Td (4879 }) 34.9481 Tj 0 -313.2809 Td (4880 iunlock\(ip\);) 83.0018 Tj 0 -322.7743 Td (4881 ) 21.8426 Tj 0 -332.2676 Td (4882 f->type = FD_INODE;) 113.5814 Tj 0 -341.761 Td (4883 f->ip = ip;) 78.6333 Tj 0 -351.2543 Td (4884 f->off = 0;) 78.6333 Tj 0 -360.7477 Td (4885 f->readable = !\(omode & O_WRONLY\);) 179.1091 Tj 0 -370.2411 Td (4886 f->writable = \(omode & O_WRONLY\) || \(omode & O_RDWR\)\ ;) 262.1109 Tj 0 -379.7344 Td (4887 ) 21.8426 Tj 0 -389.2278 Td (4888 return fd;) 74.2647 Tj 0 -398.7211 Td (4889 }) 26.2111 Tj 0 -408.2145 Td (4890 ) 21.8426 Tj 0 -417.7079 Td (4891 ) 21.8426 Tj 0 -427.2012 Td (4892 ) 21.8426 Tj 0 -436.6946 Td (4893 ) 21.8426 Tj 0 -446.1879 Td (4894 ) 21.8426 Tj 0 -455.6813 Td (4895 ) 21.8426 Tj 0 -465.1747 Td (4896 ) 21.8426 Tj 0 -474.668 Td (4897 ) 21.8426 Tj 0 -484.1614 Td (4898 ) 21.8426 Tj 0 -493.6547 Td (4899 ) 21.8426 Tj 0 -522.1348 Td (Sheet 48) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 56 56 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sysfile.c Page 8) 174.7406 Tj 0 -28.4801 Td (4900 int) 34.9481 Tj 0 -37.9735 Td (4901 sys_mknod\(void\)) 87.3703 Tj 0 -47.4668 Td (4902 {) 26.2111 Tj 0 -56.9602 Td (4903 struct inode *ip;) 104.8443 Tj 0 -66.4535 Td (4904 char *path;) 78.6333 Tj 0 -75.9469 Td (4905 int len;) 65.5277 Tj 0 -85.4403 Td (4906 int major, minor;) 104.8443 Tj 0 -94.9336 Td (4907 ) 21.8426 Tj 0 -104.427 Td (4908 if\(\(len=argstr\(0, &path\)\) < 0 ||) 170.3721 Tj 0 -113.9203 Td (4909 argint\(1, &major\) < 0 ||) 148.5295 Tj 0 -123.4137 Td (4910 argint\(2, &minor\) < 0 ||) 148.5295 Tj 0 -132.9071 Td (4911 \(ip = create\(path, 0, T_DEV, major, minor\)\) == 0\)) 257.7424 Tj 0 -142.4004 Td (4912 return -1;) 83.0018 Tj 0 -151.8938 Td (4913 iunlockput\(ip\);) 96.1073 Tj 0 -161.3871 Td (4914 return 0;) 69.8962 Tj 0 -170.8805 Td (4915 }) 26.2111 Tj 0 -180.3739 Td (4916 ) 21.8426 Tj 0 -189.8672 Td (4917 int) 34.9481 Tj 0 -199.3606 Td (4918 sys_mkdir\(void\)) 87.3703 Tj 0 -208.8539 Td (4919 {) 26.2111 Tj 0 -218.3473 Td (4920 char *path;) 78.6333 Tj 0 -227.8407 Td (4921 struct inode *ip;) 104.8443 Tj 0 -237.334 Td (4922 ) 21.8426 Tj 0 -246.8274 Td (4923 if\(argstr\(0, &path\) < 0 || \(ip = create\(path, 0, T_\ DIR, 0, 0\)\) == 0\)) 327.6386 Tj 0 -256.3207 Td (4924 return -1;) 83.0018 Tj 0 -265.8141 Td (4925 iunlockput\(ip\);) 96.1073 Tj 0 -275.3075 Td (4926 return 0;) 69.8962 Tj 0 -284.8008 Td (4927 }) 26.2111 Tj 0 -294.2942 Td (4928 ) 21.8426 Tj 0 -303.7875 Td (4929 int) 34.9481 Tj 0 -313.2809 Td (4930 sys_chdir\(void\)) 87.3703 Tj 0 -322.7743 Td (4931 {) 26.2111 Tj 0 -332.2676 Td (4932 char *path;) 78.6333 Tj 0 -341.761 Td (4933 struct inode *ip;) 104.8443 Tj 0 -351.2543 Td (4934 ) 21.8426 Tj 0 -360.7477 Td (4935 if\(argstr\(0, &path\) < 0 || \(ip = namei\(path\)\) == \ 0\)) 253.3738 Tj 0 -370.2411 Td (4936 return -1;) 83.0018 Tj 0 -379.7344 Td (4937 ilock\(ip\);) 74.2647 Tj 0 -389.2278 Td (4938 if\(ip->type != T_DIR\){) 126.6869 Tj 0 -398.7211 Td (4939 iunlockput\(ip\);) 104.8443 Tj 0 -408.2145 Td (4940 return -1;) 83.0018 Tj 0 -417.7079 Td (4941 }) 34.9481 Tj 0 -427.2012 Td (4942 iunlock\(ip\);) 83.0018 Tj 0 -436.6946 Td (4943 iput\(cp->cwd\);) 91.7388 Tj 0 -446.1879 Td (4944 cp->cwd = ip;) 87.3703 Tj 0 -455.6813 Td (4945 return 0;) 69.8962 Tj 0 -465.1747 Td (4946 }) 26.2111 Tj 0 -474.668 Td (4947 ) 21.8426 Tj 0 -484.1614 Td (4948 ) 21.8426 Tj 0 -493.6547 Td (4949 ) 21.8426 Tj 0 -522.1348 Td (Sheet 49) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sysfile.c Page 9) 174.7406 Tj 0 -28.4801 Td (4950 int) 34.9481 Tj 0 -37.9735 Td (4951 sys_exec\(void\)) 83.0018 Tj 0 -47.4668 Td (4952 {) 26.2111 Tj 0 -56.9602 Td (4953 char *path, *argv[20];) 126.6869 Tj 0 -66.4535 Td (4954 int i;) 56.7907 Tj 0 -75.9469 Td (4955 uint uargv, uarg;) 104.8443 Tj 0 -85.4403 Td (4956 ) 21.8426 Tj 0 -94.9336 Td (4957 if\(argstr\(0, &path\) < 0 || argint\(1, \(int*\)&uargv\)\ < 0\)) 270.8479 Tj 0 -104.427 Td (4958 return -1;) 83.0018 Tj 0 -113.9203 Td (4959 memset\(argv, 0, sizeof\(argv\)\);) 161.635 Tj 0 -123.4137 Td (4960 for\(i=0;; i++\){) 96.1073 Tj 0 -132.9071 Td (4961 if\(i >= NELEM\(argv\)\)) 126.6869 Tj 0 -142.4004 Td (4962 return -1;) 91.7388 Tj 0 -151.8938 Td (4963 if\(fetchint\(cp, uargv+4*i, \(int*\)&uarg\) < 0\)) 231.5313 Tj 0 -161.3871 Td (4964 return -1;) 91.7388 Tj 0 -170.8805 Td (4965 if\(uarg == 0\){) 100.4758 Tj 0 -180.3739 Td (4966 argv[i] = 0;) 100.4758 Tj 0 -189.8672 Td (4967 break;) 74.2647 Tj 0 -199.3606 Td (4968 }) 43.6851 Tj 0 -208.8539 Td (4969 if\(fetchstr\(cp, uarg, &argv[i]\) < 0\)) 196.5831 Tj 0 -218.3473 Td (4970 return -1;) 91.7388 Tj 0 -227.8407 Td (4971 }) 34.9481 Tj 0 -237.334 Td (4972 return exec\(path, argv\);) 135.4239 Tj 0 -246.8274 Td (4973 }) 26.2111 Tj 0 -256.3207 Td (4974 ) 21.8426 Tj 0 -265.8141 Td (4975 int) 34.9481 Tj 0 -275.3075 Td (4976 sys_pipe\(void\)) 83.0018 Tj 0 -284.8008 Td (4977 {) 26.2111 Tj 0 -294.2942 Td (4978 int *fd;) 65.5277 Tj 0 -303.7875 Td (4979 struct file *rf, *wf;) 122.3184 Tj 0 -313.2809 Td (4980 int fd0, fd1;) 87.3703 Tj 0 -322.7743 Td (4981 ) 21.8426 Tj 0 -332.2676 Td (4982 if\(argptr\(0, \(void*\)&fd, 2*sizeof\(fd[0]\)\) < 0\)) 231.5313 Tj 0 -341.761 Td (4983 return -1;) 83.0018 Tj 0 -351.2543 Td (4984 if\(pipealloc\(&rf, &wf\) < 0\)) 148.5295 Tj 0 -360.7477 Td (4985 return -1;) 83.0018 Tj 0 -370.2411 Td (4986 fd0 = -1;) 69.8962 Tj 0 -379.7344 Td (4987 if\(\(fd0 = fdalloc\(rf\)\) < 0 || \(fd1 = fdalloc\(wf\)\ \) < 0\){) 270.8479 Tj 0 -389.2278 Td (4988 if\(fd0 >= 0\)) 91.7388 Tj 0 -398.7211 Td (4989 cp->ofile[fd0] = 0;) 131.0554 Tj 0 -408.2145 Td (4990 fileclose\(rf\);) 100.4758 Tj 0 -417.7079 Td (4991 fileclose\(wf\);) 100.4758 Tj 0 -427.2012 Td (4992 return -1;) 83.0018 Tj 0 -436.6946 Td (4993 }) 34.9481 Tj 0 -446.1879 Td (4994 fd[0] = fd0;) 83.0018 Tj 0 -455.6813 Td (4995 fd[1] = fd1;) 83.0018 Tj 0 -465.1747 Td (4996 return 0;) 69.8962 Tj 0 -474.668 Td (4997 }) 26.2111 Tj 0 -484.1614 Td (4998 ) 21.8426 Tj 0 -493.6547 Td (4999 ) 21.8426 Tj 0 -522.1348 Td (Sheet 49) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 57 57 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/exec.c Page 1) 161.635 Tj 0 -28.4801 Td (5000 #include "types.h") 100.4758 Tj 0 -37.9735 Td (5001 #include "param.h") 100.4758 Tj 0 -47.4668 Td (5002 #include "mmu.h") 91.7388 Tj 0 -56.9602 Td (5003 #include "proc.h") 96.1073 Tj 0 -66.4535 Td (5004 #include "defs.h") 96.1073 Tj 0 -75.9469 Td (5005 #include "x86.h") 91.7388 Tj 0 -85.4403 Td (5006 #include "elf.h") 91.7388 Tj 0 -94.9336 Td (5007 ) 21.8426 Tj 0 -104.427 Td (5008 int) 34.9481 Tj 0 -113.9203 Td (5009 exec\(char *path, char **argv\)) 148.5295 Tj 0 -123.4137 Td (5010 {) 26.2111 Tj 0 -132.9071 Td (5011 char *mem, *s, *last;) 122.3184 Tj 0 -142.4004 Td (5012 int i, argc, arglen, len, off;) 161.635 Tj 0 -151.8938 Td (5013 uint sz, sp, argp;) 109.2129 Tj 0 -161.3871 Td (5014 struct elfhdr elf;) 109.2129 Tj 0 -170.8805 Td (5015 struct inode *ip;) 104.8443 Tj 0 -180.3739 Td (5016 struct proghdr ph;) 109.2129 Tj 0 -189.8672 Td (5017 ) 21.8426 Tj 0 -199.3606 Td (5018 if\(\(ip = namei\(path\)\) == 0\)) 148.5295 Tj 0 -208.8539 Td (5019 return -1;) 83.0018 Tj 0 -218.3473 Td (5020 ilock\(ip\);) 74.2647 Tj 0 -227.8407 Td (5021 ) 21.8426 Tj 0 -237.334 Td (5022 // Compute memory size of new process.) 196.5831 Tj 0 -246.8274 Td (5023 mem = 0;) 65.5277 Tj 0 -256.3207 Td (5024 sz = 0;) 61.1592 Tj 0 -265.8141 Td (5025 ) 21.8426 Tj 0 -275.3075 Td (5026 // Program segments.) 117.9499 Tj 0 -284.8008 Td (5027 if\(readi\(ip, \(char*\)&elf, 0, sizeof\(elf\)\) < sizeo\ f\(elf\)\)) 275.2164 Tj 0 -294.2942 Td (5028 goto bad;) 78.6333 Tj 0 -303.7875 Td (5029 if\(elf.magic != ELF_MAGIC\)) 144.161 Tj 0 -313.2809 Td (5030 goto bad;) 78.6333 Tj 0 -322.7743 Td (5031 for\(i=0, off=elf.phoff; i sz\)) 148.5295 Tj 0 -161.3871 Td (5064 goto bad;) 87.3703 Tj 0 -170.8805 Td (5065 if\(readi\(ip, mem + ph.va, ph.offset, ph.filesz\) != \ ph.filesz\)) 305.796 Tj 0 -180.3739 Td (5066 goto bad;) 87.3703 Tj 0 -189.8672 Td (5067 memset\(mem + ph.va + ph.filesz, 0, ph.memsz - ph.file\ sz\);) 288.322 Tj 0 -199.3606 Td (5068 }) 34.9481 Tj 0 -208.8539 Td (5069 iunlockput\(ip\);) 96.1073 Tj 0 -218.3473 Td (5070 ) 21.8426 Tj 0 -227.8407 Td (5071 // Initialize stack.) 117.9499 Tj 0 -237.334 Td (5072 sp = sz;) 65.5277 Tj 0 -246.8274 Td (5073 argp = sz - arglen - 4*\(argc+1\);) 170.3721 Tj 0 -256.3207 Td (5074 ) 21.8426 Tj 0 -265.8141 Td (5075 // Copy argv strings and pointers to stack.) 218.4257 Tj 0 -275.3075 Td (5076 *\(uint*\)\(mem+argp + 4*argc\) = 0; // argv[argc]) 235.8998 Tj 0 -284.8008 Td (5077 for\(i=argc-1; i>=0; i--\){) 139.7925 Tj 0 -294.2942 Td (5078 len = strlen\(argv[i]\) + 1;) 152.898 Tj 0 -303.7875 Td (5079 sp -= len;) 83.0018 Tj 0 -313.2809 Td (5080 memmove\(mem+sp, argv[i], len\);) 170.3721 Tj 0 -322.7743 Td (5081 *\(uint*\)\(mem+argp + 4*i\) = sp; // argv[i]) 222.7942 Tj 0 -332.2676 Td (5082 }) 34.9481 Tj 0 -341.761 Td (5083 ) 21.8426 Tj 0 -351.2543 Td (5084 // Stack frame for main\(argc, argv\), below arguments.) 262.1109 Tj 0 -360.7477 Td (5085 sp = argp;) 74.2647 Tj 0 -370.2411 Td (5086 sp -= 4;) 65.5277 Tj 0 -379.7344 Td (5087 *\(uint*\)\(mem+sp\) = argp;) 135.4239 Tj 0 -389.2278 Td (5088 sp -= 4;) 65.5277 Tj 0 -398.7211 Td (5089 *\(uint*\)\(mem+sp\) = argc;) 135.4239 Tj 0 -408.2145 Td (5090 sp -= 4;) 65.5277 Tj 0 -417.7079 Td (5091 *\(uint*\)\(mem+sp\) = 0xffffffff; // fake return pc) 249.0053 Tj 0 -427.2012 Td (5092 ) 21.8426 Tj 0 -436.6946 Td (5093 // Save program name for debugging.) 183.4776 Tj 0 -446.1879 Td (5094 for\(last=s=path; *s; s++\)) 139.7925 Tj 0 -455.6813 Td (5095 if\(*s == '/'\)) 96.1073 Tj 0 -465.1747 Td (5096 last = s+1;) 96.1073 Tj 0 -474.668 Td (5097 safestrcpy\(cp->name, last, sizeof\(cp->name\)\);) 227.1628 Tj 0 -484.1614 Td (5098 ) 21.8426 Tj 0 -493.6547 Td (5099 ) 21.8426 Tj 0 -522.1348 Td (Sheet 50) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 58 58 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/exec.c Page 3) 161.635 Tj 0 -28.4801 Td (5100 // Commit to the new image.) 148.5295 Tj 0 -37.9735 Td (5101 kfree\(cp->mem, cp->sz\);) 131.0554 Tj 0 -47.4668 Td (5102 cp->mem = mem;) 91.7388 Tj 0 -56.9602 Td (5103 cp->sz = sz;) 83.0018 Tj 0 -66.4535 Td (5104 cp->tf->eip = elf.entry; // main) 174.7406 Tj 0 -75.9469 Td (5105 cp->tf->esp = sp;) 104.8443 Tj 0 -85.4403 Td (5106 setupsegs\(cp\);) 91.7388 Tj 0 -94.9336 Td (5107 return 0;) 69.8962 Tj 0 -104.427 Td (5108 ) 21.8426 Tj 0 -113.9203 Td (5109 bad:) 43.6851 Tj 0 -123.4137 Td (5110 if\(mem\)) 61.1592 Tj 0 -132.9071 Td (5111 kfree\(mem, sz\);) 104.8443 Tj 0 -142.4004 Td (5112 iunlockput\(ip\);) 96.1073 Tj 0 -151.8938 Td (5113 return -1;) 74.2647 Tj 0 -161.3871 Td (5114 }) 26.2111 Tj 0 -170.8805 Td (5115 ) 21.8426 Tj 0 -180.3739 Td (5116 ) 21.8426 Tj 0 -189.8672 Td (5117 ) 21.8426 Tj 0 -199.3606 Td (5118 ) 21.8426 Tj 0 -208.8539 Td (5119 ) 21.8426 Tj 0 -218.3473 Td (5120 ) 21.8426 Tj 0 -227.8407 Td (5121 ) 21.8426 Tj 0 -237.334 Td (5122 ) 21.8426 Tj 0 -246.8274 Td (5123 ) 21.8426 Tj 0 -256.3207 Td (5124 ) 21.8426 Tj 0 -265.8141 Td (5125 ) 21.8426 Tj 0 -275.3075 Td (5126 ) 21.8426 Tj 0 -284.8008 Td (5127 ) 21.8426 Tj 0 -294.2942 Td (5128 ) 21.8426 Tj 0 -303.7875 Td (5129 ) 21.8426 Tj 0 -313.2809 Td (5130 ) 21.8426 Tj 0 -322.7743 Td (5131 ) 21.8426 Tj 0 -332.2676 Td (5132 ) 21.8426 Tj 0 -341.761 Td (5133 ) 21.8426 Tj 0 -351.2543 Td (5134 ) 21.8426 Tj 0 -360.7477 Td (5135 ) 21.8426 Tj 0 -370.2411 Td (5136 ) 21.8426 Tj 0 -379.7344 Td (5137 ) 21.8426 Tj 0 -389.2278 Td (5138 ) 21.8426 Tj 0 -398.7211 Td (5139 ) 21.8426 Tj 0 -408.2145 Td (5140 ) 21.8426 Tj 0 -417.7079 Td (5141 ) 21.8426 Tj 0 -427.2012 Td (5142 ) 21.8426 Tj 0 -436.6946 Td (5143 ) 21.8426 Tj 0 -446.1879 Td (5144 ) 21.8426 Tj 0 -455.6813 Td (5145 ) 21.8426 Tj 0 -465.1747 Td (5146 ) 21.8426 Tj 0 -474.668 Td (5147 ) 21.8426 Tj 0 -484.1614 Td (5148 ) 21.8426 Tj 0 -493.6547 Td (5149 ) 21.8426 Tj 0 -522.1348 Td (Sheet 51) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/pipe.c Page 1) 161.635 Tj 0 -28.4801 Td (5150 #include "types.h") 100.4758 Tj 0 -37.9735 Td (5151 #include "defs.h") 96.1073 Tj 0 -47.4668 Td (5152 #include "param.h") 100.4758 Tj 0 -56.9602 Td (5153 #include "mmu.h") 91.7388 Tj 0 -66.4535 Td (5154 #include "proc.h") 96.1073 Tj 0 -75.9469 Td (5155 #include "file.h") 96.1073 Tj 0 -85.4403 Td (5156 #include "spinlock.h") 113.5814 Tj 0 -94.9336 Td (5157 ) 21.8426 Tj 0 -104.427 Td (5158 #define PIPESIZE 512) 109.2129 Tj 0 -113.9203 Td (5159 ) 21.8426 Tj 0 -123.4137 Td (5160 struct pipe {) 78.6333 Tj 0 -132.9071 Td (5161 int readopen; // read fd is still open) 205.3202 Tj 0 -142.4004 Td (5162 int writeopen; // write fd is still open) 209.6887 Tj 0 -151.8938 Td (5163 uint writep; // next index to write) 196.5831 Tj 0 -161.3871 Td (5164 uint readp; // next index to read) 192.2146 Tj 0 -170.8805 Td (5165 struct spinlock lock;) 122.3184 Tj 0 -180.3739 Td (5166 char data[PIPESIZE];) 117.9499 Tj 0 -189.8672 Td (5167 };) 30.5796 Tj 0 -199.3606 Td (5168 ) 21.8426 Tj 0 -208.8539 Td (5169 int) 34.9481 Tj 0 -218.3473 Td (5170 pipealloc\(struct file **f0, struct file **f1\)) 218.4257 Tj 0 -227.8407 Td (5171 {) 26.2111 Tj 0 -237.334 Td (5172 struct pipe *p;) 96.1073 Tj 0 -246.8274 Td (5173 ) 21.8426 Tj 0 -256.3207 Td (5174 p = 0;) 56.7907 Tj 0 -265.8141 Td (5175 *f0 = *f1 = 0;) 91.7388 Tj 0 -275.3075 Td (5176 if\(\(*f0 = filealloc\(\)\) == 0 || \(*f1 = filealloc\(\)\ \) == 0\)) 275.2164 Tj 0 -284.8008 Td (5177 goto bad;) 78.6333 Tj 0 -294.2942 Td (5178 if\(\(p = \(struct pipe*\)kalloc\(PAGE\)\) == 0\)) 209.6887 Tj 0 -303.7875 Td (5179 goto bad;) 78.6333 Tj 0 -313.2809 Td (5180 p->readopen = 1;) 100.4758 Tj 0 -322.7743 Td (5181 p->writeopen = 1;) 104.8443 Tj 0 -332.2676 Td (5182 p->writep = 0;) 91.7388 Tj 0 -341.761 Td (5183 p->readp = 0;) 87.3703 Tj 0 -351.2543 Td (5184 initlock\(&p->lock, "pipe"\);) 148.5295 Tj 0 -360.7477 Td (5185 \(*f0\)->type = FD_PIPE;) 126.6869 Tj 0 -370.2411 Td (5186 \(*f0\)->readable = 1;) 117.9499 Tj 0 -379.7344 Td (5187 \(*f0\)->writable = 0;) 117.9499 Tj 0 -389.2278 Td (5188 \(*f0\)->pipe = p;) 100.4758 Tj 0 -398.7211 Td (5189 \(*f1\)->type = FD_PIPE;) 126.6869 Tj 0 -408.2145 Td (5190 \(*f1\)->readable = 0;) 117.9499 Tj 0 -417.7079 Td (5191 \(*f1\)->writable = 1;) 117.9499 Tj 0 -427.2012 Td (5192 \(*f1\)->pipe = p;) 100.4758 Tj 0 -436.6946 Td (5193 return 0;) 69.8962 Tj 0 -446.1879 Td (5194 ) 21.8426 Tj 0 -455.6813 Td (5195 ) 21.8426 Tj 0 -465.1747 Td (5196 ) 21.8426 Tj 0 -474.668 Td (5197 ) 21.8426 Tj 0 -484.1614 Td (5198 ) 21.8426 Tj 0 -493.6547 Td (5199 ) 21.8426 Tj 0 -522.1348 Td (Sheet 51) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 59 59 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/pipe.c Page 2) 161.635 Tj 0 -28.4801 Td (5200 bad:) 43.6851 Tj 0 -37.9735 Td (5201 if\(p\)) 52.4222 Tj 0 -47.4668 Td (5202 kfree\(\(char*\)p, PAGE\);) 135.4239 Tj 0 -56.9602 Td (5203 if\(*f0\){) 65.5277 Tj 0 -66.4535 Td (5204 \(*f0\)->type = FD_NONE;) 135.4239 Tj 0 -75.9469 Td (5205 fileclose\(*f0\);) 104.8443 Tj 0 -85.4403 Td (5206 }) 34.9481 Tj 0 -94.9336 Td (5207 if\(*f1\){) 65.5277 Tj 0 -104.427 Td (5208 \(*f1\)->type = FD_NONE;) 135.4239 Tj 0 -113.9203 Td (5209 fileclose\(*f1\);) 104.8443 Tj 0 -123.4137 Td (5210 }) 34.9481 Tj 0 -132.9071 Td (5211 return -1;) 74.2647 Tj 0 -142.4004 Td (5212 }) 26.2111 Tj 0 -151.8938 Td (5213 ) 21.8426 Tj 0 -161.3871 Td (5214 void) 39.3166 Tj 0 -170.8805 Td (5215 pipeclose\(struct pipe *p, int writable\)) 192.2146 Tj 0 -180.3739 Td (5216 {) 26.2111 Tj 0 -189.8672 Td (5217 acquire\(&p->lock\);) 109.2129 Tj 0 -199.3606 Td (5218 if\(writable\){) 87.3703 Tj 0 -208.8539 Td (5219 p->writeopen = 0;) 113.5814 Tj 0 -218.3473 Td (5220 wakeup\(&p->readp\);) 117.9499 Tj 0 -227.8407 Td (5221 } else {) 65.5277 Tj 0 -237.334 Td (5222 p->readopen = 0;) 109.2129 Tj 0 -246.8274 Td (5223 wakeup\(&p->writep\);) 122.3184 Tj 0 -256.3207 Td (5224 }) 34.9481 Tj 0 -265.8141 Td (5225 release\(&p->lock\);) 109.2129 Tj 0 -275.3075 Td (5226 ) 21.8426 Tj 0 -284.8008 Td (5227 if\(p->readopen == 0 && p->writeopen == 0\)) 209.6887 Tj 0 -294.2942 Td (5228 kfree\(\(char*\)p, PAGE\);) 135.4239 Tj 0 -303.7875 Td (5229 }) 26.2111 Tj 0 -313.2809 Td (5230 ) 21.8426 Tj 0 -322.7743 Td (5231 ) 21.8426 Tj 0 -332.2676 Td (5232 ) 21.8426 Tj 0 -341.761 Td (5233 ) 21.8426 Tj 0 -351.2543 Td (5234 ) 21.8426 Tj 0 -360.7477 Td (5235 ) 21.8426 Tj 0 -370.2411 Td (5236 ) 21.8426 Tj 0 -379.7344 Td (5237 ) 21.8426 Tj 0 -389.2278 Td (5238 ) 21.8426 Tj 0 -398.7211 Td (5239 ) 21.8426 Tj 0 -408.2145 Td (5240 ) 21.8426 Tj 0 -417.7079 Td (5241 ) 21.8426 Tj 0 -427.2012 Td (5242 ) 21.8426 Tj 0 -436.6946 Td (5243 ) 21.8426 Tj 0 -446.1879 Td (5244 ) 21.8426 Tj 0 -455.6813 Td (5245 ) 21.8426 Tj 0 -465.1747 Td (5246 ) 21.8426 Tj 0 -474.668 Td (5247 ) 21.8426 Tj 0 -484.1614 Td (5248 ) 21.8426 Tj 0 -493.6547 Td (5249 ) 21.8426 Tj 0 -522.1348 Td (Sheet 52) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/pipe.c Page 3) 161.635 Tj 0 -28.4801 Td (5250 int) 34.9481 Tj 0 -37.9735 Td (5251 pipewrite\(struct pipe *p, char *addr, int n\)) 214.0572 Tj 0 -47.4668 Td (5252 {) 26.2111 Tj 0 -56.9602 Td (5253 int i;) 56.7907 Tj 0 -66.4535 Td (5254 ) 21.8426 Tj 0 -75.9469 Td (5255 acquire\(&p->lock\);) 109.2129 Tj 0 -85.4403 Td (5256 for\(i = 0; i < n; i++\){) 131.0554 Tj 0 -94.9336 Td (5257 while\(p->writep == p->readp + PIPESIZE\) {) 218.4257 Tj 0 -104.427 Td (5258 if\(p->readopen == 0 || cp->killed\){) 200.9517 Tj 0 -113.9203 Td (5259 release\(&p->lock\);) 135.4239 Tj 0 -123.4137 Td (5260 return -1;) 100.4758 Tj 0 -132.9071 Td (5261 }) 52.4222 Tj 0 -142.4004 Td (5262 wakeup\(&p->readp\);) 126.6869 Tj 0 -151.8938 Td (5263 sleep\(&p->writep, &p->lock\);) 170.3721 Tj 0 -161.3871 Td (5264 }) 43.6851 Tj 0 -170.8805 Td (5265 p->data[p->writep++ % PIPESIZE] = addr[i];) 222.7942 Tj 0 -180.3739 Td (5266 }) 34.9481 Tj 0 -189.8672 Td (5267 wakeup\(&p->readp\);) 109.2129 Tj 0 -199.3606 Td (5268 release\(&p->lock\);) 109.2129 Tj 0 -208.8539 Td (5269 return i;) 69.8962 Tj 0 -218.3473 Td (5270 }) 26.2111 Tj 0 -227.8407 Td (5271 ) 21.8426 Tj 0 -237.334 Td (5272 int) 34.9481 Tj 0 -246.8274 Td (5273 piperead\(struct pipe *p, char *addr, int n\)) 209.6887 Tj 0 -256.3207 Td (5274 {) 26.2111 Tj 0 -265.8141 Td (5275 int i;) 56.7907 Tj 0 -275.3075 Td (5276 ) 21.8426 Tj 0 -284.8008 Td (5277 acquire\(&p->lock\);) 109.2129 Tj 0 -294.2942 Td (5278 while\(p->readp == p->writep && p->writeopen\){) 227.1628 Tj 0 -303.7875 Td (5279 if\(cp->killed\){) 104.8443 Tj 0 -313.2809 Td (5280 release\(&p->lock\);) 126.6869 Tj 0 -322.7743 Td (5281 return -1;) 91.7388 Tj 0 -332.2676 Td (5282 }) 43.6851 Tj 0 -341.761 Td (5283 sleep\(&p->readp, &p->lock\);) 157.2665 Tj 0 -351.2543 Td (5284 }) 34.9481 Tj 0 -360.7477 Td (5285 for\(i = 0; i < n; i++\){) 131.0554 Tj 0 -370.2411 Td (5286 if\(p->readp == p->writep\)) 148.5295 Tj 0 -379.7344 Td (5287 break;) 74.2647 Tj 0 -389.2278 Td (5288 addr[i] = p->data[p->readp++ % PIPESIZE];) 218.4257 Tj 0 -398.7211 Td (5289 }) 34.9481 Tj 0 -408.2145 Td (5290 wakeup\(&p->writep\);) 113.5814 Tj 0 -417.7079 Td (5291 release\(&p->lock\);) 109.2129 Tj 0 -427.2012 Td (5292 return i;) 69.8962 Tj 0 -436.6946 Td (5293 }) 26.2111 Tj 0 -446.1879 Td (5294 ) 21.8426 Tj 0 -455.6813 Td (5295 ) 21.8426 Tj 0 -465.1747 Td (5296 ) 21.8426 Tj 0 -474.668 Td (5297 ) 21.8426 Tj 0 -484.1614 Td (5298 ) 21.8426 Tj 0 -493.6547 Td (5299 ) 21.8426 Tj 0 -522.1348 Td (Sheet 52) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 60 60 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/string.c Page 1) 170.3721 Tj 0 -28.4801 Td (5300 #include "types.h") 100.4758 Tj 0 -37.9735 Td (5301 ) 21.8426 Tj 0 -47.4668 Td (5302 void*) 43.6851 Tj 0 -56.9602 Td (5303 memset\(void *dst, int c, uint n\)) 161.635 Tj 0 -66.4535 Td (5304 {) 26.2111 Tj 0 -75.9469 Td (5305 char *d;) 65.5277 Tj 0 -85.4403 Td (5306 ) 21.8426 Tj 0 -94.9336 Td (5307 d = \(char*\)dst;) 96.1073 Tj 0 -104.427 Td (5308 while\(n-- > 0\)) 91.7388 Tj 0 -113.9203 Td (5309 *d++ = c;) 78.6333 Tj 0 -123.4137 Td (5310 ) 21.8426 Tj 0 -132.9071 Td (5311 return dst;) 78.6333 Tj 0 -142.4004 Td (5312 }) 26.2111 Tj 0 -151.8938 Td (5313 ) 21.8426 Tj 0 -161.3871 Td (5314 int) 34.9481 Tj 0 -170.8805 Td (5315 memcmp\(const void *v1, const void *v2, uint n\)) 222.7942 Tj 0 -180.3739 Td (5316 {) 26.2111 Tj 0 -189.8672 Td (5317 const uchar *s1, *s2;) 122.3184 Tj 0 -199.3606 Td (5318 ) 21.8426 Tj 0 -208.8539 Td (5319 s1 = v1;) 65.5277 Tj 0 -218.3473 Td (5320 s2 = v2;) 65.5277 Tj 0 -227.8407 Td (5321 while\(n-- > 0\){) 96.1073 Tj 0 -237.334 Td (5322 if\(*s1 != *s2\)) 100.4758 Tj 0 -246.8274 Td (5323 return *s1 - *s2;) 122.3184 Tj 0 -256.3207 Td (5324 s1++, s2++;) 87.3703 Tj 0 -265.8141 Td (5325 }) 34.9481 Tj 0 -275.3075 Td (5326 ) 21.8426 Tj 0 -284.8008 Td (5327 return 0;) 69.8962 Tj 0 -294.2942 Td (5328 }) 26.2111 Tj 0 -303.7875 Td (5329 ) 21.8426 Tj 0 -313.2809 Td (5330 void*) 43.6851 Tj 0 -322.7743 Td (5331 memmove\(void *dst, const void *src, uint n\)) 209.6887 Tj 0 -332.2676 Td (5332 {) 26.2111 Tj 0 -341.761 Td (5333 const char *s;) 91.7388 Tj 0 -351.2543 Td (5334 char *d;) 65.5277 Tj 0 -360.7477 Td (5335 ) 21.8426 Tj 0 -370.2411 Td (5336 s = src;) 65.5277 Tj 0 -379.7344 Td (5337 d = dst;) 65.5277 Tj 0 -389.2278 Td (5338 if\(s < d && s + n > d\){) 131.0554 Tj 0 -398.7211 Td (5339 s += n;) 69.8962 Tj 0 -408.2145 Td (5340 d += n;) 69.8962 Tj 0 -417.7079 Td (5341 while\(n-- > 0\)) 100.4758 Tj 0 -427.2012 Td (5342 *--d = *--s;) 100.4758 Tj 0 -436.6946 Td (5343 } else) 56.7907 Tj 0 -446.1879 Td (5344 while\(n-- > 0\)) 100.4758 Tj 0 -455.6813 Td (5345 *d++ = *s++;) 100.4758 Tj 0 -465.1747 Td (5346 ) 21.8426 Tj 0 -474.668 Td (5347 return dst;) 78.6333 Tj 0 -484.1614 Td (5348 }) 26.2111 Tj 0 -493.6547 Td (5349 ) 21.8426 Tj 0 -522.1348 Td (Sheet 53) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/string.c Page 2) 170.3721 Tj 0 -28.4801 Td (5350 int) 34.9481 Tj 0 -37.9735 Td (5351 strncmp\(const char *p, const char *q, uint n\)) 218.4257 Tj 0 -47.4668 Td (5352 {) 26.2111 Tj 0 -56.9602 Td (5353 while\(n > 0 && *p && *p == *q\)) 161.635 Tj 0 -66.4535 Td (5354 n--, p++, q++;) 100.4758 Tj 0 -75.9469 Td (5355 if\(n == 0\)) 74.2647 Tj 0 -85.4403 Td (5356 return 0;) 78.6333 Tj 0 -94.9336 Td (5357 return \(uchar\)*p - \(uchar\)*q;) 157.2665 Tj 0 -104.427 Td (5358 }) 26.2111 Tj 0 -113.9203 Td (5359 ) 21.8426 Tj 0 -123.4137 Td (5360 char*) 43.6851 Tj 0 -132.9071 Td (5361 strncpy\(char *s, const char *t, int n\)) 187.8461 Tj 0 -142.4004 Td (5362 {) 26.2111 Tj 0 -151.8938 Td (5363 char *os;) 69.8962 Tj 0 -161.3871 Td (5364 ) 21.8426 Tj 0 -170.8805 Td (5365 os = s;) 61.1592 Tj 0 -180.3739 Td (5366 while\(n-- > 0 && \(*s++ = *t++\) != 0\)) 187.8461 Tj 0 -189.8672 Td (5367 ;) 43.6851 Tj 0 -199.3606 Td (5368 while\(n-- > 0\)) 91.7388 Tj 0 -208.8539 Td (5369 *s++ = 0;) 78.6333 Tj 0 -218.3473 Td (5370 return os;) 74.2647 Tj 0 -227.8407 Td (5371 }) 26.2111 Tj 0 -237.334 Td (5372 ) 21.8426 Tj 0 -246.8274 Td (5373 // Like strncpy but guaranteed to NUL-terminate.) 231.5313 Tj 0 -256.3207 Td (5374 char*) 43.6851 Tj 0 -265.8141 Td (5375 safestrcpy\(char *s, const char *t, int n\)) 200.9517 Tj 0 -275.3075 Td (5376 {) 26.2111 Tj 0 -284.8008 Td (5377 char *os;) 69.8962 Tj 0 -294.2942 Td (5378 ) 21.8426 Tj 0 -303.7875 Td (5379 os = s;) 61.1592 Tj 0 -313.2809 Td (5380 if\(n <= 0\)) 74.2647 Tj 0 -322.7743 Td (5381 return os;) 83.0018 Tj 0 -332.2676 Td (5382 while\(--n > 0 && \(*s++ = *t++\) != 0\)) 187.8461 Tj 0 -341.761 Td (5383 ;) 43.6851 Tj 0 -351.2543 Td (5384 *s = 0;) 61.1592 Tj 0 -360.7477 Td (5385 return os;) 74.2647 Tj 0 -370.2411 Td (5386 }) 26.2111 Tj 0 -379.7344 Td (5387 ) 21.8426 Tj 0 -389.2278 Td (5388 int) 34.9481 Tj 0 -398.7211 Td (5389 strlen\(const char *s\)) 113.5814 Tj 0 -408.2145 Td (5390 {) 26.2111 Tj 0 -417.7079 Td (5391 int n;) 56.7907 Tj 0 -427.2012 Td (5392 ) 21.8426 Tj 0 -436.6946 Td (5393 for\(n = 0; s[n]; n++\)) 122.3184 Tj 0 -446.1879 Td (5394 ;) 43.6851 Tj 0 -455.6813 Td (5395 return n;) 69.8962 Tj 0 -465.1747 Td (5396 }) 26.2111 Tj 0 -474.668 Td (5397 ) 21.8426 Tj 0 -484.1614 Td (5398 ) 21.8426 Tj 0 -493.6547 Td (5399 ) 21.8426 Tj 0 -522.1348 Td (Sheet 53) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 61 61 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/mp.h Page 1) 152.898 Tj 0 -28.4801 Td (5400 // See MultiProcessor Specification Version 1.[14]) 240.2683 Tj 0 -37.9735 Td (5401 ) 21.8426 Tj 0 -47.4668 Td (5402 struct mp { // floating pointer) 209.6887 Tj 0 -56.9602 Td (5403 uchar signature[4]; // "_MP_") 200.9517 Tj 0 -66.4535 Td (5404 void *physaddr; // phys addr of MP config \ table) 297.059 Tj 0 -75.9469 Td (5405 uchar length; // 1) 179.1091 Tj 0 -85.4403 Td (5406 uchar specrev; // [14]) 192.2146 Tj 0 -94.9336 Td (5407 uchar checksum; // all bytes must add up t\ o 0) 288.322 Tj 0 -104.427 Td (5408 uchar type; // MP system config type) 266.4794 Tj 0 -113.9203 Td (5409 uchar imcrp;) 83.0018 Tj 0 -123.4137 Td (5410 uchar reserved[3];) 109.2129 Tj 0 -132.9071 Td (5411 };) 30.5796 Tj 0 -142.4004 Td (5412 ) 21.8426 Tj 0 -151.8938 Td (5413 struct mpconf { // configuration table header) 253.3738 Tj 0 -161.3871 Td (5414 uchar signature[4]; // "PCMP") 200.9517 Tj 0 -170.8805 Td (5415 ushort length; // total table length) 253.3738 Tj 0 -180.3739 Td (5416 uchar version; // [14]) 192.2146 Tj 0 -189.8672 Td (5417 uchar checksum; // all bytes must add up t\ o 0) 288.322 Tj 0 -199.3606 Td (5418 uchar product[20]; // product id) 218.4257 Tj 0 -208.8539 Td (5419 uint *oemtable; // OEM table pointer) 249.0053 Tj 0 -218.3473 Td (5420 ushort oemlength; // OEM table length) 244.6368 Tj 0 -227.8407 Td (5421 ushort entry; // entry count) 222.7942 Tj 0 -237.334 Td (5422 uint *lapicaddr; // address of local APIC) 266.4794 Tj 0 -246.8274 Td (5423 ushort xlength; // extended table length) 266.4794 Tj 0 -256.3207 Td (5424 uchar xchecksum; // extended table checksum) 275.2164 Tj 0 -265.8141 Td (5425 uchar reserved;) 96.1073 Tj 0 -275.3075 Td (5426 };) 30.5796 Tj 0 -284.8008 Td (5427 ) 21.8426 Tj 0 -294.2942 Td (5428 struct mpproc { // processor table entry) 231.5313 Tj 0 -303.7875 Td (5429 uchar type; // entry type \(0\)) 235.8998 Tj 0 -313.2809 Td (5430 uchar apicid; // local APIC id) 231.5313 Tj 0 -322.7743 Td (5431 uchar version; // local APIC verison) 253.3738 Tj 0 -332.2676 Td (5432 uchar flags; // CPU flags) 214.0572 Tj 0 -341.761 Td (5433 #define MPBOOT 0x02 // This proc is the boot\ strap processor.) 345.1126 Tj 0 -351.2543 Td (5434 uchar signature[4]; // CPU signature) 231.5313 Tj 0 -360.7477 Td (5435 uint feature; // feature flags from CPUI\ D instruction) 332.0071 Tj 0 -370.2411 Td (5436 uchar reserved[8];) 109.2129 Tj 0 -379.7344 Td (5437 };) 30.5796 Tj 0 -389.2278 Td (5438 ) 21.8426 Tj 0 -398.7211 Td (5439 struct mpioapic { // I/O APIC table entry) 227.1628 Tj 0 -408.2145 Td (5440 uchar type; // entry type \(2\)) 235.8998 Tj 0 -417.7079 Td (5441 uchar apicno; // I/O APIC id) 222.7942 Tj 0 -427.2012 Td (5442 uchar version; // I/O APIC version) 244.6368 Tj 0 -436.6946 Td (5443 uchar flags; // I/O APIC flags) 235.8998 Tj 0 -446.1879 Td (5444 uint *addr; // I/O APIC address) 240.2683 Tj 0 -455.6813 Td (5445 };) 30.5796 Tj 0 -465.1747 Td (5446 ) 21.8426 Tj 0 -474.668 Td (5447 ) 21.8426 Tj 0 -484.1614 Td (5448 ) 21.8426 Tj 0 -493.6547 Td (5449 ) 21.8426 Tj 0 -522.1348 Td (Sheet 54) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/mp.h Page 2) 152.898 Tj 0 -28.4801 Td (5450 // Table entry types) 109.2129 Tj 0 -37.9735 Td (5451 #define MPPROC 0x00 // One per processor) 214.0572 Tj 0 -47.4668 Td (5452 #define MPBUS 0x01 // One per bus) 187.8461 Tj 0 -56.9602 Td (5453 #define MPIOAPIC 0x02 // One per I/O APIC) 209.6887 Tj 0 -66.4535 Td (5454 #define MPIOINTR 0x03 // One per bus interrupt source) 262.1109 Tj 0 -75.9469 Td (5455 #define MPLINTR 0x04 // One per system interrupt source) 275.2164 Tj 0 -85.4403 Td (5456 ) 21.8426 Tj 0 -94.9336 Td (5457 ) 21.8426 Tj 0 -104.427 Td (5458 ) 21.8426 Tj 0 -113.9203 Td (5459 ) 21.8426 Tj 0 -123.4137 Td (5460 ) 21.8426 Tj 0 -132.9071 Td (5461 ) 21.8426 Tj 0 -142.4004 Td (5462 ) 21.8426 Tj 0 -151.8938 Td (5463 ) 21.8426 Tj 0 -161.3871 Td (5464 ) 21.8426 Tj 0 -170.8805 Td (5465 ) 21.8426 Tj 0 -180.3739 Td (5466 ) 21.8426 Tj 0 -189.8672 Td (5467 ) 21.8426 Tj 0 -199.3606 Td (5468 ) 21.8426 Tj 0 -208.8539 Td (5469 ) 21.8426 Tj 0 -218.3473 Td (5470 ) 21.8426 Tj 0 -227.8407 Td (5471 ) 21.8426 Tj 0 -237.334 Td (5472 ) 21.8426 Tj 0 -246.8274 Td (5473 ) 21.8426 Tj 0 -256.3207 Td (5474 ) 21.8426 Tj 0 -265.8141 Td (5475 ) 21.8426 Tj 0 -275.3075 Td (5476 ) 21.8426 Tj 0 -284.8008 Td (5477 ) 21.8426 Tj 0 -294.2942 Td (5478 ) 21.8426 Tj 0 -303.7875 Td (5479 ) 21.8426 Tj 0 -313.2809 Td (5480 ) 21.8426 Tj 0 -322.7743 Td (5481 ) 21.8426 Tj 0 -332.2676 Td (5482 ) 21.8426 Tj 0 -341.761 Td (5483 ) 21.8426 Tj 0 -351.2543 Td (5484 ) 21.8426 Tj 0 -360.7477 Td (5485 ) 21.8426 Tj 0 -370.2411 Td (5486 ) 21.8426 Tj 0 -379.7344 Td (5487 ) 21.8426 Tj 0 -389.2278 Td (5488 ) 21.8426 Tj 0 -398.7211 Td (5489 ) 21.8426 Tj 0 -408.2145 Td (5490 ) 21.8426 Tj 0 -417.7079 Td (5491 ) 21.8426 Tj 0 -427.2012 Td (5492 ) 21.8426 Tj 0 -436.6946 Td (5493 ) 21.8426 Tj 0 -446.1879 Td (5494 ) 21.8426 Tj 0 -455.6813 Td (5495 ) 21.8426 Tj 0 -465.1747 Td (5496 ) 21.8426 Tj 0 -474.668 Td (5497 ) 21.8426 Tj 0 -484.1614 Td (5498 ) 21.8426 Tj 0 -493.6547 Td (5499 ) 21.8426 Tj 0 -522.1348 Td (Sheet 54) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 62 62 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/mp.c Page 1) 152.898 Tj 0 -28.4801 Td (5500 // Multiprocessor bootstrap.) 144.161 Tj 0 -37.9735 Td (5501 // Search memory for MP description structures.) 227.1628 Tj 0 -47.4668 Td (5502 // http://developer.intel.com/design/pentium/datashts/2420\ 1606.pdf) 310.1645 Tj 0 -56.9602 Td (5503 ) 21.8426 Tj 0 -66.4535 Td (5504 #include "types.h") 100.4758 Tj 0 -75.9469 Td (5505 #include "defs.h") 96.1073 Tj 0 -85.4403 Td (5506 #include "param.h") 100.4758 Tj 0 -94.9336 Td (5507 #include "mp.h") 87.3703 Tj 0 -104.427 Td (5508 #include "x86.h") 91.7388 Tj 0 -113.9203 Td (5509 #include "mmu.h") 91.7388 Tj 0 -123.4137 Td (5510 #include "proc.h") 96.1073 Tj 0 -132.9071 Td (5511 ) 21.8426 Tj 0 -142.4004 Td (5512 struct cpu cpus[NCPU];) 117.9499 Tj 0 -151.8938 Td (5513 static struct cpu *bcpu;) 126.6869 Tj 0 -161.3871 Td (5514 int ismp;) 61.1592 Tj 0 -170.8805 Td (5515 int ncpu;) 61.1592 Tj 0 -180.3739 Td (5516 uchar ioapic_id;) 91.7388 Tj 0 -189.8672 Td (5517 ) 21.8426 Tj 0 -199.3606 Td (5518 int) 34.9481 Tj 0 -208.8539 Td (5519 mp_bcpu\(void\)) 78.6333 Tj 0 -218.3473 Td (5520 {) 26.2111 Tj 0 -227.8407 Td (5521 return bcpu-cpus;) 104.8443 Tj 0 -237.334 Td (5522 }) 26.2111 Tj 0 -246.8274 Td (5523 ) 21.8426 Tj 0 -256.3207 Td (5524 static uchar) 74.2647 Tj 0 -265.8141 Td (5525 sum\(uchar *addr, int len\)) 131.0554 Tj 0 -275.3075 Td (5526 {) 26.2111 Tj 0 -284.8008 Td (5527 int i, sum;) 78.6333 Tj 0 -294.2942 Td (5528 ) 21.8426 Tj 0 -303.7875 Td (5529 sum = 0;) 65.5277 Tj 0 -313.2809 Td (5530 for\(i=0; iphysaddr == 0\)) 240.2683 Tj 0 -370.2411 Td (5586 return 0;) 78.6333 Tj 0 -379.7344 Td (5587 conf = \(struct mpconf*\)mp->physaddr;) 187.8461 Tj 0 -389.2278 Td (5588 if\(memcmp\(conf, "PCMP", 4\) != 0\)) 170.3721 Tj 0 -398.7211 Td (5589 return 0;) 78.6333 Tj 0 -408.2145 Td (5590 if\(conf->version != 1 && conf->version != 4\)) 222.7942 Tj 0 -417.7079 Td (5591 return 0;) 78.6333 Tj 0 -427.2012 Td (5592 if\(sum\(\(uchar*\)conf, conf->length\) != 0\)) 205.3202 Tj 0 -436.6946 Td (5593 return 0;) 78.6333 Tj 0 -446.1879 Td (5594 *pmp = mp;) 74.2647 Tj 0 -455.6813 Td (5595 return conf;) 83.0018 Tj 0 -465.1747 Td (5596 }) 26.2111 Tj 0 -474.668 Td (5597 ) 21.8426 Tj 0 -484.1614 Td (5598 ) 21.8426 Tj 0 -493.6547 Td (5599 ) 21.8426 Tj 0 -522.1348 Td (Sheet 55) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 63 63 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/mp.c Page 3) 152.898 Tj 0 -28.4801 Td (5600 void) 39.3166 Tj 0 -37.9735 Td (5601 mp_init\(void\)) 78.6333 Tj 0 -47.4668 Td (5602 {) 26.2111 Tj 0 -56.9602 Td (5603 uchar *p, *e;) 87.3703 Tj 0 -66.4535 Td (5604 struct mp *mp;) 91.7388 Tj 0 -75.9469 Td (5605 struct mpconf *conf;) 117.9499 Tj 0 -85.4403 Td (5606 struct mpproc *proc;) 117.9499 Tj 0 -94.9336 Td (5607 struct mpioapic *ioapic;) 135.4239 Tj 0 -104.427 Td (5608 ) 21.8426 Tj 0 -113.9203 Td (5609 bcpu = &cpus[ncpu];) 113.5814 Tj 0 -123.4137 Td (5610 if\(\(conf = mp_config\(&mp\)\) == 0\)) 170.3721 Tj 0 -132.9071 Td (5611 return;) 69.8962 Tj 0 -142.4004 Td (5612 ) 21.8426 Tj 0 -151.8938 Td (5613 ismp = 1;) 69.8962 Tj 0 -161.3871 Td (5614 lapic = \(uint*\)conf->lapicaddr;) 166.0035 Tj 0 -170.8805 Td (5615 ) 21.8426 Tj 0 -180.3739 Td (5616 for\(p=\(uchar*\)\(conf+1\), e=\(uchar*\)conf+conf->leng\ th; papicid;) 192.2146 Tj 0 -227.8407 Td (5621 if\(proc->flags & MPBOOT\)) 152.898 Tj 0 -237.334 Td (5622 bcpu = &cpus[ncpu];) 139.7925 Tj 0 -246.8274 Td (5623 ncpu++;) 78.6333 Tj 0 -256.3207 Td (5624 p += sizeof\(struct mpproc\);) 166.0035 Tj 0 -265.8141 Td (5625 continue;) 87.3703 Tj 0 -275.3075 Td (5626 case MPIOAPIC:) 100.4758 Tj 0 -284.8008 Td (5627 ioapic = \(struct mpioapic*\)p;) 174.7406 Tj 0 -294.2942 Td (5628 ioapic_id = ioapic->apicno;) 166.0035 Tj 0 -303.7875 Td (5629 p += sizeof\(struct mpioapic\);) 174.7406 Tj 0 -313.2809 Td (5630 continue;) 87.3703 Tj 0 -322.7743 Td (5631 case MPBUS:) 87.3703 Tj 0 -332.2676 Td (5632 case MPIOINTR:) 100.4758 Tj 0 -341.761 Td (5633 case MPLINTR:) 96.1073 Tj 0 -351.2543 Td (5634 p += 8;) 78.6333 Tj 0 -360.7477 Td (5635 continue;) 87.3703 Tj 0 -370.2411 Td (5636 default:) 74.2647 Tj 0 -379.7344 Td (5637 cprintf\("mp_init: unknown config type %x\\n", *p\);) 262.1109 Tj 0 -389.2278 Td (5638 panic\("mp_init"\);) 122.3184 Tj 0 -398.7211 Td (5639 }) 43.6851 Tj 0 -408.2145 Td (5640 }) 34.9481 Tj 0 -417.7079 Td (5641 ) 21.8426 Tj 0 -427.2012 Td (5642 if\(mp->imcrp\){) 91.7388 Tj 0 -436.6946 Td (5643 // Bochs doesn't support IMCR, so this doesn't run on \ Bochs.) 301.4275 Tj 0 -446.1879 Td (5644 // But it would on real hardware.) 183.4776 Tj 0 -455.6813 Td (5645 outb\(0x22, 0x70\); // Select IMCR) 187.8461 Tj 0 -465.1747 Td (5646 outb\(0x23, inb\(0x23\) | 1\); // Mask external inter\ rupts.) 283.9534 Tj 0 -474.668 Td (5647 }) 34.9481 Tj 0 -484.1614 Td (5648 }) 26.2111 Tj 0 -493.6547 Td (5649 ) 21.8426 Tj 0 -522.1348 Td (Sheet 56) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/lapic.c Page 1) 166.0035 Tj 0 -28.4801 Td (5650 // The local APIC manages internal \(non-I/O\) interrupts.) 266.4794 Tj 0 -37.9735 Td (5651 // See Chapter 8 & Appendix C of Intel processor manual vo\ lume 3.) 305.796 Tj 0 -47.4668 Td (5652 ) 21.8426 Tj 0 -56.9602 Td (5653 #include "types.h") 100.4758 Tj 0 -66.4535 Td (5654 #include "defs.h") 96.1073 Tj 0 -75.9469 Td (5655 #include "traps.h") 100.4758 Tj 0 -85.4403 Td (5656 #include "mmu.h") 91.7388 Tj 0 -94.9336 Td (5657 #include "x86.h") 91.7388 Tj 0 -104.427 Td (5658 ) 21.8426 Tj 0 -113.9203 Td (5659 // Local APIC registers, divided by 4 for use as uint[] in\ dices.) 301.4275 Tj 0 -123.4137 Td (5660 #define ID \(0x0020/4\) // ID) 170.3721 Tj 0 -132.9071 Td (5661 #define VER \(0x0030/4\) // Version) 192.2146 Tj 0 -142.4004 Td (5662 #define TPR \(0x0080/4\) // Task Priority) 218.4257 Tj 0 -151.8938 Td (5663 #define EOI \(0x00B0/4\) // EOI) 174.7406 Tj 0 -161.3871 Td (5664 #define SVR \(0x00F0/4\) // Spurious Interrupt Vecto\ r) 270.8479 Tj 0 -170.8805 Td (5665 #define ENABLE 0x00000100 // Unit Enable) 231.5313 Tj 0 -180.3739 Td (5666 #define ESR \(0x0280/4\) // Error Status) 214.0572 Tj 0 -189.8672 Td (5667 #define ICRLO \(0x0300/4\) // Interrupt Command) 235.8998 Tj 0 -199.3606 Td (5668 #define INIT 0x00000500 // INIT/RESET) 227.1628 Tj 0 -208.8539 Td (5669 #define STARTUP 0x00000600 // Startup IPI) 231.5313 Tj 0 -218.3473 Td (5670 #define DELIVS 0x00001000 // Delivery status) 249.0053 Tj 0 -227.8407 Td (5671 #define ASSERT 0x00004000 // Assert interrupt \(vs\ deassert\)) 314.533 Tj 0 -237.334 Td (5672 #define LEVEL 0x00008000 // Level triggered) 249.0053 Tj 0 -246.8274 Td (5673 #define BCAST 0x00080000 // Send to all APICs, in\ cluding self.) 332.0071 Tj 0 -256.3207 Td (5674 #define ICRHI \(0x0310/4\) // Interrupt Command [63:32\ ]) 270.8479 Tj 0 -265.8141 Td (5675 #define TIMER \(0x0320/4\) // Local Vector Table 0 \(T\ IMER\)) 283.9534 Tj 0 -275.3075 Td (5676 #define X1 0x0000000B // divide counts by 1) 262.1109 Tj 0 -284.8008 Td (5677 #define PERIODIC 0x00020000 // Periodic) 218.4257 Tj 0 -294.2942 Td (5678 #define PCINT \(0x0340/4\) // Performance Counter LVT) 262.1109 Tj 0 -303.7875 Td (5679 #define LINT0 \(0x0350/4\) // Local Vector Table 1 \(L\ INT0\)) 283.9534 Tj 0 -313.2809 Td (5680 #define LINT1 \(0x0360/4\) // Local Vector Table 2 \(L\ INT1\)) 283.9534 Tj 0 -322.7743 Td (5681 #define ERROR \(0x0370/4\) // Local Vector Table 3 \(E\ RROR\)) 283.9534 Tj 0 -332.2676 Td (5682 #define MASKED 0x00010000 // Interrupt masked) 253.3738 Tj 0 -341.761 Td (5683 #define TICR \(0x0380/4\) // Timer Initial Count) 244.6368 Tj 0 -351.2543 Td (5684 #define TCCR \(0x0390/4\) // Timer Current Count) 244.6368 Tj 0 -360.7477 Td (5685 #define TDCR \(0x03E0/4\) // Timer Divide Configurati\ on) 275.2164 Tj 0 -370.2411 Td (5686 ) 21.8426 Tj 0 -379.7344 Td (5687 volatile uint *lapic; // Initialized in mp.c) 218.4257 Tj 0 -389.2278 Td (5688 ) 21.8426 Tj 0 -398.7211 Td (5689 static void) 69.8962 Tj 0 -408.2145 Td (5690 lapicw\(int index, int value\)) 144.161 Tj 0 -417.7079 Td (5691 {) 26.2111 Tj 0 -427.2012 Td (5692 lapic[index] = value;) 122.3184 Tj 0 -436.6946 Td (5693 lapic[ID]; // wait for write to finish, by reading) 253.3738 Tj 0 -446.1879 Td (5694 }) 26.2111 Tj 0 -455.6813 Td (5695 ) 21.8426 Tj 0 -465.1747 Td (5696 ) 21.8426 Tj 0 -474.668 Td (5697 ) 21.8426 Tj 0 -484.1614 Td (5698 ) 21.8426 Tj 0 -493.6547 Td (5699 ) 21.8426 Tj 0 -522.1348 Td (Sheet 56) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 64 64 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/lapic.c Page 2) 166.0035 Tj 0 -28.4801 Td (5700 void) 39.3166 Tj 0 -37.9735 Td (5701 lapic_init\(int c\)) 96.1073 Tj 0 -47.4668 Td (5702 {) 26.2111 Tj 0 -56.9602 Td (5703 if\(!lapic\)) 74.2647 Tj 0 -66.4535 Td (5704 return;) 69.8962 Tj 0 -75.9469 Td (5705 ) 21.8426 Tj 0 -85.4403 Td (5706 // Enable local APIC; set spurious interrupt vector.) 257.7424 Tj 0 -94.9336 Td (5707 lapicw\(SVR, ENABLE | \(IRQ_OFFSET+IRQ_SPURIOUS\)\);) 240.2683 Tj 0 -104.427 Td (5708 ) 21.8426 Tj 0 -113.9203 Td (5709 // The timer repeatedly counts down at bus frequency) 257.7424 Tj 0 -123.4137 Td (5710 // from lapic[TICR] and then issues an interrupt.) 244.6368 Tj 0 -132.9071 Td (5711 // If xv6 cared more about precise timekeeping,) 235.8998 Tj 0 -142.4004 Td (5712 // TICR would be calibrated using an external time sourc\ e.) 283.9534 Tj 0 -151.8938 Td (5713 lapicw\(TDCR, X1\);) 104.8443 Tj 0 -161.3871 Td (5714 lapicw\(TIMER, PERIODIC | \(IRQ_OFFSET + IRQ_TIMER\)\);) 253.3738 Tj 0 -170.8805 Td (5715 lapicw\(TICR, 10000000\);) 131.0554 Tj 0 -180.3739 Td (5716 ) 21.8426 Tj 0 -189.8672 Td (5717 // Disable logical interrupt lines.) 183.4776 Tj 0 -199.3606 Td (5718 lapicw\(LINT0, MASKED\);) 126.6869 Tj 0 -208.8539 Td (5719 lapicw\(LINT1, MASKED\);) 126.6869 Tj 0 -218.3473 Td (5720 ) 21.8426 Tj 0 -227.8407 Td (5721 // Disable performance counter overflow interrupts) 249.0053 Tj 0 -237.334 Td (5722 // on machines that provide that interrupt entry.) 244.6368 Tj 0 -246.8274 Td (5723 if\(\(\(lapic[VER]>>16\) & 0xFF\) >= 4\)) 179.1091 Tj 0 -256.3207 Td (5724 lapicw\(PCINT, MASKED\);) 135.4239 Tj 0 -265.8141 Td (5725 ) 21.8426 Tj 0 -275.3075 Td (5726 // Map error interrupt to IRQ_ERROR.) 187.8461 Tj 0 -284.8008 Td (5727 lapicw\(ERROR, IRQ_OFFSET+IRQ_ERROR\);) 187.8461 Tj 0 -294.2942 Td (5728 ) 21.8426 Tj 0 -303.7875 Td (5729 // Clear error status register \(requires back-to-back w\ rites\).) 301.4275 Tj 0 -313.2809 Td (5730 lapicw\(ESR, 0\);) 96.1073 Tj 0 -322.7743 Td (5731 lapicw\(ESR, 0\);) 96.1073 Tj 0 -332.2676 Td (5732 ) 21.8426 Tj 0 -341.761 Td (5733 // Ack any outstanding interrupts.) 179.1091 Tj 0 -351.2543 Td (5734 lapicw\(EOI, 0\);) 96.1073 Tj 0 -360.7477 Td (5735 ) 21.8426 Tj 0 -370.2411 Td (5736 // Send an Init Level De-Assert to synchronise arbitrati\ on ID's.) 310.1645 Tj 0 -379.7344 Td (5737 lapicw\(ICRHI, 0\);) 104.8443 Tj 0 -389.2278 Td (5738 lapicw\(ICRLO, BCAST | INIT | LEVEL\);) 187.8461 Tj 0 -398.7211 Td (5739 while\(lapic[ICRLO] & DELIVS\)) 152.898 Tj 0 -408.2145 Td (5740 ;) 43.6851 Tj 0 -417.7079 Td (5741 ) 21.8426 Tj 0 -427.2012 Td (5742 // Enable interrupts on the APIC \(but not on the proces\ sor\).) 292.6905 Tj 0 -436.6946 Td (5743 lapicw\(TPR, 0\);) 96.1073 Tj 0 -446.1879 Td (5744 }) 26.2111 Tj 0 -455.6813 Td (5745 ) 21.8426 Tj 0 -465.1747 Td (5746 ) 21.8426 Tj 0 -474.668 Td (5747 ) 21.8426 Tj 0 -484.1614 Td (5748 ) 21.8426 Tj 0 -493.6547 Td (5749 ) 21.8426 Tj 0 -522.1348 Td (Sheet 57) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/lapic.c Page 3) 166.0035 Tj 0 -28.4801 Td (5750 int) 34.9481 Tj 0 -37.9735 Td (5751 cpu\(void\)) 61.1592 Tj 0 -47.4668 Td (5752 {) 26.2111 Tj 0 -56.9602 Td (5753 // Cannot call cpu when interrupts are enabled:) 235.8998 Tj 0 -66.4535 Td (5754 // result not guaranteed to last long enough to be used!) 275.2164 Tj 0 -75.9469 Td (5755 // Would prefer to panic but even printing is chancy her\ e:) 283.9534 Tj 0 -85.4403 Td (5756 // everything, including cprintf, calls cpu, at least in\ directly) 310.1645 Tj 0 -94.9336 Td (5757 // through acquire and release.) 166.0035 Tj 0 -104.427 Td (5758 if\(read_eflags\(\)&FL_IF\){) 135.4239 Tj 0 -113.9203 Td (5759 static int n;) 96.1073 Tj 0 -123.4137 Td (5760 if\(n++ == 0\)) 91.7388 Tj 0 -132.9071 Td (5761 cprintf\("cpu called from %x with interrupts enabled\ \\n",) 288.322 Tj 0 -142.4004 Td (5762 \(\(uint*\)read_ebp\(\)\)[1]\);) 161.635 Tj 0 -151.8938 Td (5763 }) 34.9481 Tj 0 -161.3871 Td (5764 ) 21.8426 Tj 0 -170.8805 Td (5765 if\(lapic\)) 69.8962 Tj 0 -180.3739 Td (5766 return lapic[ID]>>24;) 131.0554 Tj 0 -189.8672 Td (5767 return 0;) 69.8962 Tj 0 -199.3606 Td (5768 }) 26.2111 Tj 0 -208.8539 Td (5769 ) 21.8426 Tj 0 -218.3473 Td (5770 // Acknowledge interrupt.) 131.0554 Tj 0 -227.8407 Td (5771 void) 39.3166 Tj 0 -237.334 Td (5772 lapic_eoi\(void\)) 87.3703 Tj 0 -246.8274 Td (5773 {) 26.2111 Tj 0 -256.3207 Td (5774 if\(lapic\)) 69.8962 Tj 0 -265.8141 Td (5775 lapicw\(EOI, 0\);) 104.8443 Tj 0 -275.3075 Td (5776 }) 26.2111 Tj 0 -284.8008 Td (5777 ) 21.8426 Tj 0 -294.2942 Td (5778 // Spin for a given number of microseconds.) 209.6887 Tj 0 -303.7875 Td (5779 // On real hardware would want to tune this dynamically.) 266.4794 Tj 0 -313.2809 Td (5780 static void) 69.8962 Tj 0 -322.7743 Td (5781 microdelay\(int us\)) 100.4758 Tj 0 -332.2676 Td (5782 {) 26.2111 Tj 0 -341.761 Td (5783 volatile int j = 0;) 113.5814 Tj 0 -351.2543 Td (5784 ) 21.8426 Tj 0 -360.7477 Td (5785 while\(us-- > 0\)) 96.1073 Tj 0 -370.2411 Td (5786 for\(j=0; j<10000; j++\);) 139.7925 Tj 0 -379.7344 Td (5787 }) 26.2111 Tj 0 -389.2278 Td (5788 ) 21.8426 Tj 0 -398.7211 Td (5789 ) 21.8426 Tj 0 -408.2145 Td (5790 ) 21.8426 Tj 0 -417.7079 Td (5791 ) 21.8426 Tj 0 -427.2012 Td (5792 ) 21.8426 Tj 0 -436.6946 Td (5793 ) 21.8426 Tj 0 -446.1879 Td (5794 ) 21.8426 Tj 0 -455.6813 Td (5795 ) 21.8426 Tj 0 -465.1747 Td (5796 ) 21.8426 Tj 0 -474.668 Td (5797 ) 21.8426 Tj 0 -484.1614 Td (5798 ) 21.8426 Tj 0 -493.6547 Td (5799 ) 21.8426 Tj 0 -522.1348 Td (Sheet 57) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 65 65 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/lapic.c Page 4) 166.0035 Tj 0 -28.4801 Td (5800 #define IO_RTC 0x70) 109.2129 Tj 0 -37.9735 Td (5801 ) 21.8426 Tj 0 -47.4668 Td (5802 // Start additional processor running bootstrap code at ad\ dr.) 288.322 Tj 0 -56.9602 Td (5803 // See Appendix B of MultiProcessor Specification.) 240.2683 Tj 0 -66.4535 Td (5804 void) 39.3166 Tj 0 -75.9469 Td (5805 lapic_startap\(uchar apicid, uint addr\)) 187.8461 Tj 0 -85.4403 Td (5806 {) 26.2111 Tj 0 -94.9336 Td (5807 int i;) 56.7907 Tj 0 -104.427 Td (5808 ushort *wrv;) 83.0018 Tj 0 -113.9203 Td (5809 ) 21.8426 Tj 0 -123.4137 Td (5810 // "The BSP must initialize CMOS shutdown code to 0AH) 262.1109 Tj 0 -132.9071 Td (5811 // and the warm reset vector \(DWORD based at 40:67\) to\ point at) 305.796 Tj 0 -142.4004 Td (5812 // the AP startup code prior to the [universal startup a\ lgorithm].") 323.2701 Tj 0 -151.8938 Td (5813 outb\(IO_RTC, 0xF\); // offset 0xF is shutdown code) 249.0053 Tj 0 -161.3871 Td (5814 outb\(IO_RTC+1, 0x0A\);) 122.3184 Tj 0 -170.8805 Td (5815 wrv = \(ushort*\)\(0x40<<4 | 0x67\); // Warm reset vect\ or) 266.4794 Tj 0 -180.3739 Td (5816 wrv[0] = 0;) 78.6333 Tj 0 -189.8672 Td (5817 wrv[1] = addr >> 4;) 113.5814 Tj 0 -199.3606 Td (5818 ) 21.8426 Tj 0 -208.8539 Td (5819 // "Universal startup algorithm.") 174.7406 Tj 0 -218.3473 Td (5820 // Send INIT \(level-triggered\) interrupt to reset othe\ r CPU.) 292.6905 Tj 0 -227.8407 Td (5821 lapicw\(ICRHI, apicid<<24\);) 144.161 Tj 0 -237.334 Td (5822 lapicw\(ICRLO, INIT | LEVEL | ASSERT\);) 192.2146 Tj 0 -246.8274 Td (5823 microdelay\(200\);) 100.4758 Tj 0 -256.3207 Td (5824 lapicw\(ICRLO, INIT | LEVEL\);) 152.898 Tj 0 -265.8141 Td (5825 microdelay\(100\);) 100.4758 Tj -500.868 TJm (// should be 10ms, but too slow in Bochs!) 179.1091 Tj 0 -275.3075 Td (5826 ) 21.8426 Tj 0 -284.8008 Td (5827 // Send startup IPI \(twice!\) to enter bootstrap code.) 262.1109 Tj 0 -294.2942 Td (5828 // Regular hardware is supposed to only accept a STARTUP) 275.2164 Tj 0 -303.7875 Td (5829 // when it is in the halted state due to an INIT. So th\ e second) 310.1645 Tj 0 -313.2809 Td (5830 // should be ignored, but it is part of the official Int\ el algorithm.) 332.0071 Tj 0 -322.7743 Td (5831 // Bochs complains about the second one. Too bad for Bo\ chs.) 292.6905 Tj 0 -332.2676 Td (5832 for\(i = 0; i < 2; i++\){) 131.0554 Tj 0 -341.761 Td (5833 lapicw\(ICRHI, apicid<<24\);) 152.898 Tj 0 -351.2543 Td (5834 lapicw\(ICRLO, STARTUP | \(addr>>12\)\);) 196.5831 Tj 0 -360.7477 Td (5835 microdelay\(200\);) 109.2129 Tj 0 -370.2411 Td (5836 }) 34.9481 Tj 0 -379.7344 Td (5837 }) 26.2111 Tj 0 -389.2278 Td (5838 ) 21.8426 Tj 0 -398.7211 Td (5839 ) 21.8426 Tj 0 -408.2145 Td (5840 ) 21.8426 Tj 0 -417.7079 Td (5841 ) 21.8426 Tj 0 -427.2012 Td (5842 ) 21.8426 Tj 0 -436.6946 Td (5843 ) 21.8426 Tj 0 -446.1879 Td (5844 ) 21.8426 Tj 0 -455.6813 Td (5845 ) 21.8426 Tj 0 -465.1747 Td (5846 ) 21.8426 Tj 0 -474.668 Td (5847 ) 21.8426 Tj 0 -484.1614 Td (5848 ) 21.8426 Tj 0 -493.6547 Td (5849 ) 21.8426 Tj 0 -522.1348 Td (Sheet 58) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/ioapic.c Page 1) 170.3721 Tj 0 -28.4801 Td (5850 // The I/O APIC manages hardware interrupts for an SMP sys\ tem.) 292.6905 Tj 0 -37.9735 Td (5851 // http://www.intel.com/design/chipsets/datashts/29056601.\ pdf) 288.322 Tj 0 -47.4668 Td (5852 // See also picirq.c.) 113.5814 Tj 0 -56.9602 Td (5853 ) 21.8426 Tj 0 -66.4535 Td (5854 #include "types.h") 100.4758 Tj 0 -75.9469 Td (5855 #include "defs.h") 96.1073 Tj 0 -85.4403 Td (5856 #include "traps.h") 100.4758 Tj 0 -94.9336 Td (5857 ) 21.8426 Tj 0 -104.427 Td (5858 #define IOAPIC 0xFEC00000 // Default physical address o\ f IO APIC) 314.533 Tj 0 -113.9203 Td (5859 ) 21.8426 Tj 0 -123.4137 Td (5860 #define REG_ID 0x00 // Register index: ID) 222.7942 Tj 0 -132.9071 Td (5861 #define REG_VER 0x01 // Register index: version) 244.6368 Tj 0 -142.4004 Td (5862 #define REG_TABLE 0x10 // Redirection table base) 240.2683 Tj 0 -151.8938 Td (5863 ) 21.8426 Tj 0 -161.3871 Td (5864 // The redirection table starts at REG_TABLE and uses) 253.3738 Tj 0 -170.8805 Td (5865 // two registers to configure each interrupt.) 218.4257 Tj 0 -180.3739 Td (5866 // The first \(low\) register in a pair contains configura\ tion bits.) 310.1645 Tj 0 -189.8672 Td (5867 // The second \(high\) register contains a bitmask telling\ which) 292.6905 Tj 0 -199.3606 Td (5868 // CPUs can serve that interrupt.) 166.0035 Tj 0 -208.8539 Td (5869 #define INT_DISABLED 0x00010000 // Interrupt disabled) 266.4794 Tj 0 -218.3473 Td (5870 #define INT_LEVEL 0x00008000 // Level-triggered \(vs\ edge-\)) 301.4275 Tj 0 -227.8407 Td (5871 #define INT_ACTIVELOW 0x00002000 // Active low \(vs high\ \)) 275.2164 Tj 0 -237.334 Td (5872 #define INT_LOGICAL 0x00000800 // Destination is CPU i\ d \(vs APIC ID\)) 336.3756 Tj 0 -246.8274 Td (5873 ) 21.8426 Tj 0 -256.3207 Td (5874 volatile struct ioapic *ioapic;) 157.2665 Tj 0 -265.8141 Td (5875 ) 21.8426 Tj 0 -275.3075 Td (5876 // IO APIC MMIO structure: write reg, then read or write d\ ata.) 292.6905 Tj 0 -284.8008 Td (5877 struct ioapic {) 87.3703 Tj 0 -294.2942 Td (5878 uint reg;) 69.8962 Tj 0 -303.7875 Td (5879 uint pad[3];) 83.0018 Tj 0 -313.2809 Td (5880 uint data;) 74.2647 Tj 0 -322.7743 Td (5881 };) 30.5796 Tj 0 -332.2676 Td (5882 ) 21.8426 Tj 0 -341.761 Td (5883 static uint) 69.8962 Tj 0 -351.2543 Td (5884 ioapic_read\(int reg\)) 109.2129 Tj 0 -360.7477 Td (5885 {) 26.2111 Tj 0 -370.2411 Td (5886 ioapic->reg = reg;) 109.2129 Tj 0 -379.7344 Td (5887 return ioapic->data;) 117.9499 Tj 0 -389.2278 Td (5888 }) 26.2111 Tj 0 -398.7211 Td (5889 ) 21.8426 Tj 0 -408.2145 Td (5890 static void) 69.8962 Tj 0 -417.7079 Td (5891 ioapic_write\(int reg, uint data\)) 161.635 Tj 0 -427.2012 Td (5892 {) 26.2111 Tj 0 -436.6946 Td (5893 ioapic->reg = reg;) 109.2129 Tj 0 -446.1879 Td (5894 ioapic->data = data;) 117.9499 Tj 0 -455.6813 Td (5895 }) 26.2111 Tj 0 -465.1747 Td (5896 ) 21.8426 Tj 0 -474.668 Td (5897 ) 21.8426 Tj 0 -484.1614 Td (5898 ) 21.8426 Tj 0 -493.6547 Td (5899 ) 21.8426 Tj 0 -522.1348 Td (Sheet 58) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 66 66 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/ioapic.c Page 2) 170.3721 Tj 0 -28.4801 Td (5900 void) 39.3166 Tj 0 -37.9735 Td (5901 ioapic_init\(void\)) 96.1073 Tj 0 -47.4668 Td (5902 {) 26.2111 Tj 0 -56.9602 Td (5903 int i, id, maxintr;) 113.5814 Tj 0 -66.4535 Td (5904 ) 21.8426 Tj 0 -75.9469 Td (5905 if\(!ismp\)) 69.8962 Tj 0 -85.4403 Td (5906 return;) 69.8962 Tj 0 -94.9336 Td (5907 ) 21.8426 Tj 0 -104.427 Td (5908 ioapic = \(volatile struct ioapic*\)IOAPIC;) 209.6887 Tj 0 -113.9203 Td (5909 maxintr = \(ioapic_read\(REG_VER\) >> 16\) & 0xFF;) 231.5313 Tj 0 -123.4137 Td (5910 id = ioapic_read\(REG_ID\) >> 24;) 166.0035 Tj 0 -132.9071 Td (5911 if\(id != ioapic_id\)) 113.5814 Tj 0 -142.4004 Td (5912 cprintf\("ioapic_init: id isn't equal to ioapic_id; no\ t a MP\\n"\);) 318.9016 Tj 0 -151.8938 Td (5913 ) 21.8426 Tj 0 -161.3871 Td (5914 // Mark all interrupts edge-triggered, active high, disa\ bled,) 297.059 Tj 0 -170.8805 Td (5915 // and not routed to any CPUs.) 161.635 Tj 0 -180.3739 Td (5916 for\(i = 0; i <= maxintr; i++\){) 161.635 Tj 0 -189.8672 Td (5917 ioapic_write\(REG_TABLE+2*i, INT_DISABLED | \(IRQ_OFFS\ ET + i\)\);) 305.796 Tj 0 -199.3606 Td (5918 ioapic_write\(REG_TABLE+2*i+1, 0\);) 183.4776 Tj 0 -208.8539 Td (5919 }) 34.9481 Tj 0 -218.3473 Td (5920 }) 26.2111 Tj 0 -227.8407 Td (5921 ) 21.8426 Tj 0 -237.334 Td (5922 void) 39.3166 Tj 0 -246.8274 Td (5923 ioapic_enable\(int irq, int cpunum\)) 170.3721 Tj 0 -256.3207 Td (5924 {) 26.2111 Tj 0 -265.8141 Td (5925 if\(!ismp\)) 69.8962 Tj 0 -275.3075 Td (5926 return;) 69.8962 Tj 0 -284.8008 Td (5927 ) 21.8426 Tj 0 -294.2942 Td (5928 // Mark interrupt edge-triggered, active high,) 231.5313 Tj 0 -303.7875 Td (5929 // enabled, and routed to the given cpunum,) 218.4257 Tj 0 -313.2809 Td (5930 // which happens to be that cpu's APIC ID.) 214.0572 Tj 0 -322.7743 Td (5931 ioapic_write\(REG_TABLE+2*irq, IRQ_OFFSET + irq\);) 240.2683 Tj 0 -332.2676 Td (5932 ioapic_write\(REG_TABLE+2*irq+1, cpunum << 24\);) 231.5313 Tj 0 -341.761 Td (5933 }) 26.2111 Tj 0 -351.2543 Td (5934 ) 21.8426 Tj 0 -360.7477 Td (5935 ) 21.8426 Tj 0 -370.2411 Td (5936 ) 21.8426 Tj 0 -379.7344 Td (5937 ) 21.8426 Tj 0 -389.2278 Td (5938 ) 21.8426 Tj 0 -398.7211 Td (5939 ) 21.8426 Tj 0 -408.2145 Td (5940 ) 21.8426 Tj 0 -417.7079 Td (5941 ) 21.8426 Tj 0 -427.2012 Td (5942 ) 21.8426 Tj 0 -436.6946 Td (5943 ) 21.8426 Tj 0 -446.1879 Td (5944 ) 21.8426 Tj 0 -455.6813 Td (5945 ) 21.8426 Tj 0 -465.1747 Td (5946 ) 21.8426 Tj 0 -474.668 Td (5947 ) 21.8426 Tj 0 -484.1614 Td (5948 ) 21.8426 Tj 0 -493.6547 Td (5949 ) 21.8426 Tj 0 -522.1348 Td (Sheet 59) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/picirq.c Page 1) 170.3721 Tj 0 -28.4801 Td (5950 // Intel 8259A programmable interrupt controllers.) 240.2683 Tj 0 -37.9735 Td (5951 ) 21.8426 Tj 0 -47.4668 Td (5952 #include "types.h") 100.4758 Tj 0 -56.9602 Td (5953 #include "x86.h") 91.7388 Tj 0 -66.4535 Td (5954 #include "traps.h") 100.4758 Tj 0 -75.9469 Td (5955 ) 21.8426 Tj 0 -85.4403 Td (5956 // I/O Addresses of the two programmable interrupt control\ lers) 292.6905 Tj 0 -94.9336 Td (5957 #define IO_PIC1 0x20 // Master \(IRQs 0-7\)) 249.0053 Tj 0 -104.427 Td (5958 #define IO_PIC2 0xA0 // Slave \(IRQs 8-15\)) 249.0053 Tj 0 -113.9203 Td (5959 ) 21.8426 Tj 0 -123.4137 Td (5960 #define IRQ_SLAVE 2 // IRQ at which slave conn\ ects to master) 336.3756 Tj 0 -132.9071 Td (5961 ) 21.8426 Tj 0 -142.4004 Td (5962 // Current IRQ mask.) 109.2129 Tj 0 -151.8938 Td (5963 // Initial IRQ mask has interrupt 2 enabled \(for slave 82\ 59A\).) 292.6905 Tj 0 -161.3871 Td (5964 static ushort irqmask = 0xFFFF & ~\(1<> 8\);) 148.5295 Tj 0 -237.334 Td (5972 }) 26.2111 Tj 0 -246.8274 Td (5973 ) 21.8426 Tj 0 -256.3207 Td (5974 void) 39.3166 Tj 0 -265.8141 Td (5975 pic_enable\(int irq\)) 104.8443 Tj 0 -275.3075 Td (5976 {) 26.2111 Tj 0 -284.8008 Td (5977 pic_setmask\(irqmask & ~\(1<', '?', NO, '*', // 0x30) 270.8479 Tj 0 -322.7743 Td (6131 NO, ' ', NO, NO, NO, NO, NO, NO,) 227.1628 Tj 0 -332.2676 Td (6132 NO, NO, NO, NO, NO, NO, NO, '7', // 0x40) 270.8479 Tj 0 -341.761 Td (6133 '8', '9', '-', '4', '5', '6', '+', '1',) 231.5313 Tj 0 -351.2543 Td (6134 '2', '3', '0', '.', NO, NO, NO, NO, // 0x50) 270.8479 Tj 0 -360.7477 Td (6135 [0x9C] '\\n', // KP_Enter) 157.2665 Tj 0 -370.2411 Td (6136 [0xB5] '/', // KP_Div) 148.5295 Tj 0 -379.7344 Td (6137 [0xC8] KEY_UP, [0xD0] KEY_DN,) 170.3721 Tj 0 -389.2278 Td (6138 [0xC9] KEY_PGUP, [0xD1] KEY_PGDN,) 179.1091 Tj 0 -398.7211 Td (6139 [0xCB] KEY_LF, [0xCD] KEY_RT,) 170.3721 Tj 0 -408.2145 Td (6140 [0x97] KEY_HOME, [0xCF] KEY_END,) 174.7406 Tj 0 -417.7079 Td (6141 [0xD2] KEY_INS, [0xD3] KEY_DEL) 170.3721 Tj 0 -427.2012 Td (6142 };) 30.5796 Tj 0 -436.6946 Td (6143 ) 21.8426 Tj 0 -446.1879 Td (6144 ) 21.8426 Tj 0 -455.6813 Td (6145 ) 21.8426 Tj 0 -465.1747 Td (6146 ) 21.8426 Tj 0 -474.668 Td (6147 ) 21.8426 Tj 0 -484.1614 Td (6148 ) 21.8426 Tj 0 -493.6547 Td (6149 ) 21.8426 Tj 0 -522.1348 Td (Sheet 61) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/kbd.h Page 3) 157.2665 Tj 0 -28.4801 Td (6150 static uchar ctlmap[256] =) 135.4239 Tj 0 -37.9735 Td (6151 {) 26.2111 Tj 0 -47.4668 Td (6152 NO, NO, NO, NO, NO, NO, NO\ , NO,) 318.9016 Tj 0 -56.9602 Td (6153 NO, NO, NO, NO, NO, NO, NO\ , NO,) 318.9016 Tj 0 -66.4535 Td (6154 C\('Q'\), C\('W'\), C\('E'\), C\('R'\), C\('T'\), C\ \('Y'\), C\('U'\), C\('I'\),) 336.3756 Tj 0 -75.9469 Td (6155 C\('O'\), C\('P'\), NO, NO, '\\r', NO, \ C\('A'\), C\('S'\),) 336.3756 Tj 0 -85.4403 Td (6156 C\('D'\), C\('F'\), C\('G'\), C\('H'\), C\('J'\), C\ \('K'\), C\('L'\), NO,) 318.9016 Tj 0 -94.9336 Td (6157 NO, NO, NO, C\('\\\\'\), C\('Z'\), C\('X\ '\), C\('C'\), C\('V'\),) 336.3756 Tj 0 -104.427 Td (6158 C\('B'\), C\('N'\), C\('M'\), NO, NO, C\('/\ '\), NO, NO,) 318.9016 Tj 0 -113.9203 Td (6159 [0x9C] '\\r', // KP_Enter) 157.2665 Tj 0 -123.4137 Td (6160 [0xB5] C\('/'\), // KP_Div) 148.5295 Tj 0 -132.9071 Td (6161 [0xC8] KEY_UP, [0xD0] KEY_DN,) 170.3721 Tj 0 -142.4004 Td (6162 [0xC9] KEY_PGUP, [0xD1] KEY_PGDN,) 179.1091 Tj 0 -151.8938 Td (6163 [0xCB] KEY_LF, [0xCD] KEY_RT,) 170.3721 Tj 0 -161.3871 Td (6164 [0x97] KEY_HOME, [0xCF] KEY_END,) 174.7406 Tj 0 -170.8805 Td (6165 [0xD2] KEY_INS, [0xD3] KEY_DEL) 170.3721 Tj 0 -180.3739 Td (6166 };) 30.5796 Tj 0 -189.8672 Td (6167 ) 21.8426 Tj 0 -199.3606 Td (6168 ) 21.8426 Tj 0 -208.8539 Td (6169 ) 21.8426 Tj 0 -218.3473 Td (6170 ) 21.8426 Tj 0 -227.8407 Td (6171 ) 21.8426 Tj 0 -237.334 Td (6172 ) 21.8426 Tj 0 -246.8274 Td (6173 ) 21.8426 Tj 0 -256.3207 Td (6174 ) 21.8426 Tj 0 -265.8141 Td (6175 ) 21.8426 Tj 0 -275.3075 Td (6176 ) 21.8426 Tj 0 -284.8008 Td (6177 ) 21.8426 Tj 0 -294.2942 Td (6178 ) 21.8426 Tj 0 -303.7875 Td (6179 ) 21.8426 Tj 0 -313.2809 Td (6180 ) 21.8426 Tj 0 -322.7743 Td (6181 ) 21.8426 Tj 0 -332.2676 Td (6182 ) 21.8426 Tj 0 -341.761 Td (6183 ) 21.8426 Tj 0 -351.2543 Td (6184 ) 21.8426 Tj 0 -360.7477 Td (6185 ) 21.8426 Tj 0 -370.2411 Td (6186 ) 21.8426 Tj 0 -379.7344 Td (6187 ) 21.8426 Tj 0 -389.2278 Td (6188 ) 21.8426 Tj 0 -398.7211 Td (6189 ) 21.8426 Tj 0 -408.2145 Td (6190 ) 21.8426 Tj 0 -417.7079 Td (6191 ) 21.8426 Tj 0 -427.2012 Td (6192 ) 21.8426 Tj 0 -436.6946 Td (6193 ) 21.8426 Tj 0 -446.1879 Td (6194 ) 21.8426 Tj 0 -455.6813 Td (6195 ) 21.8426 Tj 0 -465.1747 Td (6196 ) 21.8426 Tj 0 -474.668 Td (6197 ) 21.8426 Tj 0 -484.1614 Td (6198 ) 21.8426 Tj 0 -493.6547 Td (6199 ) 21.8426 Tj 0 -522.1348 Td (Sheet 61) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 69 69 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/kbd.c Page 1) 157.2665 Tj 0 -28.4801 Td (6200 #include "types.h") 100.4758 Tj 0 -37.9735 Td (6201 #include "x86.h") 91.7388 Tj 0 -47.4668 Td (6202 #include "defs.h") 96.1073 Tj 0 -56.9602 Td (6203 #include "kbd.h") 91.7388 Tj 0 -66.4535 Td (6204 ) 21.8426 Tj 0 -75.9469 Td (6205 int) 34.9481 Tj 0 -85.4403 Td (6206 kbd_getc\(void\)) 83.0018 Tj 0 -94.9336 Td (6207 {) 26.2111 Tj 0 -104.427 Td (6208 static uint shift;) 109.2129 Tj 0 -113.9203 Td (6209 static uchar *charcode[4] = {) 157.2665 Tj 0 -123.4137 Td (6210 normalmap, shiftmap, ctlmap, ctlmap) 192.2146 Tj 0 -132.9071 Td (6211 };) 39.3166 Tj 0 -142.4004 Td (6212 uint st, data, c;) 104.8443 Tj 0 -151.8938 Td (6213 ) 21.8426 Tj 0 -161.3871 Td (6214 st = inb\(KBSTATP\);) 109.2129 Tj 0 -170.8805 Td (6215 if\(\(st & KBS_DIB\) == 0\)) 131.0554 Tj 0 -180.3739 Td (6216 return -1;) 83.0018 Tj 0 -189.8672 Td (6217 data = inb\(KBDATAP\);) 117.9499 Tj 0 -199.3606 Td (6218 ) 21.8426 Tj 0 -208.8539 Td (6219 if\(data == 0xE0\){) 104.8443 Tj 0 -218.3473 Td (6220 shift |= E0ESC;) 104.8443 Tj 0 -227.8407 Td (6221 return 0;) 78.6333 Tj 0 -237.334 Td (6222 } else if\(data & 0x80\){) 131.0554 Tj 0 -246.8274 Td (6223 // Key released) 104.8443 Tj 0 -256.3207 Td (6224 data = \(shift & E0ESC ? data : data & 0x7F\);) 231.5313 Tj 0 -265.8141 Td (6225 shift &= ~\(shiftcode[data] | E0ESC\);) 196.5831 Tj 0 -275.3075 Td (6226 return 0;) 78.6333 Tj 0 -284.8008 Td (6227 } else if\(shift & E0ESC\){) 139.7925 Tj 0 -294.2942 Td (6228 // Last character was an E0 escape; or with 0x80) 249.0053 Tj 0 -303.7875 Td (6229 data |= 0x80;) 96.1073 Tj 0 -313.2809 Td (6230 shift &= ~E0ESC;) 109.2129 Tj 0 -322.7743 Td (6231 }) 34.9481 Tj 0 -332.2676 Td (6232 ) 21.8426 Tj 0 -341.761 Td (6233 shift |= shiftcode[data];) 139.7925 Tj 0 -351.2543 Td (6234 shift ^= togglecode[data];) 144.161 Tj 0 -360.7477 Td (6235 c = charcode[shift & \(CTL | SHIFT\)][data];) 214.0572 Tj 0 -370.2411 Td (6236 if\(shift & CAPSLOCK\){) 122.3184 Tj 0 -379.7344 Td (6237 if\('a' <= c && c <= 'z'\)) 144.161 Tj 0 -389.2278 Td (6238 c += 'A' - 'a';) 113.5814 Tj 0 -398.7211 Td (6239 else if\('A' <= c && c <= 'Z'\)) 166.0035 Tj 0 -408.2145 Td (6240 c += 'a' - 'A';) 113.5814 Tj 0 -417.7079 Td (6241 }) 34.9481 Tj 0 -427.2012 Td (6242 return c;) 69.8962 Tj 0 -436.6946 Td (6243 }) 26.2111 Tj 0 -446.1879 Td (6244 ) 21.8426 Tj 0 -455.6813 Td (6245 void) 39.3166 Tj 0 -465.1747 Td (6246 kbd_intr\(void\)) 83.0018 Tj 0 -474.668 Td (6247 {) 26.2111 Tj 0 -484.1614 Td (6248 console_intr\(kbd_getc\);) 131.0554 Tj 0 -493.6547 Td (6249 }) 26.2111 Tj 0 -522.1348 Td (Sheet 62) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/console.c Page 1) 174.7406 Tj 0 -28.4801 Td (6250 // Console input and output.) 144.161 Tj 0 -37.9735 Td (6251 // Input is from the keyboard only.) 174.7406 Tj 0 -47.4668 Td (6252 // Output is written to the screen and the printer port.) 266.4794 Tj 0 -56.9602 Td (6253 ) 21.8426 Tj 0 -66.4535 Td (6254 #include "types.h") 100.4758 Tj 0 -75.9469 Td (6255 #include "defs.h") 96.1073 Tj 0 -85.4403 Td (6256 #include "param.h") 100.4758 Tj 0 -94.9336 Td (6257 #include "traps.h") 100.4758 Tj 0 -104.427 Td (6258 #include "spinlock.h") 113.5814 Tj 0 -113.9203 Td (6259 #include "dev.h") 91.7388 Tj 0 -123.4137 Td (6260 #include "mmu.h") 91.7388 Tj 0 -132.9071 Td (6261 #include "proc.h") 96.1073 Tj 0 -142.4004 Td (6262 #include "x86.h") 91.7388 Tj 0 -151.8938 Td (6263 ) 21.8426 Tj 0 -161.3871 Td (6264 #define CRTPORT 0x3d4) 113.5814 Tj 0 -170.8805 Td (6265 #define LPTPORT 0x378) 113.5814 Tj 0 -180.3739 Td (6266 #define BACKSPACE 0x100) 122.3184 Tj 0 -189.8672 Td (6267 ) 21.8426 Tj 0 -199.3606 Td (6268 static ushort *crt = \(ushort*\)0xb8000; // CGA memory) 253.3738 Tj 0 -208.8539 Td (6269 ) 21.8426 Tj 0 -218.3473 Td (6270 static struct spinlock console_lock;) 179.1091 Tj 0 -227.8407 Td (6271 int panicked = 0;) 96.1073 Tj 0 -237.334 Td (6272 int use_console_lock = 0;) 131.0554 Tj 0 -246.8274 Td (6273 ) 21.8426 Tj 0 -256.3207 Td (6274 // Copy console output to parallel port, which you can tel\ l) 279.5849 Tj 0 -265.8141 Td (6275 // .bochsrc to copy to the stdout:) 170.3721 Tj 0 -275.3075 Td (6276 // parport1: enabled=1, file="/dev/stdout") 214.0572 Tj 0 -284.8008 Td (6277 static void) 69.8962 Tj 0 -294.2942 Td (6278 lpt_putc\(int c\)) 87.3703 Tj 0 -303.7875 Td (6279 {) 26.2111 Tj 0 -313.2809 Td (6280 int i;) 56.7907 Tj 0 -322.7743 Td (6281 ) 21.8426 Tj 0 -332.2676 Td (6282 for\(i = 0; !\(inb\(LPTPORT+1\) & 0x80\) && i < 12800; i\ ++\)) 266.4794 Tj 0 -341.761 Td (6283 ;) 43.6851 Tj 0 -351.2543 Td (6284 if\(c == BACKSPACE\)) 109.2129 Tj 0 -360.7477 Td (6285 c = '\\b';) 78.6333 Tj 0 -370.2411 Td (6286 outb\(LPTPORT+0, c\);) 113.5814 Tj 0 -379.7344 Td (6287 outb\(LPTPORT+2, 0x08|0x04|0x01\);) 170.3721 Tj 0 -389.2278 Td (6288 outb\(LPTPORT+2, 0x08\);) 126.6869 Tj 0 -398.7211 Td (6289 }) 26.2111 Tj 0 -408.2145 Td (6290 ) 21.8426 Tj 0 -417.7079 Td (6291 ) 21.8426 Tj 0 -427.2012 Td (6292 ) 21.8426 Tj 0 -436.6946 Td (6293 ) 21.8426 Tj 0 -446.1879 Td (6294 ) 21.8426 Tj 0 -455.6813 Td (6295 ) 21.8426 Tj 0 -465.1747 Td (6296 ) 21.8426 Tj 0 -474.668 Td (6297 ) 21.8426 Tj 0 -484.1614 Td (6298 ) 21.8426 Tj 0 -493.6547 Td (6299 ) 21.8426 Tj 0 -522.1348 Td (Sheet 62) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 70 70 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/console.c Page 2) 174.7406 Tj 0 -28.4801 Td (6300 static void) 69.8962 Tj 0 -37.9735 Td (6301 cga_putc\(int c\)) 87.3703 Tj 0 -47.4668 Td (6302 {) 26.2111 Tj 0 -56.9602 Td (6303 int pos;) 65.5277 Tj 0 -66.4535 Td (6304 ) 21.8426 Tj 0 -75.9469 Td (6305 // Cursor position: col + 80*row.) 174.7406 Tj 0 -85.4403 Td (6306 outb\(CRTPORT, 14\);) 109.2129 Tj 0 -94.9336 Td (6307 pos = inb\(CRTPORT+1\) << 8;) 144.161 Tj 0 -104.427 Td (6308 outb\(CRTPORT, 15\);) 109.2129 Tj 0 -113.9203 Td (6309 pos |= inb\(CRTPORT+1\);) 126.6869 Tj 0 -123.4137 Td (6310 ) 21.8426 Tj 0 -132.9071 Td (6311 if\(c == '\\n'\)) 87.3703 Tj 0 -142.4004 Td (6312 pos += 80 - pos%80;) 122.3184 Tj 0 -151.8938 Td (6313 else if\(c == BACKSPACE\){) 135.4239 Tj 0 -161.3871 Td (6314 if\(pos > 0\)) 87.3703 Tj 0 -170.8805 Td (6315 crt[--pos] = ' ' | 0x0700;) 161.635 Tj 0 -180.3739 Td (6316 } else) 56.7907 Tj 0 -189.8672 Td (6317 crt[pos++] = \(c&0xff\) | 0x0700; // black on white) 257.7424 Tj 0 -199.3606 Td (6318 ) 21.8426 Tj 0 -208.8539 Td (6319 if\(\(pos/80\) >= 24\){ // Scroll up.) 179.1091 Tj 0 -218.3473 Td (6320 memmove\(crt, crt+80, sizeof\(crt[0]\)*23*80\);) 227.1628 Tj 0 -227.8407 Td (6321 pos -= 80;) 83.0018 Tj 0 -237.334 Td (6322 memset\(crt+pos, 0, sizeof\(crt[0]\)*\(24*80 - pos\)\)\ ;) 253.3738 Tj 0 -246.8274 Td (6323 }) 34.9481 Tj 0 -256.3207 Td (6324 ) 21.8426 Tj 0 -265.8141 Td (6325 outb\(CRTPORT, 14\);) 109.2129 Tj 0 -275.3075 Td (6326 outb\(CRTPORT+1, pos>>8\);) 135.4239 Tj 0 -284.8008 Td (6327 outb\(CRTPORT, 15\);) 109.2129 Tj 0 -294.2942 Td (6328 outb\(CRTPORT+1, pos\);) 122.3184 Tj 0 -303.7875 Td (6329 crt[pos] = ' ' | 0x0700;) 135.4239 Tj 0 -313.2809 Td (6330 }) 26.2111 Tj 0 -322.7743 Td (6331 ) 21.8426 Tj 0 -332.2676 Td (6332 void) 39.3166 Tj 0 -341.761 Td (6333 cons_putc\(int c\)) 91.7388 Tj 0 -351.2543 Td (6334 {) 26.2111 Tj 0 -360.7477 Td (6335 if\(panicked\){) 87.3703 Tj 0 -370.2411 Td (6336 cli\(\);) 65.5277 Tj 0 -379.7344 Td (6337 for\(;;\)) 69.8962 Tj 0 -389.2278 Td (6338 ;) 52.4222 Tj 0 -398.7211 Td (6339 }) 34.9481 Tj 0 -408.2145 Td (6340 ) 21.8426 Tj 0 -417.7079 Td (6341 lpt_putc\(c\);) 83.0018 Tj 0 -427.2012 Td (6342 cga_putc\(c\);) 83.0018 Tj 0 -436.6946 Td (6343 }) 26.2111 Tj 0 -446.1879 Td (6344 ) 21.8426 Tj 0 -455.6813 Td (6345 ) 21.8426 Tj 0 -465.1747 Td (6346 ) 21.8426 Tj 0 -474.668 Td (6347 ) 21.8426 Tj 0 -484.1614 Td (6348 ) 21.8426 Tj 0 -493.6547 Td (6349 ) 21.8426 Tj 0 -522.1348 Td (Sheet 63) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/console.c Page 3) 174.7406 Tj 0 -28.4801 Td (6350 void) 39.3166 Tj 0 -37.9735 Td (6351 printint\(int xx, int base, int sgn\)) 174.7406 Tj 0 -47.4668 Td (6352 {) 26.2111 Tj 0 -56.9602 Td (6353 static char digits[] = "0123456789ABCDEF";) 214.0572 Tj 0 -66.4535 Td (6354 char buf[16];) 87.3703 Tj 0 -75.9469 Td (6355 int i = 0, neg = 0;) 113.5814 Tj 0 -85.4403 Td (6356 uint x;) 61.1592 Tj 0 -94.9336 Td (6357 ) 21.8426 Tj 0 -104.427 Td (6358 if\(sgn && xx < 0\){) 109.2129 Tj 0 -113.9203 Td (6359 neg = 1;) 74.2647 Tj 0 -123.4137 Td (6360 x = 0 - xx;) 87.3703 Tj 0 -132.9071 Td (6361 } else {) 65.5277 Tj 0 -142.4004 Td (6362 x = xx;) 69.8962 Tj 0 -151.8938 Td (6363 }) 34.9481 Tj 0 -161.3871 Td (6364 ) 21.8426 Tj 0 -170.8805 Td (6365 do{) 43.6851 Tj 0 -180.3739 Td (6366 buf[i++] = digits[x % base];) 161.635 Tj 0 -189.8672 Td (6367 }while\(\(x /= base\) != 0\);) 139.7925 Tj 0 -199.3606 Td (6368 if\(neg\)) 61.1592 Tj 0 -208.8539 Td (6369 buf[i++] = '-';) 104.8443 Tj 0 -218.3473 Td (6370 ) 21.8426 Tj 0 -227.8407 Td (6371 while\(--i >= 0\)) 96.1073 Tj 0 -237.334 Td (6372 cons_putc\(buf[i]\);) 117.9499 Tj 0 -246.8274 Td (6373 }) 26.2111 Tj 0 -256.3207 Td (6374 ) 21.8426 Tj 0 -265.8141 Td (6375 // Print to the console. only understands %d, %x, %p, %s.) 270.8479 Tj 0 -275.3075 Td (6376 void) 39.3166 Tj 0 -284.8008 Td (6377 cprintf\(char *fmt, ...\)) 122.3184 Tj 0 -294.2942 Td (6378 {) 26.2111 Tj 0 -303.7875 Td (6379 int i, c, state, locking;) 139.7925 Tj 0 -313.2809 Td (6380 uint *argp;) 78.6333 Tj 0 -322.7743 Td (6381 char *s;) 65.5277 Tj 0 -332.2676 Td (6382 ) 21.8426 Tj 0 -341.761 Td (6383 locking = use_console_lock;) 148.5295 Tj 0 -351.2543 Td (6384 if\(locking\)) 78.6333 Tj 0 -360.7477 Td (6385 acquire\(&console_lock\);) 139.7925 Tj 0 -370.2411 Td (6386 ) 21.8426 Tj 0 -379.7344 Td (6387 argp = \(uint*\)\(void*\)&fmt + 1;) 161.635 Tj 0 -389.2278 Td (6388 state = 0;) 74.2647 Tj 0 -398.7211 Td (6389 for\(i = 0; fmt[i]; i++\){) 135.4239 Tj 0 -408.2145 Td (6390 c = fmt[i] & 0xff;) 117.9499 Tj 0 -417.7079 Td (6391 switch\(state\){) 100.4758 Tj 0 -427.2012 Td (6392 case 0:) 69.8962 Tj 0 -436.6946 Td (6393 if\(c == '%'\)) 100.4758 Tj 0 -446.1879 Td (6394 state = '%';) 109.2129 Tj 0 -455.6813 Td (6395 else) 65.5277 Tj 0 -465.1747 Td (6396 cons_putc\(c\);) 113.5814 Tj 0 -474.668 Td (6397 break;) 74.2647 Tj 0 -484.1614 Td (6398 ) 21.8426 Tj 0 -493.6547 Td (6399 ) 21.8426 Tj 0 -522.1348 Td (Sheet 63) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 71 71 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/console.c Page 4) 174.7406 Tj 0 -28.4801 Td (6400 case '%':) 78.6333 Tj 0 -37.9735 Td (6401 switch\(c\){) 91.7388 Tj 0 -47.4668 Td (6402 case 'd':) 87.3703 Tj 0 -56.9602 Td (6403 printint\(*argp++, 10, 1\);) 166.0035 Tj 0 -66.4535 Td (6404 break;) 83.0018 Tj 0 -75.9469 Td (6405 case 'x':) 87.3703 Tj 0 -85.4403 Td (6406 case 'p':) 87.3703 Tj 0 -94.9336 Td (6407 printint\(*argp++, 16, 0\);) 166.0035 Tj 0 -104.427 Td (6408 break;) 83.0018 Tj 0 -113.9203 Td (6409 case 's':) 87.3703 Tj 0 -123.4137 Td (6410 s = \(char*\)*argp++;) 139.7925 Tj 0 -132.9071 Td (6411 if\(s == 0\)) 100.4758 Tj 0 -142.4004 Td (6412 s = "\(null\)";) 122.3184 Tj 0 -151.8938 Td (6413 for\(; *s; s++\)) 117.9499 Tj 0 -161.3871 Td (6414 cons_putc\(*s\);) 126.6869 Tj 0 -170.8805 Td (6415 break;) 83.0018 Tj 0 -180.3739 Td (6416 case '%':) 87.3703 Tj 0 -189.8672 Td (6417 cons_putc\('%'\);) 122.3184 Tj 0 -199.3606 Td (6418 break;) 83.0018 Tj 0 -208.8539 Td (6419 default:) 83.0018 Tj 0 -218.3473 Td (6420 // Print unknown % sequence to draw attention.) 257.7424 Tj 0 -227.8407 Td (6421 cons_putc\('%'\);) 122.3184 Tj 0 -237.334 Td (6422 cons_putc\(c\);) 113.5814 Tj 0 -246.8274 Td (6423 break;) 83.0018 Tj 0 -256.3207 Td (6424 }) 52.4222 Tj 0 -265.8141 Td (6425 state = 0;) 91.7388 Tj 0 -275.3075 Td (6426 break;) 74.2647 Tj 0 -284.8008 Td (6427 }) 43.6851 Tj 0 -294.2942 Td (6428 }) 34.9481 Tj 0 -303.7875 Td (6429 ) 21.8426 Tj 0 -313.2809 Td (6430 if\(locking\)) 78.6333 Tj 0 -322.7743 Td (6431 release\(&console_lock\);) 139.7925 Tj 0 -332.2676 Td (6432 }) 26.2111 Tj 0 -341.761 Td (6433 ) 21.8426 Tj 0 -351.2543 Td (6434 int) 34.9481 Tj 0 -360.7477 Td (6435 console_write\(struct inode *ip, char *buf, int n\)) 235.8998 Tj 0 -370.2411 Td (6436 {) 26.2111 Tj 0 -379.7344 Td (6437 int i;) 56.7907 Tj 0 -389.2278 Td (6438 ) 21.8426 Tj 0 -398.7211 Td (6439 iunlock\(ip\);) 83.0018 Tj 0 -408.2145 Td (6440 acquire\(&console_lock\);) 131.0554 Tj 0 -417.7079 Td (6441 for\(i = 0; i < n; i++\)) 126.6869 Tj 0 -427.2012 Td (6442 cons_putc\(buf[i] & 0xff\);) 148.5295 Tj 0 -436.6946 Td (6443 release\(&console_lock\);) 131.0554 Tj 0 -446.1879 Td (6444 ilock\(ip\);) 74.2647 Tj 0 -455.6813 Td (6445 ) 21.8426 Tj 0 -465.1747 Td (6446 return n;) 69.8962 Tj 0 -474.668 Td (6447 }) 26.2111 Tj 0 -484.1614 Td (6448 ) 21.8426 Tj 0 -493.6547 Td (6449 ) 21.8426 Tj 0 -522.1348 Td (Sheet 64) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/console.c Page 5) 174.7406 Tj 0 -28.4801 Td (6450 #define INPUT_BUF 128) 113.5814 Tj 0 -37.9735 Td (6451 struct {) 56.7907 Tj 0 -47.4668 Td (6452 struct spinlock lock;) 122.3184 Tj 0 -56.9602 Td (6453 char buf[INPUT_BUF];) 117.9499 Tj 0 -66.4535 Td (6454 uint r; // Read index) 126.6869 Tj 0 -75.9469 Td (6455 uint w; // Write index) 131.0554 Tj 0 -85.4403 Td (6456 uint e; // Edit index) 126.6869 Tj 0 -94.9336 Td (6457 } input;) 56.7907 Tj 0 -104.427 Td (6458 ) 21.8426 Tj 0 -113.9203 Td (6459 #define C\(x\) \(\(x\)-'@'\) // Control-x) 183.4776 Tj 0 -123.4137 Td (6460 ) 21.8426 Tj 0 -132.9071 Td (6461 void) 39.3166 Tj 0 -142.4004 Td (6462 console_intr\(int \(*getc\)\(void\)\)) 157.2665 Tj 0 -151.8938 Td (6463 {) 26.2111 Tj 0 -161.3871 Td (6464 int c;) 56.7907 Tj 0 -170.8805 Td (6465 ) 21.8426 Tj 0 -180.3739 Td (6466 acquire\(&input.lock\);) 122.3184 Tj 0 -189.8672 Td (6467 while\(\(c = getc\(\)\) >= 0\){) 139.7925 Tj 0 -199.3606 Td (6468 switch\(c\){) 83.0018 Tj 0 -208.8539 Td (6469 case C\('P'\): // Process listing.) 183.4776 Tj 0 -218.3473 Td (6470 procdump\(\);) 96.1073 Tj 0 -227.8407 Td (6471 break;) 74.2647 Tj 0 -237.334 Td (6472 case C\('U'\): // Kill line.) 157.2665 Tj 0 -246.8274 Td (6473 while\(input.e != input.w &&) 166.0035 Tj 0 -256.3207 Td (6474 input.buf[\(input.e-1\) % INPUT_BUF] != '\\n'\)\ {) 266.4794 Tj 0 -265.8141 Td (6475 input.e--;) 100.4758 Tj 0 -275.3075 Td (6476 cons_putc\(BACKSPACE\);) 148.5295 Tj 0 -284.8008 Td (6477 }) 52.4222 Tj 0 -294.2942 Td (6478 break;) 74.2647 Tj 0 -303.7875 Td (6479 case C\('H'\): // Backspace) 152.898 Tj 0 -313.2809 Td (6480 if\(input.e != input.w\){) 148.5295 Tj 0 -322.7743 Td (6481 input.e--;) 100.4758 Tj 0 -332.2676 Td (6482 cons_putc\(BACKSPACE\);) 148.5295 Tj 0 -341.761 Td (6483 }) 52.4222 Tj 0 -351.2543 Td (6484 break;) 74.2647 Tj 0 -360.7477 Td (6485 default:) 74.2647 Tj 0 -370.2411 Td (6486 if\(c != 0 && input.e-input.r < INPUT_BUF\){) 231.5313 Tj 0 -379.7344 Td (6487 input.buf[input.e++ % INPUT_BUF] = c;) 218.4257 Tj 0 -389.2278 Td (6488 cons_putc\(c\);) 113.5814 Tj 0 -398.7211 Td (6489 if\(c == '\\n' || c == C\('D'\) || input.e == inpu\ t.r+INPUT_BUF\){) 323.2701 Tj 0 -408.2145 Td (6490 input.w = input.e;) 144.161 Tj 0 -417.7079 Td (6491 wakeup\(&input.r\);) 139.7925 Tj 0 -427.2012 Td (6492 }) 61.1592 Tj 0 -436.6946 Td (6493 }) 52.4222 Tj 0 -446.1879 Td (6494 break;) 74.2647 Tj 0 -455.6813 Td (6495 }) 43.6851 Tj 0 -465.1747 Td (6496 }) 34.9481 Tj 0 -474.668 Td (6497 release\(&input.lock\);) 122.3184 Tj 0 -484.1614 Td (6498 }) 26.2111 Tj 0 -493.6547 Td (6499 ) 21.8426 Tj 0 -522.1348 Td (Sheet 64) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 72 72 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/console.c Page 6) 174.7406 Tj 0 -28.4801 Td (6500 int) 34.9481 Tj 0 -37.9735 Td (6501 console_read\(struct inode *ip, char *dst, int n\)) 231.5313 Tj 0 -47.4668 Td (6502 {) 26.2111 Tj 0 -56.9602 Td (6503 uint target;) 83.0018 Tj 0 -66.4535 Td (6504 int c;) 56.7907 Tj 0 -75.9469 Td (6505 ) 21.8426 Tj 0 -85.4403 Td (6506 iunlock\(ip\);) 83.0018 Tj 0 -94.9336 Td (6507 target = n;) 78.6333 Tj 0 -104.427 Td (6508 acquire\(&input.lock\);) 122.3184 Tj 0 -113.9203 Td (6509 while\(n > 0\){) 87.3703 Tj 0 -123.4137 Td (6510 while\(input.r == input.w\){) 152.898 Tj 0 -132.9071 Td (6511 if\(cp->killed\){) 113.5814 Tj 0 -142.4004 Td (6512 release\(&input.lock\);) 148.5295 Tj 0 -151.8938 Td (6513 ilock\(ip\);) 100.4758 Tj 0 -161.3871 Td (6514 return -1;) 100.4758 Tj 0 -170.8805 Td (6515 }) 52.4222 Tj 0 -180.3739 Td (6516 sleep\(&input.r, &input.lock\);) 174.7406 Tj 0 -189.8672 Td (6517 }) 43.6851 Tj 0 -199.3606 Td (6518 c = input.buf[input.r++ % INPUT_BUF];) 200.9517 Tj 0 -208.8539 Td (6519 if\(c == C\('D'\)\){ // EOF) 144.161 Tj 0 -218.3473 Td (6520 if\(n < target\){) 113.5814 Tj 0 -227.8407 Td (6521 // Save ^D for next time, to make sure) 222.7942 Tj 0 -237.334 Td (6522 // caller gets a 0-byte result.) 192.2146 Tj 0 -246.8274 Td (6523 input.r--;) 100.4758 Tj 0 -256.3207 Td (6524 }) 52.4222 Tj 0 -265.8141 Td (6525 break;) 74.2647 Tj 0 -275.3075 Td (6526 }) 43.6851 Tj 0 -284.8008 Td (6527 *dst++ = c;) 87.3703 Tj 0 -294.2942 Td (6528 --n;) 56.7907 Tj 0 -303.7875 Td (6529 if\(c == '\\n'\)) 96.1073 Tj 0 -313.2809 Td (6530 break;) 74.2647 Tj 0 -322.7743 Td (6531 }) 34.9481 Tj 0 -332.2676 Td (6532 release\(&input.lock\);) 122.3184 Tj 0 -341.761 Td (6533 ilock\(ip\);) 74.2647 Tj 0 -351.2543 Td (6534 ) 21.8426 Tj 0 -360.7477 Td (6535 return target - n;) 109.2129 Tj 0 -370.2411 Td (6536 }) 26.2111 Tj 0 -379.7344 Td (6537 ) 21.8426 Tj 0 -389.2278 Td (6538 ) 21.8426 Tj 0 -398.7211 Td (6539 ) 21.8426 Tj 0 -408.2145 Td (6540 ) 21.8426 Tj 0 -417.7079 Td (6541 ) 21.8426 Tj 0 -427.2012 Td (6542 ) 21.8426 Tj 0 -436.6946 Td (6543 ) 21.8426 Tj 0 -446.1879 Td (6544 ) 21.8426 Tj 0 -455.6813 Td (6545 ) 21.8426 Tj 0 -465.1747 Td (6546 ) 21.8426 Tj 0 -474.668 Td (6547 ) 21.8426 Tj 0 -484.1614 Td (6548 ) 21.8426 Tj 0 -493.6547 Td (6549 ) 21.8426 Tj 0 -522.1348 Td (Sheet 65) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/console.c Page 7) 174.7406 Tj 0 -28.4801 Td (6550 void) 39.3166 Tj 0 -37.9735 Td (6551 console_init\(void\)) 100.4758 Tj 0 -47.4668 Td (6552 {) 26.2111 Tj 0 -56.9602 Td (6553 initlock\(&console_lock, "console"\);) 183.4776 Tj 0 -66.4535 Td (6554 initlock\(&input.lock, "console input"\);) 200.9517 Tj 0 -75.9469 Td (6555 ) 21.8426 Tj 0 -85.4403 Td (6556 devsw[CONSOLE].write = console_write;) 192.2146 Tj 0 -94.9336 Td (6557 devsw[CONSOLE].read = console_read;) 183.4776 Tj 0 -104.427 Td (6558 use_console_lock = 1;) 122.3184 Tj 0 -113.9203 Td (6559 ) 21.8426 Tj 0 -123.4137 Td (6560 pic_enable\(IRQ_KBD\);) 117.9499 Tj 0 -132.9071 Td (6561 ioapic_enable\(IRQ_KBD, 0\);) 144.161 Tj 0 -142.4004 Td (6562 }) 26.2111 Tj 0 -151.8938 Td (6563 ) 21.8426 Tj 0 -161.3871 Td (6564 void) 39.3166 Tj 0 -170.8805 Td (6565 panic\(char *s\)) 83.0018 Tj 0 -180.3739 Td (6566 {) 26.2111 Tj 0 -189.8672 Td (6567 int i;) 56.7907 Tj 0 -199.3606 Td (6568 uint pcs[10];) 87.3703 Tj 0 -208.8539 Td (6569 ) 21.8426 Tj 0 -218.3473 Td (6570 __asm __volatile\("cli"\);) 135.4239 Tj 0 -227.8407 Td (6571 use_console_lock = 0;) 122.3184 Tj 0 -237.334 Td (6572 cprintf\("cpu%d: panic: ", cpu\(\)\);) 174.7406 Tj 0 -246.8274 Td (6573 cprintf\(s\);) 78.6333 Tj 0 -256.3207 Td (6574 cprintf\("\\n"\);) 91.7388 Tj 0 -265.8141 Td (6575 getcallerpcs\(&s, pcs\);) 126.6869 Tj 0 -275.3075 Td (6576 for\(i=0; i<10; i++\)) 113.5814 Tj 0 -284.8008 Td (6577 cprintf\(" %p", pcs[i]\);) 139.7925 Tj 0 -294.2942 Td (6578 panicked = 1; // freeze other CPU) 174.7406 Tj 0 -303.7875 Td (6579 for\(;;\)) 61.1592 Tj 0 -313.2809 Td (6580 ;) 43.6851 Tj 0 -322.7743 Td (6581 }) 26.2111 Tj 0 -332.2676 Td (6582 ) 21.8426 Tj 0 -341.761 Td (6583 ) 21.8426 Tj 0 -351.2543 Td (6584 ) 21.8426 Tj 0 -360.7477 Td (6585 ) 21.8426 Tj 0 -370.2411 Td (6586 ) 21.8426 Tj 0 -379.7344 Td (6587 ) 21.8426 Tj 0 -389.2278 Td (6588 ) 21.8426 Tj 0 -398.7211 Td (6589 ) 21.8426 Tj 0 -408.2145 Td (6590 ) 21.8426 Tj 0 -417.7079 Td (6591 ) 21.8426 Tj 0 -427.2012 Td (6592 ) 21.8426 Tj 0 -436.6946 Td (6593 ) 21.8426 Tj 0 -446.1879 Td (6594 ) 21.8426 Tj 0 -455.6813 Td (6595 ) 21.8426 Tj 0 -465.1747 Td (6596 ) 21.8426 Tj 0 -474.668 Td (6597 ) 21.8426 Tj 0 -484.1614 Td (6598 ) 21.8426 Tj 0 -493.6547 Td (6599 ) 21.8426 Tj 0 -522.1348 Td (Sheet 65) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 73 73 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/timer.c Page 1) 166.0035 Tj 0 -28.4801 Td (6600 // Intel 8253/8254/82C54 Programmable Interval Timer \(PIT\ \).) 279.5849 Tj 0 -37.9735 Td (6601 // Only used on uniprocessors;) 152.898 Tj 0 -47.4668 Td (6602 // SMP machines use the local APIC timer.) 200.9517 Tj 0 -56.9602 Td (6603 ) 21.8426 Tj 0 -66.4535 Td (6604 #include "types.h") 100.4758 Tj 0 -75.9469 Td (6605 #include "defs.h") 96.1073 Tj 0 -85.4403 Td (6606 #include "traps.h") 100.4758 Tj 0 -94.9336 Td (6607 #include "x86.h") 91.7388 Tj 0 -104.427 Td (6608 ) 21.8426 Tj 0 -113.9203 Td (6609 #define IO_TIMER1 0x040 // 8253 Timer #1) 266.4794 Tj 0 -123.4137 Td (6610 ) 21.8426 Tj 0 -132.9071 Td (6611 // Frequency of all three count-down timers;) 214.0572 Tj 0 -142.4004 Td (6612 // \(TIMER_FREQ/freq\) is the appropriate count) 218.4257 Tj 0 -151.8938 Td (6613 // to generate a frequency of freq Hz.) 187.8461 Tj 0 -161.3871 Td (6614 ) 21.8426 Tj 0 -170.8805 Td (6615 #define TIMER_FREQ 1193182) 157.2665 Tj 0 -180.3739 Td (6616 #define TIMER_DIV\(x\) \(\(TIMER_FREQ+\(x\)/2\)/\(x\)\)) 231.5313 Tj 0 -189.8672 Td (6617 ) 21.8426 Tj 0 -199.3606 Td (6618 #define TIMER_MODE \(IO_TIMER1 + 3\) // timer mode po\ rt) 275.2164 Tj 0 -208.8539 Td (6619 #define TIMER_SEL0 0x00 // select counter 0) 244.6368 Tj 0 -218.3473 Td (6620 #define TIMER_RATEGEN 0x04 // mode 2, rate generator) 270.8479 Tj 0 -227.8407 Td (6621 #define TIMER_16BIT 0x30 // r/w counter 16 bits, LS\ B first) 305.796 Tj 0 -237.334 Td (6622 ) 21.8426 Tj 0 -246.8274 Td (6623 void) 39.3166 Tj 0 -256.3207 Td (6624 timer_init\(void\)) 91.7388 Tj 0 -265.8141 Td (6625 {) 26.2111 Tj 0 -275.3075 Td (6626 // Interrupt 100 times/sec.) 148.5295 Tj 0 -284.8008 Td (6627 outb\(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16B\ IT\);) 288.322 Tj 0 -294.2942 Td (6628 outb\(IO_TIMER1, TIMER_DIV\(100\) % 256\);) 196.5831 Tj 0 -303.7875 Td (6629 outb\(IO_TIMER1, TIMER_DIV\(100\) / 256\);) 196.5831 Tj 0 -313.2809 Td (6630 pic_enable\(IRQ_TIMER\);) 126.6869 Tj 0 -322.7743 Td (6631 }) 26.2111 Tj 0 -332.2676 Td (6632 ) 21.8426 Tj 0 -341.761 Td (6633 ) 21.8426 Tj 0 -351.2543 Td (6634 ) 21.8426 Tj 0 -360.7477 Td (6635 ) 21.8426 Tj 0 -370.2411 Td (6636 ) 21.8426 Tj 0 -379.7344 Td (6637 ) 21.8426 Tj 0 -389.2278 Td (6638 ) 21.8426 Tj 0 -398.7211 Td (6639 ) 21.8426 Tj 0 -408.2145 Td (6640 ) 21.8426 Tj 0 -417.7079 Td (6641 ) 21.8426 Tj 0 -427.2012 Td (6642 ) 21.8426 Tj 0 -436.6946 Td (6643 ) 21.8426 Tj 0 -446.1879 Td (6644 ) 21.8426 Tj 0 -455.6813 Td (6645 ) 21.8426 Tj 0 -465.1747 Td (6646 ) 21.8426 Tj 0 -474.668 Td (6647 ) 21.8426 Tj 0 -484.1614 Td (6648 ) 21.8426 Tj 0 -493.6547 Td (6649 ) 21.8426 Tj 0 -522.1348 Td (Sheet 66) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/timer.c Page 2) 166.0035 Tj 0 -28.4801 Td (6650 // Blank page) 78.6333 Tj 0 -37.9735 Td (6651 ) 21.8426 Tj 0 -47.4668 Td (6652 ) 21.8426 Tj 0 -56.9602 Td (6653 ) 21.8426 Tj 0 -66.4535 Td (6654 ) 21.8426 Tj 0 -75.9469 Td (6655 ) 21.8426 Tj 0 -85.4403 Td (6656 ) 21.8426 Tj 0 -94.9336 Td (6657 ) 21.8426 Tj 0 -104.427 Td (6658 ) 21.8426 Tj 0 -113.9203 Td (6659 ) 21.8426 Tj 0 -123.4137 Td (6660 ) 21.8426 Tj 0 -132.9071 Td (6661 ) 21.8426 Tj 0 -142.4004 Td (6662 ) 21.8426 Tj 0 -151.8938 Td (6663 ) 21.8426 Tj 0 -161.3871 Td (6664 ) 21.8426 Tj 0 -170.8805 Td (6665 ) 21.8426 Tj 0 -180.3739 Td (6666 ) 21.8426 Tj 0 -189.8672 Td (6667 ) 21.8426 Tj 0 -199.3606 Td (6668 ) 21.8426 Tj 0 -208.8539 Td (6669 ) 21.8426 Tj 0 -218.3473 Td (6670 ) 21.8426 Tj 0 -227.8407 Td (6671 ) 21.8426 Tj 0 -237.334 Td (6672 ) 21.8426 Tj 0 -246.8274 Td (6673 ) 21.8426 Tj 0 -256.3207 Td (6674 ) 21.8426 Tj 0 -265.8141 Td (6675 ) 21.8426 Tj 0 -275.3075 Td (6676 ) 21.8426 Tj 0 -284.8008 Td (6677 ) 21.8426 Tj 0 -294.2942 Td (6678 ) 21.8426 Tj 0 -303.7875 Td (6679 ) 21.8426 Tj 0 -313.2809 Td (6680 ) 21.8426 Tj 0 -322.7743 Td (6681 ) 21.8426 Tj 0 -332.2676 Td (6682 ) 21.8426 Tj 0 -341.761 Td (6683 ) 21.8426 Tj 0 -351.2543 Td (6684 ) 21.8426 Tj 0 -360.7477 Td (6685 ) 21.8426 Tj 0 -370.2411 Td (6686 ) 21.8426 Tj 0 -379.7344 Td (6687 ) 21.8426 Tj 0 -389.2278 Td (6688 ) 21.8426 Tj 0 -398.7211 Td (6689 ) 21.8426 Tj 0 -408.2145 Td (6690 ) 21.8426 Tj 0 -417.7079 Td (6691 ) 21.8426 Tj 0 -427.2012 Td (6692 ) 21.8426 Tj 0 -436.6946 Td (6693 ) 21.8426 Tj 0 -446.1879 Td (6694 ) 21.8426 Tj 0 -455.6813 Td (6695 ) 21.8426 Tj 0 -465.1747 Td (6696 ) 21.8426 Tj 0 -474.668 Td (6697 ) 21.8426 Tj 0 -484.1614 Td (6698 ) 21.8426 Tj 0 -493.6547 Td (6699 ) 21.8426 Tj 0 -522.1348 Td (Sheet 66) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 74 74 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/initcode.S Page 1) 179.1091 Tj 0 -28.4801 Td (6700 # Initial process execs /init.) 152.898 Tj 0 -37.9735 Td (6701 ) 21.8426 Tj 0 -47.4668 Td (6702 #include "syscall.h") 109.2129 Tj 0 -56.9602 Td (6703 #include "traps.h") 100.4758 Tj 0 -66.4535 Td (6704 ) 21.8426 Tj 0 -75.9469 Td (6705 # exec\(init, argv\)) 100.4758 Tj 0 -85.4403 Td (6706 .globl start) 74.2647 Tj 0 -94.9336 Td (6707 start:) 48.0537 Tj 0 -104.427 Td (6708 pushl $argv) 78.6333 Tj 0 -113.9203 Td (6709 pushl $init) 78.6333 Tj 0 -123.4137 Td (6710 pushl $0) 65.5277 Tj 0 -132.9071 Td (6711 movl $SYS_exec, %eax) 117.9499 Tj 0 -142.4004 Td (6712 int $T_SYSCALL) 91.7388 Tj 0 -151.8938 Td (6713 ) 21.8426 Tj 0 -161.3871 Td (6714 # for\(;;\) exit\(\);) 96.1073 Tj 0 -170.8805 Td (6715 exit:) 43.6851 Tj 0 -180.3739 Td (6716 movl $SYS_exit, %eax) 117.9499 Tj 0 -189.8672 Td (6717 int $T_SYSCALL) 91.7388 Tj 0 -199.3606 Td (6718 jmp exit) 65.5277 Tj 0 -208.8539 Td (6719 ) 21.8426 Tj 0 -218.3473 Td (6720 # char init[] = "/init\\0";) 135.4239 Tj 0 -227.8407 Td (6721 init:) 43.6851 Tj 0 -237.334 Td (6722 .string "/init\\0") 104.8443 Tj 0 -246.8274 Td (6723 ) 21.8426 Tj 0 -256.3207 Td (6724 # char *argv[] = { init, 0 };) 148.5295 Tj 0 -265.8141 Td (6725 .p2align 2) 65.5277 Tj 0 -275.3075 Td (6726 argv:) 43.6851 Tj 0 -284.8008 Td (6727 .long init) 74.2647 Tj 0 -294.2942 Td (6728 .long 0) 61.1592 Tj 0 -303.7875 Td (6729 ) 21.8426 Tj 0 -313.2809 Td (6730 ) 21.8426 Tj 0 -322.7743 Td (6731 ) 21.8426 Tj 0 -332.2676 Td (6732 ) 21.8426 Tj 0 -341.761 Td (6733 ) 21.8426 Tj 0 -351.2543 Td (6734 ) 21.8426 Tj 0 -360.7477 Td (6735 ) 21.8426 Tj 0 -370.2411 Td (6736 ) 21.8426 Tj 0 -379.7344 Td (6737 ) 21.8426 Tj 0 -389.2278 Td (6738 ) 21.8426 Tj 0 -398.7211 Td (6739 ) 21.8426 Tj 0 -408.2145 Td (6740 ) 21.8426 Tj 0 -417.7079 Td (6741 ) 21.8426 Tj 0 -427.2012 Td (6742 ) 21.8426 Tj 0 -436.6946 Td (6743 ) 21.8426 Tj 0 -446.1879 Td (6744 ) 21.8426 Tj 0 -455.6813 Td (6745 ) 21.8426 Tj 0 -465.1747 Td (6746 ) 21.8426 Tj 0 -474.668 Td (6747 ) 21.8426 Tj 0 -484.1614 Td (6748 ) 21.8426 Tj 0 -493.6547 Td (6749 ) 21.8426 Tj 0 -522.1348 Td (Sheet 67) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/init.c Page 1) 161.635 Tj 0 -28.4801 Td (6750 // init: The initial user-level program) 192.2146 Tj 0 -37.9735 Td (6751 ) 21.8426 Tj 0 -47.4668 Td (6752 #include "types.h") 100.4758 Tj 0 -56.9602 Td (6753 #include "stat.h") 96.1073 Tj 0 -66.4535 Td (6754 #include "user.h") 96.1073 Tj 0 -75.9469 Td (6755 #include "fcntl.h") 100.4758 Tj 0 -85.4403 Td (6756 ) 21.8426 Tj 0 -94.9336 Td (6757 char *sh_args[] = { "sh", 0 };) 152.898 Tj 0 -104.427 Td (6758 ) 21.8426 Tj 0 -113.9203 Td (6759 int) 34.9481 Tj 0 -123.4137 Td (6760 main\(void\)) 65.5277 Tj 0 -132.9071 Td (6761 {) 26.2111 Tj 0 -142.4004 Td (6762 int pid, wpid;) 91.7388 Tj 0 -151.8938 Td (6763 ) 21.8426 Tj 0 -161.3871 Td (6764 if\(open\("console", O_RDWR\) < 0\){) 170.3721 Tj 0 -170.8805 Td (6765 mknod\("console", 1, 1\);) 139.7925 Tj 0 -180.3739 Td (6766 open\("console", O_RDWR\);) 144.161 Tj 0 -189.8672 Td (6767 }) 34.9481 Tj 0 -199.3606 Td (6768 dup\(0\); // stdout) 109.2129 Tj 0 -208.8539 Td (6769 dup\(0\); // stderr) 109.2129 Tj 0 -218.3473 Td (6770 ) 21.8426 Tj 0 -227.8407 Td (6771 for\(;;\){) 65.5277 Tj 0 -237.334 Td (6772 printf\(1, "init: starting sh\\n"\);) 183.4776 Tj 0 -246.8274 Td (6773 pid = fork\(\);) 96.1073 Tj 0 -256.3207 Td (6774 if\(pid < 0\){) 91.7388 Tj 0 -265.8141 Td (6775 printf\(1, "init: fork failed\\n"\);) 192.2146 Tj 0 -275.3075 Td (6776 exit\(\);) 78.6333 Tj 0 -284.8008 Td (6777 }) 43.6851 Tj 0 -294.2942 Td (6778 if\(pid == 0\){) 96.1073 Tj 0 -303.7875 Td (6779 exec\("sh", sh_args\);) 135.4239 Tj 0 -313.2809 Td (6780 printf\(1, "init: exec sh failed\\n"\);) 205.3202 Tj 0 -322.7743 Td (6781 exit\(\);) 78.6333 Tj 0 -332.2676 Td (6782 }) 43.6851 Tj 0 -341.761 Td (6783 while\(\(wpid=wait\(\)\) >= 0 && wpid != pid\)) 214.0572 Tj 0 -351.2543 Td (6784 printf\(1, "zombie!\\n"\);) 148.5295 Tj 0 -360.7477 Td (6785 }) 34.9481 Tj 0 -370.2411 Td (6786 }) 26.2111 Tj 0 -379.7344 Td (6787 ) 21.8426 Tj 0 -389.2278 Td (6788 ) 21.8426 Tj 0 -398.7211 Td (6789 ) 21.8426 Tj 0 -408.2145 Td (6790 ) 21.8426 Tj 0 -417.7079 Td (6791 ) 21.8426 Tj 0 -427.2012 Td (6792 ) 21.8426 Tj 0 -436.6946 Td (6793 ) 21.8426 Tj 0 -446.1879 Td (6794 ) 21.8426 Tj 0 -455.6813 Td (6795 ) 21.8426 Tj 0 -465.1747 Td (6796 ) 21.8426 Tj 0 -474.668 Td (6797 ) 21.8426 Tj 0 -484.1614 Td (6798 ) 21.8426 Tj 0 -493.6547 Td (6799 ) 21.8426 Tj 0 -522.1348 Td (Sheet 67) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 75 75 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/usys.S Page 1) 161.635 Tj 0 -28.4801 Td (6800 #include "syscall.h") 109.2129 Tj 0 -37.9735 Td (6801 #include "traps.h") 100.4758 Tj 0 -47.4668 Td (6802 ) 21.8426 Tj 0 -56.9602 Td (6803 #define STUB\(name\) \\) 109.2129 Tj 0 -66.4535 Td (6804 .globl name; \\) 91.7388 Tj 0 -75.9469 Td (6805 name: \\) 61.1592 Tj 0 -85.4403 Td (6806 movl $SYS_ ## name, %eax; \\) 157.2665 Tj 0 -94.9336 Td (6807 int $T_SYSCALL; \\) 113.5814 Tj 0 -104.427 Td (6808 ret) 52.4222 Tj 0 -113.9203 Td (6809 ) 21.8426 Tj 0 -123.4137 Td (6810 STUB\(fork\)) 65.5277 Tj 0 -132.9071 Td (6811 STUB\(exit\)) 65.5277 Tj 0 -142.4004 Td (6812 STUB\(wait\)) 65.5277 Tj 0 -151.8938 Td (6813 STUB\(pipe\)) 65.5277 Tj 0 -161.3871 Td (6814 STUB\(read\)) 65.5277 Tj 0 -170.8805 Td (6815 STUB\(write\)) 69.8962 Tj 0 -180.3739 Td (6816 STUB\(close\)) 69.8962 Tj 0 -189.8672 Td (6817 STUB\(kill\)) 65.5277 Tj 0 -199.3606 Td (6818 STUB\(exec\)) 65.5277 Tj 0 -208.8539 Td (6819 STUB\(open\)) 65.5277 Tj 0 -218.3473 Td (6820 STUB\(mknod\)) 69.8962 Tj 0 -227.8407 Td (6821 STUB\(unlink\)) 74.2647 Tj 0 -237.334 Td (6822 STUB\(fstat\)) 69.8962 Tj 0 -246.8274 Td (6823 STUB\(link\)) 65.5277 Tj 0 -256.3207 Td (6824 STUB\(mkdir\)) 69.8962 Tj 0 -265.8141 Td (6825 STUB\(chdir\)) 69.8962 Tj 0 -275.3075 Td (6826 STUB\(dup\)) 61.1592 Tj 0 -284.8008 Td (6827 STUB\(getpid\)) 74.2647 Tj 0 -294.2942 Td (6828 STUB\(sbrk\)) 65.5277 Tj 0 -303.7875 Td (6829 STUB\(sleep\)) 69.8962 Tj 0 -313.2809 Td (6830 ) 21.8426 Tj 0 -322.7743 Td (6831 ) 21.8426 Tj 0 -332.2676 Td (6832 ) 21.8426 Tj 0 -341.761 Td (6833 ) 21.8426 Tj 0 -351.2543 Td (6834 ) 21.8426 Tj 0 -360.7477 Td (6835 ) 21.8426 Tj 0 -370.2411 Td (6836 ) 21.8426 Tj 0 -379.7344 Td (6837 ) 21.8426 Tj 0 -389.2278 Td (6838 ) 21.8426 Tj 0 -398.7211 Td (6839 ) 21.8426 Tj 0 -408.2145 Td (6840 ) 21.8426 Tj 0 -417.7079 Td (6841 ) 21.8426 Tj 0 -427.2012 Td (6842 ) 21.8426 Tj 0 -436.6946 Td (6843 ) 21.8426 Tj 0 -446.1879 Td (6844 ) 21.8426 Tj 0 -455.6813 Td (6845 ) 21.8426 Tj 0 -465.1747 Td (6846 ) 21.8426 Tj 0 -474.668 Td (6847 ) 21.8426 Tj 0 -484.1614 Td (6848 ) 21.8426 Tj 0 -493.6547 Td (6849 ) 21.8426 Tj 0 -522.1348 Td (Sheet 68) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sh.c Page 1) 152.898 Tj 0 -28.4801 Td (6850 // Shell.) 61.1592 Tj 0 -37.9735 Td (6851 ) 21.8426 Tj 0 -47.4668 Td (6852 #include "types.h") 100.4758 Tj 0 -56.9602 Td (6853 #include "user.h") 96.1073 Tj 0 -66.4535 Td (6854 #include "fcntl.h") 100.4758 Tj 0 -75.9469 Td (6855 ) 21.8426 Tj 0 -85.4403 Td (6856 // Parsed command representation) 161.635 Tj 0 -94.9336 Td (6857 #define EXEC 1) 87.3703 Tj 0 -104.427 Td (6858 #define REDIR 2) 87.3703 Tj 0 -113.9203 Td (6859 #define PIPE 3) 87.3703 Tj 0 -123.4137 Td (6860 #define LIST 4) 87.3703 Tj 0 -132.9071 Td (6861 #define BACK 5) 87.3703 Tj 0 -142.4004 Td (6862 ) 21.8426 Tj 0 -151.8938 Td (6863 #define MAXARGS 10) 100.4758 Tj 0 -161.3871 Td (6864 ) 21.8426 Tj 0 -170.8805 Td (6865 struct cmd {) 74.2647 Tj 0 -180.3739 Td (6866 int type;) 69.8962 Tj 0 -189.8672 Td (6867 };) 30.5796 Tj 0 -199.3606 Td (6868 ) 21.8426 Tj 0 -208.8539 Td (6869 struct execcmd {) 91.7388 Tj 0 -218.3473 Td (6870 int type;) 69.8962 Tj 0 -227.8407 Td (6871 char *argv[MAXARGS];) 117.9499 Tj 0 -237.334 Td (6872 char *eargv[MAXARGS];) 122.3184 Tj 0 -246.8274 Td (6873 };) 30.5796 Tj 0 -256.3207 Td (6874 ) 21.8426 Tj 0 -265.8141 Td (6875 struct redircmd {) 96.1073 Tj 0 -275.3075 Td (6876 int type;) 69.8962 Tj 0 -284.8008 Td (6877 struct cmd *cmd;) 100.4758 Tj 0 -294.2942 Td (6878 char *file;) 78.6333 Tj 0 -303.7875 Td (6879 char *efile;) 83.0018 Tj 0 -313.2809 Td (6880 int mode;) 69.8962 Tj 0 -322.7743 Td (6881 int fd;) 61.1592 Tj 0 -332.2676 Td (6882 };) 30.5796 Tj 0 -341.761 Td (6883 ) 21.8426 Tj 0 -351.2543 Td (6884 struct pipecmd {) 91.7388 Tj 0 -360.7477 Td (6885 int type;) 69.8962 Tj 0 -370.2411 Td (6886 struct cmd *left;) 104.8443 Tj 0 -379.7344 Td (6887 struct cmd *right;) 109.2129 Tj 0 -389.2278 Td (6888 };) 30.5796 Tj 0 -398.7211 Td (6889 ) 21.8426 Tj 0 -408.2145 Td (6890 struct listcmd {) 91.7388 Tj 0 -417.7079 Td (6891 int type;) 69.8962 Tj 0 -427.2012 Td (6892 struct cmd *left;) 104.8443 Tj 0 -436.6946 Td (6893 struct cmd *right;) 109.2129 Tj 0 -446.1879 Td (6894 };) 30.5796 Tj 0 -455.6813 Td (6895 ) 21.8426 Tj 0 -465.1747 Td (6896 struct backcmd {) 91.7388 Tj 0 -474.668 Td (6897 int type;) 69.8962 Tj 0 -484.1614 Td (6898 struct cmd *cmd;) 100.4758 Tj 0 -493.6547 Td (6899 };) 30.5796 Tj 0 -522.1348 Td (Sheet 68) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 76 76 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sh.c Page 2) 152.898 Tj 0 -28.4801 Td (6900 int fork1\(void\); // Fork but panics on failure.) 231.5313 Tj 0 -37.9735 Td (6901 void panic\(char*\);) 100.4758 Tj 0 -47.4668 Td (6902 struct cmd *parsecmd\(char*\);) 144.161 Tj 0 -56.9602 Td (6903 ) 21.8426 Tj 0 -66.4535 Td (6904 // Execute cmd. Never returns.) 157.2665 Tj 0 -75.9469 Td (6905 void) 39.3166 Tj 0 -85.4403 Td (6906 runcmd\(struct cmd *cmd\)) 122.3184 Tj 0 -94.9336 Td (6907 {) 26.2111 Tj 0 -104.427 Td (6908 int p[2];) 69.8962 Tj 0 -113.9203 Td (6909 struct backcmd *bcmd;) 122.3184 Tj 0 -123.4137 Td (6910 struct execcmd *ecmd;) 122.3184 Tj 0 -132.9071 Td (6911 struct listcmd *lcmd;) 122.3184 Tj 0 -142.4004 Td (6912 struct pipecmd *pcmd;) 122.3184 Tj 0 -151.8938 Td (6913 struct redircmd *rcmd;) 126.6869 Tj 0 -161.3871 Td (6914 ) 21.8426 Tj 0 -170.8805 Td (6915 if\(cmd == 0\)) 83.0018 Tj 0 -180.3739 Td (6916 exit\(\);) 69.8962 Tj 0 -189.8672 Td (6917 ) 21.8426 Tj 0 -199.3606 Td (6918 switch\(cmd->type\){) 109.2129 Tj 0 -208.8539 Td (6919 default:) 65.5277 Tj 0 -218.3473 Td (6920 panic\("runcmd"\);) 109.2129 Tj 0 -227.8407 Td (6921 ) 21.8426 Tj 0 -237.334 Td (6922 case EXEC:) 74.2647 Tj 0 -246.8274 Td (6923 ecmd = \(struct execcmd*\)cmd;) 161.635 Tj 0 -256.3207 Td (6924 if\(ecmd->argv[0] == 0\)) 135.4239 Tj 0 -265.8141 Td (6925 exit\(\);) 78.6333 Tj 0 -275.3075 Td (6926 exec\(ecmd->argv[0], ecmd->argv\);) 179.1091 Tj 0 -284.8008 Td (6927 printf\(2, "exec %s failed\\n", ecmd->argv[0]\);) 235.8998 Tj 0 -294.2942 Td (6928 break;) 65.5277 Tj 0 -303.7875 Td (6929 ) 21.8426 Tj 0 -313.2809 Td (6930 case REDIR:) 78.6333 Tj 0 -322.7743 Td (6931 rcmd = \(struct redircmd*\)cmd;) 166.0035 Tj 0 -332.2676 Td (6932 close\(rcmd->fd\);) 109.2129 Tj 0 -341.761 Td (6933 if\(open\(rcmd->file, rcmd->mode\) < 0\){) 200.9517 Tj 0 -351.2543 Td (6934 printf\(2, "open %s failed\\n", rcmd->file\);) 231.5313 Tj 0 -360.7477 Td (6935 exit\(\);) 78.6333 Tj 0 -370.2411 Td (6936 }) 43.6851 Tj 0 -379.7344 Td (6937 runcmd\(rcmd->cmd\);) 117.9499 Tj 0 -389.2278 Td (6938 break;) 65.5277 Tj 0 -398.7211 Td (6939 ) 21.8426 Tj 0 -408.2145 Td (6940 case LIST:) 74.2647 Tj 0 -417.7079 Td (6941 lcmd = \(struct listcmd*\)cmd;) 161.635 Tj 0 -427.2012 Td (6942 if\(fork1\(\) == 0\)) 109.2129 Tj 0 -436.6946 Td (6943 runcmd\(lcmd->left\);) 131.0554 Tj 0 -446.1879 Td (6944 wait\(\);) 69.8962 Tj 0 -455.6813 Td (6945 runcmd\(lcmd->right\);) 126.6869 Tj 0 -465.1747 Td (6946 break;) 65.5277 Tj 0 -474.668 Td (6947 ) 21.8426 Tj 0 -484.1614 Td (6948 ) 21.8426 Tj 0 -493.6547 Td (6949 ) 21.8426 Tj 0 -522.1348 Td (Sheet 69) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sh.c Page 3) 152.898 Tj 0 -28.4801 Td (6950 case PIPE:) 74.2647 Tj 0 -37.9735 Td (6951 pcmd = \(struct pipecmd*\)cmd;) 161.635 Tj 0 -47.4668 Td (6952 if\(pipe\(p\) < 0\)) 104.8443 Tj 0 -56.9602 Td (6953 panic\("pipe"\);) 109.2129 Tj 0 -66.4535 Td (6954 if\(fork1\(\) == 0\){) 113.5814 Tj 0 -75.9469 Td (6955 close\(1\);) 87.3703 Tj 0 -85.4403 Td (6956 dup\(p[1]\);) 91.7388 Tj 0 -94.9336 Td (6957 close\(p[0]\);) 100.4758 Tj 0 -104.427 Td (6958 close\(p[1]\);) 100.4758 Tj 0 -113.9203 Td (6959 runcmd\(pcmd->left\);) 131.0554 Tj 0 -123.4137 Td (6960 }) 43.6851 Tj 0 -132.9071 Td (6961 if\(fork1\(\) == 0\){) 113.5814 Tj 0 -142.4004 Td (6962 close\(0\);) 87.3703 Tj 0 -151.8938 Td (6963 dup\(p[0]\);) 91.7388 Tj 0 -161.3871 Td (6964 close\(p[0]\);) 100.4758 Tj 0 -170.8805 Td (6965 close\(p[1]\);) 100.4758 Tj 0 -180.3739 Td (6966 runcmd\(pcmd->right\);) 135.4239 Tj 0 -189.8672 Td (6967 }) 43.6851 Tj 0 -199.3606 Td (6968 close\(p[0]\);) 91.7388 Tj 0 -208.8539 Td (6969 close\(p[1]\);) 91.7388 Tj 0 -218.3473 Td (6970 wait\(\);) 69.8962 Tj 0 -227.8407 Td (6971 wait\(\);) 69.8962 Tj 0 -237.334 Td (6972 break;) 65.5277 Tj 0 -246.8274 Td (6973 ) 21.8426 Tj 0 -256.3207 Td (6974 case BACK:) 74.2647 Tj 0 -265.8141 Td (6975 bcmd = \(struct backcmd*\)cmd;) 161.635 Tj 0 -275.3075 Td (6976 if\(fork1\(\) == 0\)) 109.2129 Tj 0 -284.8008 Td (6977 runcmd\(bcmd->cmd\);) 126.6869 Tj 0 -294.2942 Td (6978 break;) 65.5277 Tj 0 -303.7875 Td (6979 }) 34.9481 Tj 0 -313.2809 Td (6980 exit\(\);) 61.1592 Tj 0 -322.7743 Td (6981 }) 26.2111 Tj 0 -332.2676 Td (6982 ) 21.8426 Tj 0 -341.761 Td (6983 int) 34.9481 Tj 0 -351.2543 Td (6984 getcmd\(char *buf, int nbuf\)) 139.7925 Tj 0 -360.7477 Td (6985 {) 26.2111 Tj 0 -370.2411 Td (6986 printf\(2, "$ "\);) 100.4758 Tj 0 -379.7344 Td (6987 memset\(buf, 0, nbuf\);) 122.3184 Tj 0 -389.2278 Td (6988 gets\(buf, nbuf\);) 100.4758 Tj 0 -398.7211 Td (6989 if\(buf[0] == 0\) // EOF) 126.6869 Tj 0 -408.2145 Td (6990 return -1;) 83.0018 Tj 0 -417.7079 Td (6991 return 0;) 69.8962 Tj 0 -427.2012 Td (6992 }) 26.2111 Tj 0 -436.6946 Td (6993 ) 21.8426 Tj 0 -446.1879 Td (6994 ) 21.8426 Tj 0 -455.6813 Td (6995 ) 21.8426 Tj 0 -465.1747 Td (6996 ) 21.8426 Tj 0 -474.668 Td (6997 ) 21.8426 Tj 0 -484.1614 Td (6998 ) 21.8426 Tj 0 -493.6547 Td (6999 ) 21.8426 Tj 0 -522.1348 Td (Sheet 69) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 77 77 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sh.c Page 4) 152.898 Tj 0 -28.4801 Td (7000 int) 34.9481 Tj 0 -37.9735 Td (7001 main\(void\)) 65.5277 Tj 0 -47.4668 Td (7002 {) 26.2111 Tj 0 -56.9602 Td (7003 static char buf[100];) 122.3184 Tj 0 -66.4535 Td (7004 int fd;) 61.1592 Tj 0 -75.9469 Td (7005 ) 21.8426 Tj 0 -85.4403 Td (7006 // Assumes three file descriptors open.) 200.9517 Tj 0 -94.9336 Td (7007 while\(\(fd = open\("console", O_RDWR\)\) >= 0\){) 218.4257 Tj 0 -104.427 Td (7008 if\(fd >= 3\){) 91.7388 Tj 0 -113.9203 Td (7009 close\(fd\);) 91.7388 Tj 0 -123.4137 Td (7010 break;) 74.2647 Tj 0 -132.9071 Td (7011 }) 43.6851 Tj 0 -142.4004 Td (7012 }) 34.9481 Tj 0 -151.8938 Td (7013 ) 21.8426 Tj 0 -161.3871 Td (7014 // Read and run input commands.) 166.0035 Tj 0 -170.8805 Td (7015 while\(getcmd\(buf, sizeof\(buf\)\) >= 0\){) 192.2146 Tj 0 -180.3739 Td (7016 if\(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '\){) 266.4794 Tj 0 -189.8672 Td (7017 // Clumsy but will have to do for now.) 214.0572 Tj 0 -199.3606 Td (7018 // Chdir has no effect on the parent if run in the c\ hild.) 297.059 Tj 0 -208.8539 Td (7019 buf[strlen\(buf\)-1] = 0; // chop \\n) 200.9517 Tj 0 -218.3473 Td (7020 if\(chdir\(buf+3\) < 0\)) 135.4239 Tj 0 -227.8407 Td (7021 printf\(2, "cannot cd %s\\n", buf+3\);) 209.6887 Tj 0 -237.334 Td (7022 continue;) 87.3703 Tj 0 -246.8274 Td (7023 }) 43.6851 Tj 0 -256.3207 Td (7024 if\(fork1\(\) == 0\)) 109.2129 Tj 0 -265.8141 Td (7025 runcmd\(parsecmd\(buf\)\);) 144.161 Tj 0 -275.3075 Td (7026 wait\(\);) 69.8962 Tj 0 -284.8008 Td (7027 }) 34.9481 Tj 0 -294.2942 Td (7028 exit\(\);) 61.1592 Tj 0 -303.7875 Td (7029 }) 26.2111 Tj 0 -313.2809 Td (7030 ) 21.8426 Tj 0 -322.7743 Td (7031 void) 39.3166 Tj 0 -332.2676 Td (7032 panic\(char *s\)) 83.0018 Tj 0 -341.761 Td (7033 {) 26.2111 Tj 0 -351.2543 Td (7034 printf\(2, "%s\\n", s\);) 122.3184 Tj 0 -360.7477 Td (7035 exit\(\);) 61.1592 Tj 0 -370.2411 Td (7036 }) 26.2111 Tj 0 -379.7344 Td (7037 ) 21.8426 Tj 0 -389.2278 Td (7038 int) 34.9481 Tj 0 -398.7211 Td (7039 fork1\(void\)) 69.8962 Tj 0 -408.2145 Td (7040 {) 26.2111 Tj 0 -417.7079 Td (7041 int pid;) 65.5277 Tj 0 -427.2012 Td (7042 ) 21.8426 Tj 0 -436.6946 Td (7043 pid = fork\(\);) 87.3703 Tj 0 -446.1879 Td (7044 if\(pid == -1\)) 87.3703 Tj 0 -455.6813 Td (7045 panic\("fork"\);) 100.4758 Tj 0 -465.1747 Td (7046 return pid;) 78.6333 Tj 0 -474.668 Td (7047 }) 26.2111 Tj 0 -484.1614 Td (7048 ) 21.8426 Tj 0 -493.6547 Td (7049 ) 21.8426 Tj 0 -522.1348 Td (Sheet 70) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sh.c Page 5) 152.898 Tj 0 -28.4801 Td (7050 // Constructors) 87.3703 Tj 0 -37.9735 Td (7051 ) 21.8426 Tj 0 -47.4668 Td (7052 struct cmd*) 69.8962 Tj 0 -56.9602 Td (7053 execcmd\(void\)) 78.6333 Tj 0 -66.4535 Td (7054 {) 26.2111 Tj 0 -75.9469 Td (7055 struct execcmd *cmd;) 117.9499 Tj 0 -85.4403 Td (7056 ) 21.8426 Tj 0 -94.9336 Td (7057 cmd = malloc\(sizeof\(*cmd\)\);) 148.5295 Tj 0 -104.427 Td (7058 memset\(cmd, 0, sizeof\(*cmd\)\);) 157.2665 Tj 0 -113.9203 Td (7059 cmd->type = EXEC;) 104.8443 Tj 0 -123.4137 Td (7060 return \(struct cmd*\)cmd;) 135.4239 Tj 0 -132.9071 Td (7061 }) 26.2111 Tj 0 -142.4004 Td (7062 ) 21.8426 Tj 0 -151.8938 Td (7063 struct cmd*) 69.8962 Tj 0 -161.3871 Td (7064 redircmd\(struct cmd *subcmd, char *file, char *efile, int\ mode, int fd\)) 332.0071 Tj 0 -170.8805 Td (7065 {) 26.2111 Tj 0 -180.3739 Td (7066 struct redircmd *cmd;) 122.3184 Tj 0 -189.8672 Td (7067 ) 21.8426 Tj 0 -199.3606 Td (7068 cmd = malloc\(sizeof\(*cmd\)\);) 148.5295 Tj 0 -208.8539 Td (7069 memset\(cmd, 0, sizeof\(*cmd\)\);) 157.2665 Tj 0 -218.3473 Td (7070 cmd->type = REDIR;) 109.2129 Tj 0 -227.8407 Td (7071 cmd->cmd = subcmd;) 109.2129 Tj 0 -237.334 Td (7072 cmd->file = file;) 104.8443 Tj 0 -246.8274 Td (7073 cmd->efile = efile;) 113.5814 Tj 0 -256.3207 Td (7074 cmd->mode = mode;) 104.8443 Tj 0 -265.8141 Td (7075 cmd->fd = fd;) 87.3703 Tj 0 -275.3075 Td (7076 return \(struct cmd*\)cmd;) 135.4239 Tj 0 -284.8008 Td (7077 }) 26.2111 Tj 0 -294.2942 Td (7078 ) 21.8426 Tj 0 -303.7875 Td (7079 struct cmd*) 69.8962 Tj 0 -313.2809 Td (7080 pipecmd\(struct cmd *left, struct cmd *right\)) 214.0572 Tj 0 -322.7743 Td (7081 {) 26.2111 Tj 0 -332.2676 Td (7082 struct pipecmd *cmd;) 117.9499 Tj 0 -341.761 Td (7083 ) 21.8426 Tj 0 -351.2543 Td (7084 cmd = malloc\(sizeof\(*cmd\)\);) 148.5295 Tj 0 -360.7477 Td (7085 memset\(cmd, 0, sizeof\(*cmd\)\);) 157.2665 Tj 0 -370.2411 Td (7086 cmd->type = PIPE;) 104.8443 Tj 0 -379.7344 Td (7087 cmd->left = left;) 104.8443 Tj 0 -389.2278 Td (7088 cmd->right = right;) 113.5814 Tj 0 -398.7211 Td (7089 return \(struct cmd*\)cmd;) 135.4239 Tj 0 -408.2145 Td (7090 }) 26.2111 Tj 0 -417.7079 Td (7091 ) 21.8426 Tj 0 -427.2012 Td (7092 ) 21.8426 Tj 0 -436.6946 Td (7093 ) 21.8426 Tj 0 -446.1879 Td (7094 ) 21.8426 Tj 0 -455.6813 Td (7095 ) 21.8426 Tj 0 -465.1747 Td (7096 ) 21.8426 Tj 0 -474.668 Td (7097 ) 21.8426 Tj 0 -484.1614 Td (7098 ) 21.8426 Tj 0 -493.6547 Td (7099 ) 21.8426 Tj 0 -522.1348 Td (Sheet 70) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 78 78 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sh.c Page 6) 152.898 Tj 0 -28.4801 Td (7100 struct cmd*) 69.8962 Tj 0 -37.9735 Td (7101 listcmd\(struct cmd *left, struct cmd *right\)) 214.0572 Tj 0 -47.4668 Td (7102 {) 26.2111 Tj 0 -56.9602 Td (7103 struct listcmd *cmd;) 117.9499 Tj 0 -66.4535 Td (7104 ) 21.8426 Tj 0 -75.9469 Td (7105 cmd = malloc\(sizeof\(*cmd\)\);) 148.5295 Tj 0 -85.4403 Td (7106 memset\(cmd, 0, sizeof\(*cmd\)\);) 157.2665 Tj 0 -94.9336 Td (7107 cmd->type = LIST;) 104.8443 Tj 0 -104.427 Td (7108 cmd->left = left;) 104.8443 Tj 0 -113.9203 Td (7109 cmd->right = right;) 113.5814 Tj 0 -123.4137 Td (7110 return \(struct cmd*\)cmd;) 135.4239 Tj 0 -132.9071 Td (7111 }) 26.2111 Tj 0 -142.4004 Td (7112 ) 21.8426 Tj 0 -151.8938 Td (7113 struct cmd*) 69.8962 Tj 0 -161.3871 Td (7114 backcmd\(struct cmd *subcmd\)) 139.7925 Tj 0 -170.8805 Td (7115 {) 26.2111 Tj 0 -180.3739 Td (7116 struct backcmd *cmd;) 117.9499 Tj 0 -189.8672 Td (7117 ) 21.8426 Tj 0 -199.3606 Td (7118 cmd = malloc\(sizeof\(*cmd\)\);) 148.5295 Tj 0 -208.8539 Td (7119 memset\(cmd, 0, sizeof\(*cmd\)\);) 157.2665 Tj 0 -218.3473 Td (7120 cmd->type = BACK;) 104.8443 Tj 0 -227.8407 Td (7121 cmd->cmd = subcmd;) 109.2129 Tj 0 -237.334 Td (7122 return \(struct cmd*\)cmd;) 135.4239 Tj 0 -246.8274 Td (7123 }) 26.2111 Tj 0 -256.3207 Td (7124 ) 21.8426 Tj 0 -265.8141 Td (7125 ) 21.8426 Tj 0 -275.3075 Td (7126 ) 21.8426 Tj 0 -284.8008 Td (7127 ) 21.8426 Tj 0 -294.2942 Td (7128 ) 21.8426 Tj 0 -303.7875 Td (7129 ) 21.8426 Tj 0 -313.2809 Td (7130 ) 21.8426 Tj 0 -322.7743 Td (7131 ) 21.8426 Tj 0 -332.2676 Td (7132 ) 21.8426 Tj 0 -341.761 Td (7133 ) 21.8426 Tj 0 -351.2543 Td (7134 ) 21.8426 Tj 0 -360.7477 Td (7135 ) 21.8426 Tj 0 -370.2411 Td (7136 ) 21.8426 Tj 0 -379.7344 Td (7137 ) 21.8426 Tj 0 -389.2278 Td (7138 ) 21.8426 Tj 0 -398.7211 Td (7139 ) 21.8426 Tj 0 -408.2145 Td (7140 ) 21.8426 Tj 0 -417.7079 Td (7141 ) 21.8426 Tj 0 -427.2012 Td (7142 ) 21.8426 Tj 0 -436.6946 Td (7143 ) 21.8426 Tj 0 -446.1879 Td (7144 ) 21.8426 Tj 0 -455.6813 Td (7145 ) 21.8426 Tj 0 -465.1747 Td (7146 ) 21.8426 Tj 0 -474.668 Td (7147 ) 21.8426 Tj 0 -484.1614 Td (7148 ) 21.8426 Tj 0 -493.6547 Td (7149 ) 21.8426 Tj 0 -522.1348 Td (Sheet 71) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sh.c Page 7) 152.898 Tj 0 -28.4801 Td (7150 // Parsing) 65.5277 Tj 0 -37.9735 Td (7151 ) 21.8426 Tj 0 -47.4668 Td (7152 char whitespace[] = " \\t\\r\\n\\v";) 161.635 Tj 0 -56.9602 Td (7153 char symbols[] = "<|>&;\(\)";) 139.7925 Tj 0 -66.4535 Td (7154 ) 21.8426 Tj 0 -75.9469 Td (7155 int) 34.9481 Tj 0 -85.4403 Td (7156 gettoken\(char **ps, char *es, char **q, char **eq\)) 240.2683 Tj 0 -94.9336 Td (7157 {) 26.2111 Tj 0 -104.427 Td (7158 char *s;) 65.5277 Tj 0 -113.9203 Td (7159 int ret;) 65.5277 Tj 0 -123.4137 Td (7160 ) 21.8426 Tj 0 -132.9071 Td (7161 s = *ps;) 65.5277 Tj 0 -142.4004 Td (7162 while\(s < es && strchr\(whitespace, *s\)\)) 200.9517 Tj 0 -151.8938 Td (7163 s++;) 56.7907 Tj 0 -161.3871 Td (7164 if\(q\)) 52.4222 Tj 0 -170.8805 Td (7165 *q = s;) 69.8962 Tj 0 -180.3739 Td (7166 ret = *s;) 69.8962 Tj 0 -189.8672 Td (7167 switch\(*s\){) 78.6333 Tj 0 -199.3606 Td (7168 case 0:) 61.1592 Tj 0 -208.8539 Td (7169 break;) 65.5277 Tj 0 -218.3473 Td (7170 case '|':) 69.8962 Tj 0 -227.8407 Td (7171 case '\(':) 69.8962 Tj 0 -237.334 Td (7172 case '\)':) 69.8962 Tj 0 -246.8274 Td (7173 case ';':) 69.8962 Tj 0 -256.3207 Td (7174 case '&':) 69.8962 Tj 0 -265.8141 Td (7175 case '<':) 69.8962 Tj 0 -275.3075 Td (7176 s++;) 56.7907 Tj 0 -284.8008 Td (7177 break;) 65.5277 Tj 0 -294.2942 Td (7178 case '>':) 69.8962 Tj 0 -303.7875 Td (7179 s++;) 56.7907 Tj 0 -313.2809 Td (7180 if\(*s == '>'\){) 100.4758 Tj 0 -322.7743 Td (7181 ret = '+';) 91.7388 Tj 0 -332.2676 Td (7182 s++;) 65.5277 Tj 0 -341.761 Td (7183 }) 43.6851 Tj 0 -351.2543 Td (7184 break;) 65.5277 Tj 0 -360.7477 Td (7185 default:) 65.5277 Tj 0 -370.2411 Td (7186 ret = 'a';) 83.0018 Tj 0 -379.7344 Td (7187 while\(s < es && !strchr\(whitespace, *s\) && !strchr\(\ symbols, *s\)\)) 318.9016 Tj 0 -389.2278 Td (7188 s++;) 65.5277 Tj 0 -398.7211 Td (7189 break;) 65.5277 Tj 0 -408.2145 Td (7190 }) 34.9481 Tj 0 -417.7079 Td (7191 if\(eq\)) 56.7907 Tj 0 -427.2012 Td (7192 *eq = s;) 74.2647 Tj 0 -436.6946 Td (7193 ) 21.8426 Tj 0 -446.1879 Td (7194 while\(s < es && strchr\(whitespace, *s\)\)) 200.9517 Tj 0 -455.6813 Td (7195 s++;) 56.7907 Tj 0 -465.1747 Td (7196 *ps = s;) 65.5277 Tj 0 -474.668 Td (7197 return ret;) 78.6333 Tj 0 -484.1614 Td (7198 }) 26.2111 Tj 0 -493.6547 Td (7199 ) 21.8426 Tj 0 -522.1348 Td (Sheet 71) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 79 79 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sh.c Page 8) 152.898 Tj 0 -28.4801 Td (7200 int) 34.9481 Tj 0 -37.9735 Td (7201 peek\(char **ps, char *es, char *toks\)) 183.4776 Tj 0 -47.4668 Td (7202 {) 26.2111 Tj 0 -56.9602 Td (7203 char *s;) 65.5277 Tj 0 -66.4535 Td (7204 ) 21.8426 Tj 0 -75.9469 Td (7205 s = *ps;) 65.5277 Tj 0 -85.4403 Td (7206 while\(s < es && strchr\(whitespace, *s\)\)) 200.9517 Tj 0 -94.9336 Td (7207 s++;) 56.7907 Tj 0 -104.427 Td (7208 *ps = s;) 65.5277 Tj 0 -113.9203 Td (7209 return *s && strchr\(toks, *s\);) 161.635 Tj 0 -123.4137 Td (7210 }) 26.2111 Tj 0 -132.9071 Td (7211 ) 21.8426 Tj 0 -142.4004 Td (7212 struct cmd *parseline\(char**, char*\);) 183.4776 Tj 0 -151.8938 Td (7213 struct cmd *parsepipe\(char**, char*\);) 183.4776 Tj 0 -161.3871 Td (7214 struct cmd *parseexec\(char**, char*\);) 183.4776 Tj 0 -170.8805 Td (7215 struct cmd *nulterminate\(struct cmd*\);) 187.8461 Tj 0 -180.3739 Td (7216 ) 21.8426 Tj 0 -189.8672 Td (7217 struct cmd*) 69.8962 Tj 0 -199.3606 Td (7218 parsecmd\(char *s\)) 96.1073 Tj 0 -208.8539 Td (7219 {) 26.2111 Tj 0 -218.3473 Td (7220 char *es;) 69.8962 Tj 0 -227.8407 Td (7221 struct cmd *cmd;) 100.4758 Tj 0 -237.334 Td (7222 ) 21.8426 Tj 0 -246.8274 Td (7223 es = s + strlen\(s\);) 113.5814 Tj 0 -256.3207 Td (7224 cmd = parseline\(&s, es\);) 135.4239 Tj 0 -265.8141 Td (7225 peek\(&s, es, ""\);) 104.8443 Tj 0 -275.3075 Td (7226 if\(s != es\){) 83.0018 Tj 0 -284.8008 Td (7227 printf\(2, "leftovers: %s\\n", s\);) 179.1091 Tj 0 -294.2942 Td (7228 panic\("syntax"\);) 109.2129 Tj 0 -303.7875 Td (7229 }) 34.9481 Tj 0 -313.2809 Td (7230 nulterminate\(cmd\);) 109.2129 Tj 0 -322.7743 Td (7231 return cmd;) 78.6333 Tj 0 -332.2676 Td (7232 }) 26.2111 Tj 0 -341.761 Td (7233 ) 21.8426 Tj 0 -351.2543 Td (7234 struct cmd*) 69.8962 Tj 0 -360.7477 Td (7235 parseline\(char **ps, char *es\)) 152.898 Tj 0 -370.2411 Td (7236 {) 26.2111 Tj 0 -379.7344 Td (7237 struct cmd *cmd;) 100.4758 Tj 0 -389.2278 Td (7238 ) 21.8426 Tj 0 -398.7211 Td (7239 cmd = parsepipe\(ps, es\);) 135.4239 Tj 0 -408.2145 Td (7240 while\(peek\(ps, es, "&"\)\){) 139.7925 Tj 0 -417.7079 Td (7241 gettoken\(ps, es, 0, 0\);) 139.7925 Tj 0 -427.2012 Td (7242 cmd = backcmd\(cmd\);) 122.3184 Tj 0 -436.6946 Td (7243 }) 34.9481 Tj 0 -446.1879 Td (7244 if\(peek\(ps, es, ";"\)\){) 126.6869 Tj 0 -455.6813 Td (7245 gettoken\(ps, es, 0, 0\);) 139.7925 Tj 0 -465.1747 Td (7246 cmd = listcmd\(cmd, parseline\(ps, es\)\);) 205.3202 Tj 0 -474.668 Td (7247 }) 34.9481 Tj 0 -484.1614 Td (7248 return cmd;) 78.6333 Tj 0 -493.6547 Td (7249 }) 26.2111 Tj 0 -522.1348 Td (Sheet 72) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sh.c Page 9) 152.898 Tj 0 -28.4801 Td (7250 struct cmd*) 69.8962 Tj 0 -37.9735 Td (7251 parsepipe\(char **ps, char *es\)) 152.898 Tj 0 -47.4668 Td (7252 {) 26.2111 Tj 0 -56.9602 Td (7253 struct cmd *cmd;) 100.4758 Tj 0 -66.4535 Td (7254 ) 21.8426 Tj 0 -75.9469 Td (7255 cmd = parseexec\(ps, es\);) 135.4239 Tj 0 -85.4403 Td (7256 if\(peek\(ps, es, "|"\)\){) 126.6869 Tj 0 -94.9336 Td (7257 gettoken\(ps, es, 0, 0\);) 139.7925 Tj 0 -104.427 Td (7258 cmd = pipecmd\(cmd, parsepipe\(ps, es\)\);) 205.3202 Tj 0 -113.9203 Td (7259 }) 34.9481 Tj 0 -123.4137 Td (7260 return cmd;) 78.6333 Tj 0 -132.9071 Td (7261 }) 26.2111 Tj 0 -142.4004 Td (7262 ) 21.8426 Tj 0 -151.8938 Td (7263 struct cmd*) 69.8962 Tj 0 -161.3871 Td (7264 parseredirs\(struct cmd *cmd, char **ps, char *es\)) 235.8998 Tj 0 -170.8805 Td (7265 {) 26.2111 Tj 0 -180.3739 Td (7266 int tok;) 65.5277 Tj 0 -189.8672 Td (7267 char *q, *eq;) 87.3703 Tj 0 -199.3606 Td (7268 ) 21.8426 Tj 0 -208.8539 Td (7269 while\(peek\(ps, es, "<>"\)\){) 144.161 Tj 0 -218.3473 Td (7270 tok = gettoken\(ps, es, 0, 0\);) 166.0035 Tj 0 -227.8407 Td (7271 if\(gettoken\(ps, es, &q, &eq\) != 'a'\)) 196.5831 Tj 0 -237.334 Td (7272 panic\("missing file for redirection"\);) 214.0572 Tj 0 -246.8274 Td (7273 switch\(tok\){) 91.7388 Tj 0 -256.3207 Td (7274 case '<':) 78.6333 Tj 0 -265.8141 Td (7275 cmd = redircmd\(cmd, q, eq, O_RDONLY, 0\);) 222.7942 Tj 0 -275.3075 Td (7276 break;) 74.2647 Tj 0 -284.8008 Td (7277 case '>':) 78.6333 Tj 0 -294.2942 Td (7278 cmd = redircmd\(cmd, q, eq, O_WRONLY|O_CREATE, 1\);) 262.1109 Tj 0 -303.7875 Td (7279 break;) 74.2647 Tj 0 -313.2809 Td (7280 case '+': // >>) 109.2129 Tj 0 -322.7743 Td (7281 cmd = redircmd\(cmd, q, eq, O_WRONLY|O_CREATE, 1\);) 262.1109 Tj 0 -332.2676 Td (7282 break;) 74.2647 Tj 0 -341.761 Td (7283 }) 43.6851 Tj 0 -351.2543 Td (7284 }) 34.9481 Tj 0 -360.7477 Td (7285 return cmd;) 78.6333 Tj 0 -370.2411 Td (7286 }) 26.2111 Tj 0 -379.7344 Td (7287 ) 21.8426 Tj 0 -389.2278 Td (7288 ) 21.8426 Tj 0 -398.7211 Td (7289 ) 21.8426 Tj 0 -408.2145 Td (7290 ) 21.8426 Tj 0 -417.7079 Td (7291 ) 21.8426 Tj 0 -427.2012 Td (7292 ) 21.8426 Tj 0 -436.6946 Td (7293 ) 21.8426 Tj 0 -446.1879 Td (7294 ) 21.8426 Tj 0 -455.6813 Td (7295 ) 21.8426 Tj 0 -465.1747 Td (7296 ) 21.8426 Tj 0 -474.668 Td (7297 ) 21.8426 Tj 0 -484.1614 Td (7298 ) 21.8426 Tj 0 -493.6547 Td (7299 ) 21.8426 Tj 0 -522.1348 Td (Sheet 72) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Page: 80 80 %%BeginPageSetup %%PageOrientation: Landscape pdfStartPage 180 rotate -612 -792 translate 0 0 612 792 re W %%EndPageSetup [] 0 d 1 i 0 j 0 J 10 M 1 w /DeviceGray {} cs [0] sc /DeviceGray {} CS [0] SC false op false OP {} settransfer q q [0.1 0 0 0.1 0 0] cm q 180 3960 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 738.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sh.c Page 10) 157.2665 Tj 0 -28.4801 Td (7300 struct cmd*) 69.8962 Tj 0 -37.9735 Td (7301 parseblock\(char **ps, char *es\)) 157.2665 Tj 0 -47.4668 Td (7302 {) 26.2111 Tj 0 -56.9602 Td (7303 struct cmd *cmd;) 100.4758 Tj 0 -66.4535 Td (7304 ) 21.8426 Tj 0 -75.9469 Td (7305 if\(!peek\(ps, es, "\("\)\)) 126.6869 Tj 0 -85.4403 Td (7306 panic\("parseblock"\);) 126.6869 Tj 0 -94.9336 Td (7307 gettoken\(ps, es, 0, 0\);) 131.0554 Tj 0 -104.427 Td (7308 cmd = parseline\(ps, es\);) 135.4239 Tj 0 -113.9203 Td (7309 if\(!peek\(ps, es, "\)"\)\)) 126.6869 Tj 0 -123.4137 Td (7310 panic\("syntax - missing \)"\);) 161.635 Tj 0 -132.9071 Td (7311 gettoken\(ps, es, 0, 0\);) 131.0554 Tj 0 -142.4004 Td (7312 cmd = parseredirs\(cmd, ps, es\);) 166.0035 Tj 0 -151.8938 Td (7313 return cmd;) 78.6333 Tj 0 -161.3871 Td (7314 }) 26.2111 Tj 0 -170.8805 Td (7315 ) 21.8426 Tj 0 -180.3739 Td (7316 struct cmd*) 69.8962 Tj 0 -189.8672 Td (7317 parseexec\(char **ps, char *es\)) 152.898 Tj 0 -199.3606 Td (7318 {) 26.2111 Tj 0 -208.8539 Td (7319 char *q, *eq;) 87.3703 Tj 0 -218.3473 Td (7320 int tok, argc;) 91.7388 Tj 0 -227.8407 Td (7321 struct execcmd *cmd;) 117.9499 Tj 0 -237.334 Td (7322 struct cmd *ret;) 100.4758 Tj 0 -246.8274 Td (7323 ) 21.8426 Tj 0 -256.3207 Td (7324 if\(peek\(ps, es, "\("\)\)) 122.3184 Tj 0 -265.8141 Td (7325 return parseblock\(ps, es\);) 152.898 Tj 0 -275.3075 Td (7326 ) 21.8426 Tj 0 -284.8008 Td (7327 ret = execcmd\(\);) 100.4758 Tj 0 -294.2942 Td (7328 cmd = \(struct execcmd*\)ret;) 148.5295 Tj 0 -303.7875 Td (7329 ) 21.8426 Tj 0 -313.2809 Td (7330 argc = 0;) 69.8962 Tj 0 -322.7743 Td (7331 ret = parseredirs\(ret, ps, es\);) 166.0035 Tj 0 -332.2676 Td (7332 while\(!peek\(ps, es, "|\)&;"\)\){) 157.2665 Tj 0 -341.761 Td (7333 if\(\(tok=gettoken\(ps, es, &q, &eq\)\) == 0\)) 214.0572 Tj 0 -351.2543 Td (7334 break;) 74.2647 Tj 0 -360.7477 Td (7335 if\(tok != 'a'\)) 100.4758 Tj 0 -370.2411 Td (7336 panic\("syntax"\);) 117.9499 Tj 0 -379.7344 Td (7337 cmd->argv[argc] = q;) 126.6869 Tj 0 -389.2278 Td (7338 cmd->eargv[argc] = eq;) 135.4239 Tj 0 -398.7211 Td (7339 argc++;) 69.8962 Tj 0 -408.2145 Td (7340 if\(argc >= MAXARGS\)) 122.3184 Tj 0 -417.7079 Td (7341 panic\("too many args"\);) 148.5295 Tj 0 -427.2012 Td (7342 ret = parseredirs\(ret, ps, es\);) 174.7406 Tj 0 -436.6946 Td (7343 }) 34.9481 Tj 0 -446.1879 Td (7344 cmd->argv[argc] = 0;) 117.9499 Tj 0 -455.6813 Td (7345 cmd->eargv[argc] = 0;) 122.3184 Tj 0 -465.1747 Td (7346 return ret;) 78.6333 Tj 0 -474.668 Td (7347 }) 26.2111 Tj 0 -484.1614 Td (7348 ) 21.8426 Tj 0 -493.6547 Td (7349 ) 21.8426 Tj 0 -522.1348 Td (Sheet 73) 34.9481 Tj Q Q q 180 500 5760 3460 re W /DeviceGray {} CS [0] SC /DeviceGray {} cs [0] sc q [10 0 0 10 0 0] cm [1 0 0 1 0 0] Tm 0 0 Td [0 -0.9679 1 0 564.72 392.865] Tm 0 0 Td /F8_0 8.7022 Tf (Sep 3 10:05 2008 xv6/sh.c Page 11) 157.2665 Tj 0 -28.4801 Td (7350 // NUL-terminate all the counted strings.) 200.9517 Tj 0 -37.9735 Td (7351 struct cmd*) 69.8962 Tj 0 -47.4668 Td (7352 nulterminate\(struct cmd *cmd\)) 148.5295 Tj 0 -56.9602 Td (7353 {) 26.2111 Tj 0 -66.4535 Td (7354 int i;) 56.7907 Tj 0 -75.9469 Td (7355 struct backcmd *bcmd;) 122.3184 Tj 0 -85.4403 Td (7356 struct execcmd *ecmd;) 122.3184 Tj 0 -94.9336 Td (7357 struct listcmd *lcmd;) 122.3184 Tj 0 -104.427 Td (7358 struct pipecmd *pcmd;) 122.3184 Tj 0 -113.9203 Td (7359 struct redircmd *rcmd;) 126.6869 Tj 0 -123.4137 Td (7360 ) 21.8426 Tj 0 -132.9071 Td (7361 if\(cmd == 0\)) 83.0018 Tj 0 -142.4004 Td (7362 return 0;) 78.6333 Tj 0 -151.8938 Td (7363 ) 21.8426 Tj 0 -161.3871 Td (7364 switch\(cmd->type\){) 109.2129 Tj 0 -170.8805 Td (7365 case EXEC:) 74.2647 Tj 0 -180.3739 Td (7366 ecmd = \(struct execcmd*\)cmd;) 161.635 Tj 0 -189.8672 Td (7367 for\(i=0; ecmd->argv[i]; i++\)) 161.635 Tj 0 -199.3606 Td (7368 *ecmd->eargv[i] = 0;) 135.4239 Tj 0 -208.8539 Td (7369 break;) 65.5277 Tj 0 -218.3473 Td (7370 ) 21.8426 Tj 0 -227.8407 Td (7371 case REDIR:) 78.6333 Tj 0 -237.334 Td (7372 rcmd = \(struct redircmd*\)cmd;) 166.0035 Tj 0 -246.8274 Td (7373 nulterminate\(rcmd->cmd\);) 144.161 Tj 0 -256.3207 Td (7374 *rcmd->efile = 0;) 113.5814 Tj 0 -265.8141 Td (7375 break;) 65.5277 Tj 0 -275.3075 Td (7376 ) 21.8426 Tj 0 -284.8008 Td (7377 case PIPE:) 74.2647 Tj 0 -294.2942 Td (7378 pcmd = \(struct pipecmd*\)cmd;) 161.635 Tj 0 -303.7875 Td (7379 nulterminate\(pcmd->left\);) 148.5295 Tj 0 -313.2809 Td (7380 nulterminate\(pcmd->right\);) 152.898 Tj 0 -322.7743 Td (7381 break;) 65.5277 Tj 0 -332.2676 Td (7382 ) 21.8426 Tj 0 -341.761 Td (7383 case LIST:) 74.2647 Tj 0 -351.2543 Td (7384 lcmd = \(struct listcmd*\)cmd;) 161.635 Tj 0 -360.7477 Td (7385 nulterminate\(lcmd->left\);) 148.5295 Tj 0 -370.2411 Td (7386 nulterminate\(lcmd->right\);) 152.898 Tj 0 -379.7344 Td (7387 break;) 65.5277 Tj 0 -389.2278 Td (7388 ) 21.8426 Tj 0 -398.7211 Td (7389 case BACK:) 74.2647 Tj 0 -408.2145 Td (7390 bcmd = \(struct backcmd*\)cmd;) 161.635 Tj 0 -417.7079 Td (7391 nulterminate\(bcmd->cmd\);) 144.161 Tj 0 -427.2012 Td (7392 break;) 65.5277 Tj 0 -436.6946 Td (7393 }) 34.9481 Tj 0 -446.1879 Td (7394 return cmd;) 78.6333 Tj 0 -455.6813 Td (7395 }) 26.2111 Tj 0 -465.1747 Td (7396 ) 21.8426 Tj 0 -474.668 Td (7397 ) 21.8426 Tj 0 -484.1614 Td (7398 ) 21.8426 Tj 0 -493.6547 Td (7399 ) 21.8426 Tj 0 -522.1348 Td (Sheet 73) 34.9481 Tj Q Q Q Q showpage %%PageTrailer pdfEndPage %%Trailer end %%DocumentSuppliedResources: %%+ font YLWBJI+LucidaSans-Typewriter83 %%EOF