%!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; tot<n; tot+=m, off+=m, dst+=m\){) 214.0572 Tj
0 -208.8539 Td
(4119     bp = bread\(ip->dev, 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; tot<n; tot+=m, off+=m, src+=m\){) 214.0572 Tj
0 -208.8539 Td
(4169     bp = bread\(ip->dev, 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\); off<dp->size; 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<elf.phnum; i++, off+=sizeof\(\
ph\)\){) 288.322 Tj
0 -332.2676 Td
(5032     if\(readi\(ip, \(char*\)&ph, off, sizeof\(ph\)\) != si\
zeof\(ph\)\)) 283.9534 Tj
0 -341.761 Td
(5033       goto bad;) 87.3703 Tj
0 -351.2543 Td
(5034     if\(ph.type != ELF_PROG_LOAD\)) 161.635 Tj
0 -360.7477 Td
(5035       continue;) 87.3703 Tj
0 -370.2411 Td
(5036     if\(ph.memsz < ph.filesz\)) 144.161 Tj
0 -379.7344 Td
(5037       goto bad;) 87.3703 Tj
0 -389.2278 Td
(5038     sz += ph.memsz;) 104.8443 Tj
0 -398.7211 Td
(5039   }) 34.9481 Tj
0 -408.2145 Td
(5040 ) 21.8426 Tj
0 -417.7079 Td
(5041   // Arguments.) 87.3703 Tj
0 -427.2012 Td
(5042   arglen = 0;) 78.6333 Tj
0 -436.6946 Td
(5043   for\(argc=0; argv[argc]; argc++\)) 166.0035 Tj
0 -446.1879 Td
(5044     arglen += strlen\(argv[argc]\) + 1;) 183.4776 Tj
0 -455.6813 Td
(5045   arglen = \(arglen+3\) & ~3;) 139.7925 Tj
0 -465.1747 Td
(5046   sz += arglen + 4*\(argc+1\);) 144.161 Tj
0 -474.668 Td
(5047 ) 21.8426 Tj
0 -484.1614 Td
(5048   // Stack.) 69.8962 Tj
0 -493.6547 Td
(5049   sz += PAGE;) 78.6333 Tj
0 -522.1348 Td
(Sheet 50) 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/exec.c  Page 2) 161.635 Tj
0 -28.4801 Td
(5050   // Allocate program memory.) 148.5295 Tj
0 -37.9735 Td
(5051   sz = \(sz+PAGE-1\) & ~\(PAGE-1\);) 157.2665 Tj
0 -47.4668 Td
(5052   mem = kalloc\(sz\);) 104.8443 Tj
0 -56.9602 Td
(5053   if\(mem == 0\)) 83.0018 Tj
0 -66.4535 Td
(5054     goto bad;) 78.6333 Tj
0 -75.9469 Td
(5055   memset\(mem, 0, sz\);) 113.5814 Tj
0 -85.4403 Td
(5056 ) 21.8426 Tj
0 -94.9336 Td
(5057   // Load program into memory.) 152.898 Tj
0 -104.427 Td
(5058   for\(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof\(\
ph\)\){) 288.322 Tj
0 -113.9203 Td
(5059     if\(readi\(ip, \(char*\)&ph, off, sizeof\(ph\)\) != si\
zeof\(ph\)\)) 283.9534 Tj
0 -123.4137 Td
(5060       goto bad;) 87.3703 Tj
0 -132.9071 Td
(5061     if\(ph.type != ELF_PROG_LOAD\)) 161.635 Tj
0 -142.4004 Td
(5062       continue;) 87.3703 Tj
0 -151.8938 Td
(5063     if\(ph.va + ph.memsz > 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; i<len; i++\)) 117.9499 Tj
0 -322.7743 Td
(5531     sum += addr[i];) 104.8443 Tj
0 -332.2676 Td
(5532   return sum;) 78.6333 Tj
0 -341.761 Td
(5533 }) 26.2111 Tj
0 -351.2543 Td
(5534 ) 21.8426 Tj
0 -360.7477 Td
(5535 // Look for an MP structure in the len bytes at addr.) 253.3738 Tj
0 -370.2411 Td
(5536 static struct mp*) 96.1073 Tj
0 -379.7344 Td
(5537 mp_search1\(uchar *addr, int len\)) 161.635 Tj
0 -389.2278 Td
(5538 {) 26.2111 Tj
0 -398.7211 Td
(5539   uchar *e, *p;) 87.3703 Tj
0 -408.2145 Td
(5540 ) 21.8426 Tj
0 -417.7079 Td
(5541   e = addr+len;) 87.3703 Tj
0 -427.2012 Td
(5542   for\(p = addr; p < e; p += sizeof\(struct mp\)\)) 222.7942 Tj
0 -436.6946 Td
(5543     if\(memcmp\(p, "_MP_", 4\) == 0 && sum\(p, sizeof\(str\
uct mp\)\) == 0\)) 314.533 Tj
0 -446.1879 Td
(5544       return \(struct mp*\)p;) 139.7925 Tj
0 -455.6813 Td
(5545   return 0;) 69.8962 Tj
0 -465.1747 Td
(5546 }) 26.2111 Tj
0 -474.668 Td
(5547 ) 21.8426 Tj
0 -484.1614 Td
(5548 ) 21.8426 Tj
0 -493.6547 Td
(5549 ) 21.8426 Tj
0 -522.1348 Td
(Sheet 55) 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.c  Page 2) 152.898 Tj
0 -28.4801 Td
(5550 // Search for the MP Floating Pointer Structure, which acc\
ording to the) 332.0071 Tj
0 -37.9735 Td
(5551 // spec is in one of the following three locations:) 244.6368 Tj
0 -47.4668 Td
(5552 // 1\) in the first KB of the EBDA;) 170.3721 Tj
0 -56.9602 Td
(5553 // 2\) in the last KB of system base memory;) 209.6887 Tj
0 -66.4535 Td
(5554 // 3\) in the BIOS ROM between 0xE0000 and 0xFFFFF.) 240.2683 Tj
0 -75.9469 Td
(5555 static struct mp*) 96.1073 Tj
0 -85.4403 Td
(5556 mp_search\(void\)) 87.3703 Tj
0 -94.9336 Td
(5557 {) 26.2111 Tj
0 -104.427 Td
(5558   uchar *bda;) 78.6333 Tj
0 -113.9203 Td
(5559   uint p;) 61.1592 Tj
0 -123.4137 Td
(5560   struct mp *mp;) 91.7388 Tj
0 -132.9071 Td
(5561 ) 21.8426 Tj
0 -142.4004 Td
(5562   bda = \(uchar*\)0x400;) 117.9499 Tj
0 -151.8938 Td
(5563   if\(\(p = \(\(bda[0x0F]<<8\)|bda[0x0E]\) << 4\)\){) 214.0572 Tj
0 -161.3871 Td
(5564     if\(\(mp = mp_search1\(\(uchar*\)p, 1024\)\)\)) 205.3202 Tj
0 -170.8805 Td
(5565       return mp;) 91.7388 Tj
0 -180.3739 Td
(5566   } else {) 65.5277 Tj
0 -189.8672 Td
(5567     p = \(\(bda[0x14]<<8\)|bda[0x13]\)*1024;) 196.5831 Tj
0 -199.3606 Td
(5568     if\(\(mp = mp_search1\(\(uchar*\)p-1024, 1024\)\)\)) 227.1628 Tj
0 -208.8539 Td
(5569       return mp;) 91.7388 Tj
0 -218.3473 Td
(5570   }) 34.9481 Tj
0 -227.8407 Td
(5571   return mp_search1\(\(uchar*\)0xF0000, 0x10000\);) 222.7942 Tj
0 -237.334 Td
(5572 }) 26.2111 Tj
0 -246.8274 Td
(5573 ) 21.8426 Tj
0 -256.3207 Td
(5574 // Search for an MP configuration table.  For now,) 240.2683 Tj
0 -265.8141 Td
(5575 // don't accept the default configurations \(physaddr == 0\
\).) 279.5849 Tj
0 -275.3075 Td
(5576 // Check for correct signature, calculate the checksum and\
,) 279.5849 Tj
0 -284.8008 Td
(5577 // if correct, check the version.) 166.0035 Tj
0 -294.2942 Td
(5578 // To do: check extended table checksum.) 196.5831 Tj
0 -303.7875 Td
(5579 static struct mpconf*) 113.5814 Tj
0 -313.2809 Td
(5580 mp_config\(struct mp **pmp\)) 135.4239 Tj
0 -322.7743 Td
(5581 {) 26.2111 Tj
0 -332.2676 Td
(5582   struct mpconf *conf;) 117.9499 Tj
0 -341.761 Td
(5583   struct mp *mp;) 91.7388 Tj
0 -351.2543 Td
(5584 ) 21.8426 Tj
0 -360.7477 Td
(5585   if\(\(mp = mp_search\(\)\) == 0 || mp->physaddr == 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; p<e; \){) 292.6905 Tj
0 -189.8672 Td
(5617     switch\(*p\){) 87.3703 Tj
0 -199.3606 Td
(5618     case MPPROC:) 91.7388 Tj
0 -208.8539 Td
(5619       proc = \(struct mpproc*\)p;) 157.2665 Tj
0 -218.3473 Td
(5620       cpus[ncpu].apicid = proc->apicid;) 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<<IRQ_SLAVE\);) 235.8998 Tj
0 -170.8805 Td
(5965 ) 21.8426 Tj
0 -180.3739 Td
(5966 static void) 69.8962 Tj
0 -189.8672 Td
(5967 pic_setmask\(ushort mask\)) 126.6869 Tj
0 -199.3606 Td
(5968 {) 26.2111 Tj
0 -208.8539 Td
(5969   irqmask = mask;) 96.1073 Tj
0 -218.3473 Td
(5970   outb\(IO_PIC1+1, mask\);) 126.6869 Tj
0 -227.8407 Td
(5971   outb\(IO_PIC2+1, mask >> 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<<irq\)\);) 174.7406 Tj
0 -294.2942 Td
(5978 }) 26.2111 Tj
0 -303.7875 Td
(5979 ) 21.8426 Tj
0 -313.2809 Td
(5980 // Initialize the 8259A interrupt controllers.) 222.7942 Tj
0 -322.7743 Td
(5981 void) 39.3166 Tj
0 -332.2676 Td
(5982 pic_init\(void\)) 83.0018 Tj
0 -341.761 Td
(5983 {) 26.2111 Tj
0 -351.2543 Td
(5984   // mask all interrupts) 126.6869 Tj
0 -360.7477 Td
(5985   outb\(IO_PIC1+1, 0xFF\);) 126.6869 Tj
0 -370.2411 Td
(5986   outb\(IO_PIC2+1, 0xFF\);) 126.6869 Tj
0 -379.7344 Td
(5987 ) 21.8426 Tj
0 -389.2278 Td
(5988   // Set up master \(8259A-1\)) 144.161 Tj
0 -398.7211 Td
(5989 ) 21.8426 Tj
0 -408.2145 Td
(5990   // ICW1:  0001g0hi) 109.2129 Tj
0 -417.7079 Td
(5991   //    g:  0 = edge triggering, 1 = level triggering) 253.3738 Tj
0 -427.2012 Td
(5992   //    h:  0 = cascaded PICs, 1 = master only) 222.7942 Tj
0 -436.6946 Td
(5993   //    i:  0 = no ICW4, 1 = ICW4 required) 205.3202 Tj
0 -446.1879 Td
(5994   outb\(IO_PIC1, 0x11\);) 117.9499 Tj
0 -455.6813 Td
(5995 ) 21.8426 Tj
0 -465.1747 Td
(5996   // ICW2:  Vector offset) 131.0554 Tj
0 -474.668 Td
(5997   outb\(IO_PIC1+1, IRQ_OFFSET\);) 152.898 Tj
0 -484.1614 Td
(5998 ) 21.8426 Tj
0 -493.6547 Td
(5999 ) 21.8426 Tj
0 -522.1348 Td
(Sheet 59) 34.9481 Tj
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 67 67
%%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/picirq.c  Page 2) 170.3721 Tj
0 -28.4801 Td
(6000   // ICW3:  \(master PIC\) bit mask of IR lines connected \
to slaves) 305.796 Tj
0 -37.9735 Td
(6001   //        \(slave PIC\) 3-bit # of slave's connection to\
 master) 297.059 Tj
0 -47.4668 Td
(6002   outb\(IO_PIC1+1, 1<<IRQ_SLAVE\);) 161.635 Tj
0 -56.9602 Td
(6003 ) 21.8426 Tj
0 -66.4535 Td
(6004   // ICW4:  000nbmap) 109.2129 Tj
0 -75.9469 Td
(6005   //    n:  1 = special fully nested mode) 200.9517 Tj
0 -85.4403 Td
(6006   //    b:  1 = buffered mode) 148.5295 Tj
0 -94.9336 Td
(6007   //    m:  0 = slave PIC, 1 = master PIC) 200.9517 Tj
0 -104.427 Td
(6008   //      \(ignored when b is 0, as the master/slave role) 266.4794 Tj
0 -113.9203 Td
(6009   //      can be hardwired\).) 144.161 Tj
0 -123.4137 Td
(6010   //    a:  1 = Automatic EOI mode) 170.3721 Tj
0 -132.9071 Td
(6011   //    p:  0 = MCS-80/85 mode, 1 = intel x86 mode) 240.2683 Tj
0 -142.4004 Td
(6012   outb\(IO_PIC1+1, 0x3\);) 122.3184 Tj
0 -151.8938 Td
(6013 ) 21.8426 Tj
0 -161.3871 Td
(6014   // Set up slave \(8259A-2\)) 139.7925 Tj
0 -170.8805 Td
(6015   outb\(IO_PIC2, 0x11\);                  // ICW1) 227.1628 Tj
0 -180.3739 Td
(6016   outb\(IO_PIC2+1, IRQ_OFFSET + 8\);      // ICW2) 227.1628 Tj
0 -189.8672 Td
(6017   outb\(IO_PIC2+1, IRQ_SLAVE\);           // ICW3) 227.1628 Tj
0 -199.3606 Td
(6018   // NB Automatic EOI mode doesn't tend to work on the sla\
ve.) 288.322 Tj
0 -208.8539 Td
(6019   // Linux source code says it's "to be investigated".) 257.7424 Tj
0 -218.3473 Td
(6020   outb\(IO_PIC2+1, 0x3\);                 // ICW4) 227.1628 Tj
0 -227.8407 Td
(6021 ) 21.8426 Tj
0 -237.334 Td
(6022   // OCW3:  0ef01prs) 109.2129 Tj
0 -246.8274 Td
(6023   //   ef:  0x = NOP, 10 = clear specific mask, 11 = set s\
pecific mask) 327.6386 Tj
0 -256.3207 Td
(6024   //    p:  0 = no polling, 1 = polling mode) 214.0572 Tj
0 -265.8141 Td
(6025   //   rs:  0x = NOP, 10 = read IRR, 11 = read ISR) 240.2683 Tj
0 -275.3075 Td
(6026   outb\(IO_PIC1, 0x68\);             // clear specific mas\
k) 270.8479 Tj
0 -284.8008 Td
(6027   outb\(IO_PIC1, 0x0a\);             // read IRR by defaul\
t) 270.8479 Tj
0 -294.2942 Td
(6028 ) 21.8426 Tj
0 -303.7875 Td
(6029   outb\(IO_PIC2, 0x68\);             // OCW3) 205.3202 Tj
0 -313.2809 Td
(6030   outb\(IO_PIC2, 0x0a\);             // OCW3) 205.3202 Tj
0 -322.7743 Td
(6031 ) 21.8426 Tj
0 -332.2676 Td
(6032   if\(irqmask != 0xFFFF\)) 122.3184 Tj
0 -341.761 Td
(6033     pic_setmask\(irqmask\);) 131.0554 Tj
0 -351.2543 Td
(6034 }) 26.2111 Tj
0 -360.7477 Td
(6035 ) 21.8426 Tj
0 -370.2411 Td
(6036 ) 21.8426 Tj
0 -379.7344 Td
(6037 ) 21.8426 Tj
0 -389.2278 Td
(6038 ) 21.8426 Tj
0 -398.7211 Td
(6039 ) 21.8426 Tj
0 -408.2145 Td
(6040 ) 21.8426 Tj
0 -417.7079 Td
(6041 ) 21.8426 Tj
0 -427.2012 Td
(6042 ) 21.8426 Tj
0 -436.6946 Td
(6043 ) 21.8426 Tj
0 -446.1879 Td
(6044 ) 21.8426 Tj
0 -455.6813 Td
(6045 ) 21.8426 Tj
0 -465.1747 Td
(6046 ) 21.8426 Tj
0 -474.668 Td
(6047 ) 21.8426 Tj
0 -484.1614 Td
(6048 ) 21.8426 Tj
0 -493.6547 Td
(6049 ) 21.8426 Tj
0 -522.1348 Td
(Sheet 60) 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 1) 157.2665 Tj
0 -28.4801 Td
(6050 // PC keyboard interface constants) 170.3721 Tj
0 -37.9735 Td
(6051 ) 21.8426 Tj
0 -47.4668 Td
(6052 #define KBSTATP         0x64    // kbd controller status p\
ort\(I\)) 301.4275 Tj
0 -56.9602 Td
(6053 #define KBS_DIB         0x01    // kbd data in buffer) 253.3738 Tj
0 -66.4535 Td
(6054 #define KBDATAP         0x60    // kbd data port\(I\)) 244.6368 Tj
0 -75.9469 Td
(6055 ) 21.8426 Tj
0 -85.4403 Td
(6056 #define NO              0) 131.0554 Tj
0 -94.9336 Td
(6057 ) 21.8426 Tj
0 -104.427 Td
(6058 #define SHIFT           \(1<<0\)) 152.898 Tj
0 -113.9203 Td
(6059 #define CTL             \(1<<1\)) 152.898 Tj
0 -123.4137 Td
(6060 #define ALT             \(1<<2\)) 152.898 Tj
0 -132.9071 Td
(6061 ) 21.8426 Tj
0 -142.4004 Td
(6062 #define CAPSLOCK        \(1<<3\)) 152.898 Tj
0 -151.8938 Td
(6063 #define NUMLOCK         \(1<<4\)) 152.898 Tj
0 -161.3871 Td
(6064 #define SCROLLLOCK      \(1<<5\)) 152.898 Tj
0 -170.8805 Td
(6065 ) 21.8426 Tj
0 -180.3739 Td
(6066 #define E0ESC           \(1<<6\)) 152.898 Tj
0 -189.8672 Td
(6067 ) 21.8426 Tj
0 -199.3606 Td
(6068 // Special keycodes) 104.8443 Tj
0 -208.8539 Td
(6069 #define KEY_HOME        0xE0) 144.161 Tj
0 -218.3473 Td
(6070 #define KEY_END         0xE1) 144.161 Tj
0 -227.8407 Td
(6071 #define KEY_UP          0xE2) 144.161 Tj
0 -237.334 Td
(6072 #define KEY_DN          0xE3) 144.161 Tj
0 -246.8274 Td
(6073 #define KEY_LF          0xE4) 144.161 Tj
0 -256.3207 Td
(6074 #define KEY_RT          0xE5) 144.161 Tj
0 -265.8141 Td
(6075 #define KEY_PGUP        0xE6) 144.161 Tj
0 -275.3075 Td
(6076 #define KEY_PGDN        0xE7) 144.161 Tj
0 -284.8008 Td
(6077 #define KEY_INS         0xE8) 144.161 Tj
0 -294.2942 Td
(6078 #define KEY_DEL         0xE9) 144.161 Tj
0 -303.7875 Td
(6079 ) 21.8426 Tj
0 -313.2809 Td
(6080 // C\('A'\) == Control-A) 117.9499 Tj
0 -322.7743 Td
(6081 #define C\(x\) \(x - '@'\)) 117.9499 Tj
0 -332.2676 Td
(6082 ) 21.8426 Tj
0 -341.761 Td
(6083 static uchar shiftcode[256] =) 148.5295 Tj
0 -351.2543 Td
(6084 {) 26.2111 Tj
0 -360.7477 Td
(6085   [0x1D] CTL,) 78.6333 Tj
0 -370.2411 Td
(6086   [0x2A] SHIFT,) 87.3703 Tj
0 -379.7344 Td
(6087   [0x36] SHIFT,) 87.3703 Tj
0 -389.2278 Td
(6088   [0x38] ALT,) 78.6333 Tj
0 -398.7211 Td
(6089   [0x9D] CTL,) 78.6333 Tj
0 -408.2145 Td
(6090   [0xB8] ALT) 74.2647 Tj
0 -417.7079 Td
(6091 };) 30.5796 Tj
0 -427.2012 Td
(6092 ) 21.8426 Tj
0 -436.6946 Td
(6093 static uchar togglecode[256] =) 152.898 Tj
0 -446.1879 Td
(6094 {) 26.2111 Tj
0 -455.6813 Td
(6095   [0x3A] CAPSLOCK,) 100.4758 Tj
0 -465.1747 Td
(6096   [0x45] NUMLOCK,) 96.1073 Tj
0 -474.668 Td
(6097   [0x46] SCROLLLOCK) 104.8443 Tj
0 -484.1614 Td
(6098 };) 30.5796 Tj
0 -493.6547 Td
(6099 ) 21.8426 Tj
0 -522.1348 Td
(Sheet 60) 34.9481 Tj
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Page: 68 68
%%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.h  Page 2) 157.2665 Tj
0 -28.4801 Td
(6100 static uchar normalmap[256] =) 148.5295 Tj
0 -37.9735 Td
(6101 {) 26.2111 Tj
0 -47.4668 Td
(6102   NO,   0x1B, '1',  '2',  '3',  '4',  '5',  '6',  // 0x00) 270.8479 Tj
0 -56.9602 Td
(6103   '7',  '8',  '9',  '0',  '-',  '=',  '\\b', '\\t',) 235.8998 Tj
0 -66.4535 Td
(6104   'q',  'w',  'e',  'r',  't',  'y',  'u',  'i',  // 0x10) 270.8479 Tj
0 -75.9469 Td
(6105   'o',  'p',  '[',  ']',  '\\n', NO,   'a',  's',) 231.5313 Tj
0 -85.4403 Td
(6106   'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';',  // 0x20) 270.8479 Tj
0 -94.9336 Td
(6107   '\\'', '`',  NO,   '\\\\', 'z',  'x',  'c',  'v',) 231.5313 Tj
0 -104.427 Td
(6108   'b',  'n',  'm',  ',',  '.',  '/',  NO,   '*',  // 0x30) 270.8479 Tj
0 -113.9203 Td
(6109   NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO,) 227.1628 Tj
0 -123.4137 Td
(6110   NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40) 270.8479 Tj
0 -132.9071 Td
(6111   '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',) 231.5313 Tj
0 -142.4004 Td
(6112   '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50) 270.8479 Tj
0 -151.8938 Td
(6113   [0x9C] '\\n',      // KP_Enter) 157.2665 Tj
0 -161.3871 Td
(6114   [0xB5] '/',       // KP_Div) 148.5295 Tj
0 -170.8805 Td
(6115   [0xC8] KEY_UP,    [0xD0] KEY_DN,) 170.3721 Tj
0 -180.3739 Td
(6116   [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN,) 179.1091 Tj
0 -189.8672 Td
(6117   [0xCB] KEY_LF,    [0xCD] KEY_RT,) 170.3721 Tj
0 -199.3606 Td
(6118   [0x97] KEY_HOME,  [0xCF] KEY_END,) 174.7406 Tj
0 -208.8539 Td
(6119   [0xD2] KEY_INS,   [0xD3] KEY_DEL) 170.3721 Tj
0 -218.3473 Td
(6120 };) 30.5796 Tj
0 -227.8407 Td
(6121 ) 21.8426 Tj
0 -237.334 Td
(6122 static uchar shiftmap[256] =) 144.161 Tj
0 -246.8274 Td
(6123 {) 26.2111 Tj
0 -256.3207 Td
(6124   NO,   033,  '!',  '@',  '#',  '$',  '%',  '^',  // 0x00) 270.8479 Tj
0 -265.8141 Td
(6125   '&',  '*',  '\(',  '\)',  '_',  '+',  '\\b', '\\t',) 235.8998 Tj
0 -275.3075 Td
(6126   'Q',  'W',  'E',  'R',  'T',  'Y',  'U',  'I',  // 0x10) 270.8479 Tj
0 -284.8008 Td
(6127   'O',  'P',  '{',  '}',  '\\n', NO,   'A',  'S',) 231.5313 Tj
0 -294.2942 Td
(6128   'D',  'F',  'G',  'H',  'J',  'K',  'L',  ':',  // 0x20) 270.8479 Tj
0 -303.7875 Td
(6129   '"',  '~',  NO,   '|',  'Z',  'X',  'C',  'V',) 231.5313 Tj
0 -313.2809 Td
(6130   'B',  'N',  'M',  '<',  '>',  '?',  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