%!PS-Adobe-3.0
%%Creator: xpdf/pdftops 3.01
%%LanguageLevel: 2
%%DocumentSuppliedResources: (atend)
%%DocumentMedia: plain 612 792 0 () ()
%%BoundingBox: 0 0 612 792
%%Pages: 79
%%EndComments
%%BeginDefaults
%%PageMedia: plain
%%EndDefaults
%%BeginProlog
%%BeginResource: procset xpdf 3.01 0
/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
% 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
/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 axialCol sc
    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
    0 360 arc h f*
  } ifelse
} def
end
%%EndResource
%%EndProlog
%%BeginSetup
xpdf begin
%%BeginResource: font LucidaSans-Typewriter83
%!FontType1-1.0: 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 /LucidaSans-Typewriter83 def
/PaintType 0 def
/FontType 1 def
/FontMatrix [0.000833333 0 0 0.000833333 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
1E603A09B3061B66BB71AC1D2A232B5F2BC9481D7D44F334ACCBBF6538A439A3
FE8DA1ABE05931A20F8FC365A0F90C9A22578FEBDD03E4201D2887923DD20ED9
2F8F50AA500DE6414F5521ACCBBA45FBD55A4882C7485B52146BD36775948914
F8D5FB4C38AFAA25CC8946C7A7DBA010B186D6B5B07DA514976B3CC03535B838
7B3B0BE3D2A1813A3B406846433DF6235D79BA455E54E35184F42053C1FB0105
CDB7B017C5BF449CEF69EF7E7B143698D00B249BA50E98D198F29782A6B41D7B
1657972CE1B773E8F6BDF2F38627E3E254C1AB4B1BAF1E96EAECC19CD5885CC3
18BA21AC88B179CCD63EA17D817039FEFF575F828A888D366BCEA4F32B5E08B2
88464C27C4064DE920F98B8B350E8909D4E911609C781479D656DE0403B7A396
5037AFD507B87055E4C40B573D52B9DDA04D793623219B54DA3BB5E85FB9F38F
17AAE45F7BAFDDA475C914C30C626E51B3AC52AC2BB692DA805202931C39904E
C8DCFBF3A3816FD86144CFBAFFC5AED23CD770A772B3DE93AE3AA46D01B137F3
079DFBCD31CB35CED7AA81B518B6EF7EBB9DAB59EFDFEBC0E649AAC792DF01C1
F0DD981180E792CDD32DBCBAA0CE6897E0EAB4683038239A39BFFDC512570DC6
321D9BBED278C72D31CA21BEC6911C36873310E2E7FB57D97F25697D76B76FC9
E4D95B941ECDB8D0D9EF464325032DC37B344686C8F0CD35F07CBBC94A106148
62810B1BE1C3A617510410749ED1EEF9357C0A9D7D9282027993205C1ACF05FA
9E6147B29A5B864FE6EB6E4EE46EAE685CD7C64482CDAFAB9F8BAF6872DDA515
09ED15B9733598C9AFF4AECC9D55391AA1AFFAADCCEEF4F66A0C4AA25B87C8C5
FC9FE42F2DA51AC0AD6BB9F654F06EF095BE97E6B54DA5153F3CD25D637F4A6A
420025CF63ADFA7F7AF70DCC98C19973444AEF1B142552216B51617F1EAD9246
90B7C98B8EEA31C7F9CB2D674FF7E59810A33F935C83268ACD56BD0F30828FD5
231419642A62358DF745778D5136AD5F7C792394A095791C035580A45F821C35
22C1F9BA6581F5E6ED9C927831B044DD4B37C1ACE021244A7C9B27B779DB3805
C265D3D206FE79B571D84DC6CC9963E3820340C705BC6BCFAEFFB3902CD0D5B3
83E949A70EF1D3CC6F43DE4D4C353F6664F5C7AA76E2386FC870FBF675988DDA
37EC2E2D5B885191FA6A86AB5FCCF76A6451663B6B06AAC022E419520CDEFB20
459A5119EDE46B9E5B11095D514ED3C7E065068670CCB8492C0369E019A1E593
E74012A86291DD86ABD697BE589ED20C7FBA7D932381FA2202E441F24AD6C794
F2511FEFA77206A5AB961CCFA703A863091EF6134B394A33F698D61937EBD4AC
4EDE750831AE6502E7CF167512733AE03921CC5E79ABB9436FC6864C728237B5
207BAFAD710948E1DE008339EB0E74D210DB63177F83428C6642099254186EF3
5D10815BF66C3D39F983DB8BBF1D1F75496CE08603D6D0FE7D4A5E889C0FF14A
DDD66FFF11AA07760ABB80A1D97F5B2513CBC404E54E8E3B072343AB427E8547
596CE54741408AC24D20428990F191BB7995F952F3EC7429769FEEF9E9B0268B
7AFB6D1988672E75CBF43D07682C4500E5E590358976235A22385444AB887F87
58D841E64AAA34FA390A30A96357FE4BC1604116196F810DE5833F6538AC691E
394146C31B724E3C9F04D00A33D3D85570B2343AC21DB14B40732ECF9C9E1BC0
D2B627D84FD673E47A693B00F8E610840CE3519F7B5E0500CF9D7AC00C46E519
0C003743A733DDBC7C45504133B088C3D571168A1C8C9216759A86BE04C79B5F
24CF56F3C329980932C84270166F1385355DFAE46FE1FF755B92A37983B5FD76
949A8476FEF28ED491C38DD4B2A06798C710856EA01256BF3FC53D88551C3F11
BF3241B0989BD2944F3AEB99DB98C8E7B13A6EFA23288EB24381B8717B851E70
C4542F4879BFDE6E13F979C2ADE45FE4AA085F829BD6DDB6560362C050840B02
C798DCD4C7832CFB9774ED70E691D86D8A86A2010D1A948EAE8977787C2CAA76
02FBDA7F065632C681F5DAF2A33169C1DA952E530C87988A13740565CFA08AB2
6ECCCA8E16A45E53FBAF970ED68E4499B7ED3EACE0F280F5D292DB4707032758
3F97251D05DBDC7BF5FE4F6E71BA0EA3A2F3E324AB91828166EEA0C6EE595F14
9AC72C8E8B7E09C5F543D7B05463F6EA56C7492C5200D4DF9DB562C6E0725E07
3D7182AAC88C770F30129AE22AC5F7FCE82771459038E017E642A007BC31A09D
4435B6D4E9F8F8065906A55D8ACC1DCB85F7A29F3F9D6C5BC8D474578E4061D7
046F1DC5E005221FB7064AB74C801884A80358610F8BFDC093E109321CAD2550
393308C3343596DE9D1EA17FA96D9E9977FBA13642D8454CBD431637F023B5CF
8703EC37E0DC6297472BC9B43115222D6F15C143BC542B0A2A8F294D113BA00B
5B87D2BA2EB5A0FC6390A0F9339C91F176C8466769E931418B9376404C501E7F
10379A780E49D860FC6C8202491FBCFDE51FE3072D6183EA1084C39A2D3E018C
5DD75689B89841C0A125869B34189E5E840EB6B6278382629F7BA224A22754A9
649B44DE8CC27F09C15DEBB60BA7285E1CB9E1F0CD329281759581156CE88C3B
FB04313662155185B07F24E537234276086739F635CB180C16F94038E9C88BA1
1EB3A62AD61A1B4150610C91F62F9F64B4155E0619E10DA82D66C86C2FE3982A
4DD67D12F20E634157E04F3D39B8F07FD28FF4089FA6F05179116CE4543A3FFC
A91B41B80C259926962CA27EDAFAC6CFD0E58013FDCAE1295B61160D583F59F7
3C00DB237704F2F564F5AF4028720A7F1DB2CC528D7D9B6BF5D8105B3B54C265
929CFE89E57ED4B08FD41248EEF489F6C651A9AC76651B1275E1038E9B690652
C1B406AF9778E97BC80DE3D93174C2B9B582E078B9F9BAAAEAF67AA32AEB71A7
B673391D121D0E0D12760517916D459AFA9391702079E246407DC99D3D02CD51
F655AA30FC9BBEA16DF8197953B881E04D677592D70D7A3E2AD408D9470E5D58
E99EC5F2EAA2F28C658333A6956871F7F01A39D5802F52763C11178C4B6F9BF4
2381391D41C045DACB4621F380171B9AB04A1E16FF35FDCEC2936AC830A4645E
FBD7E8B702C39AF4BA6CD16AADB151FD42DBDF4E23A0365021F81B4774406242
8E106DC131F170397C20387B30FC73E6858340A9DBE603AEF4FF7C82B5625D63
F1C20BB5C80A17E98CBDD36B4C45A76D1713A5A3FB0400F64AD12A31CFCC1F96
2F81957D1AF253990DA80A5D2CDE29B8D24F3508D3F90190600909BD363BCCD6
9B69D8F6A9F2533B62A43CE479734AE4DDE7101187BBB0EA712F80A6AC31E7C6
6CB9392FF86C6648BF7C7884DE5F2D755D5AA88813E3C8257AC3F6CFCB748A78
403BCA49935A8BCC09C52459E92E4A908677CC48F780929FBAF8E4EB2B8472E1
E8603A2CA2106264AC860B8EB85A91239BFD401B0171620A79EC3C6520DAE462
5F0F69E99045D48DD92E1418FF4EF3CC338FEB2912C61FD39544E33D85B3F86E
F6C9AEB273B10E3F5B429432CCCE7DDD9848EB13D98681E8E1F3CDCEE8269811
A48EFA015E5EAB231C99AB6864C338DCAE61DB3EBF713D5B50DEE579D3907D8A
B9F4A73A436E6B63CA2E5E8B67B167F0457F81D67DFD616B757D3EEADABB04B4
10A309E404D3907CA96EE321E13600A57899231F5E277E716A0416927FD25711
4359F3642E74D74123E0A2276EA0F3F1FCC75260F56E683E2C55ED8B8CBFCC2F
D6DF2764591492F3065908A84BE711C5E3BA2329C775ADC9024945DE8C400FAE
6CDE3C51FBA4A95569B3EF6CF35B6DAA5A7F5C73BC84F200B38ABF60013310DF
960253DFA4379D5A3FC96A5C982D6D68A03603E920479402702AE888F682AB8B
F3569F16B323D877A7ABDC905FEFB3DC0C1132B6F924E05ADB0506F5615EAA37
83C066477D511C0F280EC5AA6AE297334B31D5B863279BE653B3F7F2405D3F10
008C3C8EBF6FF798407568DE82BA8003DD36BF2CF810B337F21D5239219FBE5F
2024F94BE1644D03C9A651CFCE355F9D49AA235C8847087F10C4F625FDAA6FF9
E56CFBAE5CCE73905AD829B351A49EFFA1F863C22CDF59DD2EF1A39802D907F2
53B22E02FEE6A2A98C23E1F212C536A59F22150E9BD7B02BDE693A3F09893836
607552A6B44915433B683881882ACCBEA20A21BDAA1CCA358E29E3BB13A44835
D95509EADB6FD4B14B400916E9A1374639B85DCCC938A35E64D3D5BB4F6813D9
0D63316ED052BB7D5C733A5FEF0F18D193E5C9854C0199B66AEB89D8E620E093
D5CB4DE6E00312B0DC5995DF91167A89BBB8410C4AE494004D67902101714EE8
8EE7B4EF096A14A1D5189C41260A7D163DA79328FD997250020E6DED6435B934
17DDBB6A4D6F5E3F1D315BB5AFBB320538CF3BCD60D9FA7BE2BB0FFECF889E2B
2CB825224EBB436BA04560AD1F3CCECDAECC1766577BFDCC0B6AFDC6129D3540
F98173E907574C582D757FAB72555864D18E3EE045A6D47B73C5714A4372345F
786825BE53684D1FA6479D89906563BE44A3552A94163DD7AF5D672F24A0D73E
AF0DF1DDFEF513C73EB0DF2524132B99820AFF80B3EE999CDA07C6A8D50D0BA6
FF8E302984628FA5D8500F8F2F6E4472CC4A439F19781EF0CA63738F5B1AFD3F
72EF6418D46673AB5B922119A1355F7FB0834E82E0C0C045CE524345E00B9FAE
17048D638D92B9550519290CE93CD789FCD57CDD38E95AB31FCC13F1ADD83A9E
460603BB7F82032008E72E0FC8B22DB3195E011D7CC67F24BB2095E125F815FE
07773BAAB462AF86BA31A80AED3944ACB38565FF5D029A94ADE79B6D5277A5B9
EE6B13D6B293AA37F8C604338B62CBB53D0EF7B1534DBA09A96285F6DA40C5D3
F075C44383350D81D0DBF0B712B71A810E818B5CD0E5F10F73839EF211266A1F
D44FA728BDB371491B412CB86467AC653B68CB2BE823A842EDDC390A27153540
69C2F61167AD196FF7437CAA9C35501700A1269C881CE6E6299D72FDBC478083
6AC84423A2F21836713E70804B897976F5E1B09FBD5F03BF67A973AE009817F6
7123D220B24FF1AF52684A775BB3087AE505A26B1932CB613D185F1D01EF69BA
10B9E4797BC341CA9ACB2FD2BCB4220293B5196BFA78EBA63648BC2EEC584C9C
E967E52D100C5F5441FC0C9F5D56D4FF03EB1277AD9BA2D2B7D1442C5C87D46E
B7D024CB9A3BDD65B8B010EB343BA8A76EF8E5EC6811692EB1DC0B6195B624E0
E416296B97F77AEBCAFBB8571B0A208881611F613E48BF2408500D27DF7EFCD6
0C8976CD9E4FF44288B8C06E6A615413D04D33CD2510B752FCF88CFD6C99A447
3268D81DC35DC48E342B9B900C6AB9269E563A7E91FFD4B77DED7C252D36F2F9
713C4B51524A7DBCF224929EAFD95627D4A5504A3DA8B34F427BE75CD03C5810
A72DDEEF62A1137C79841C159FC7D743DC046FD31A4199A63158B62C7C1022AF
5D07E4CC28E67CD3BFC91C48A11760263B4C309320DA8560C9A43DDD7EEE4532
96C2FDF054AE919DCA1A00402549E56A55CBBB5E0A1DCFD01D25ED33600471FA
05FD4371FD2FB1AA9D2C98B4D7BD59A01F85B4C7F3452797C8F118DC831AD655
06042662135431C2310DE546D2BEF1B2831215E7C8517D63B87EA71D3202938E
A1C98658C5366297A80BE635DAACAC441B212D592AEE3C608C460054D3992C86
EB6301AFBB4D0C9655C07D7402A96A20946F0DFD6CF6CCF0E28EA03747AD27EE
9CC964B2F3103C81D7FB5D93756FF05C6C5F5488A68A5A66D2ED24CF72FAA7D3
250111E99821015336B7694912A035849A35A5880DAC8B7CA0936F35470E4CF7
D007A045286FF0FC932B51AA00C3B7979E0A0C9BD8080CAA104119963606C7E2
63216E24F42AA45205D454F5479A90A85D38C51316DC51FAE4C4D9780719F0DD
513D6C3192BE8007E9819A364AF38BD27CB82FA02FEA92FE360A8A019BABAC29
88A7D867C6C4D83AD4B447F3641C004132E53963ACD7AEE574332CA6584F8F62
6F9C806CB698C8B3611AC29DD173285C8EE05AE4D2623BC1A102E81A20A2E086
B0FE38CCF8B771EA46C6DD9EB64CA70308E75F9870F45B769CAEA0C79F2242C0
0C084C059EA10A8B19D73A6D32F18B751C1777E1C045182FB0F55AAA3C512AA8
3A94927B2E15EB3A8E02FBCBA7BB91C7B86193D02B2236CF5E897EF78C910DFA
448245519BAB629D5AB46695E89B45A6D3FF7F31B36014BCCF2829C3807993E3
0AA0FC58E323E37E762A16DCD9942432B40B5E7F86C2C5FCB800BEEF48F4876F
936EA3EE6625E82A3444AF512C2C2A79F01B8445B6B6B50789FF111D66ABA715
2AD0145891E33883A8198168F6EAD23455BD413A89AC440EB9ED9E2FD063B616
AF9DA0254C823915295B41F11B51BB3D6FD3AE3A786A765F406CC8E8DC3A3A77
84724AC6B99D4C3FDAE00A9BA466A1A9483EDB52CF4A497CF7B976706C9047ED
98904C9C9E2C180704558B251B962231E1FA26AF69E7A76CA9A9F75493122C1F
721E1E9E66777F734BB45425A451CEDC82C01D53902F79511D8E3E09CFCED53C
44B0625DD281E8E7C710DE0AB402083BA08FEBFDA0DD92D561047C7C7C886901
C19F97E680318A95A1FD8FAA45867E2F137B884EAC35331710FA7B4E8C88A04D
033AC9B1D19A1BD20A8EDB1C15EA7CE40CBE18CF3433DA37E0ECC411DF9E6E4E
0ED790336EBB2B81ED312685E85896A0C93F1698B650A4C80D2A97B3CDBB60C8
76E29F5D8E37A9A8CB648E423D087742B4073C94E4DEC3F0B65B90FC1B53781C
31C8118273678B29A5DD532A194EB18710F63E7AAF3A386BE497E60CD89497C7
D989EBD8D32A0B61134DE00A4B35062DE5ABE3921FF7C6E1DAA3F8E417C5CEFC
2BE6583641E0F8EA3E0C303A9DCD86F3BCC6E77AE8DA8BC0472D63059D1DAC0B
D711C4BE91D8189BBFA27B9DB9953F8512B97B7856059E2E724C33D27A7B96E3
60459092030EA07693C0C090D79207DFA9C321151F34860636F053F0DB5DDACB
E50A3D629784358C331376EED92121B58B15EAE5B7176CCBCF9FE9883FD7575C
452A0AA8AF20BBC0857A772E0552E59A0D885DCDCFC868AC570FF4E754974680
0204D378AF1818B2A06D5B846EC14DFA99FA45F047B36067E4CAC3A9CF24A100
6099295C6D93465294871CC83F474885F29C5F0BDFDEE54040E6E7AE97EC2FA4
E523E7CB217FF45E09D271F90E17EC023822B4EECB4297983D5BB2C05CC730EF
DC5180D8E160B9EECE8F5FB7B0A08D7865220115DB00EFA49EFB7D06E10A55B6
D10C85ED53531FE410EB3DBA0F67A47A8E27F2F25EABE9CB427FDC0223A0D92D
654064A4545708964F4633BD883B9B4905005DA01AC337A2DC968FA04BEC1717
D79C7B1BE11C224F9F5A8A2AF3C6738AB69458DC5C3427287BBB2736F0CC2BEB
5AF4AB990EE0C2AC844A0F4053E5B12E6B03B5FF21DDF0C973C4E2A417A93D48
361ED01895B8885273D9177DA92382C068C796C3C22A253A905A35F149A5217A
DCA982F1E98B99DB8A5456980930A76198FADB5A1724719DF7F289E14BAEFFFF
6821D9A629B6C0E1FE485A95EB3E1697725D02BFF48397E5B3718113DF345F32
F418E64EB0EDB69645A652BA9AEB3BDF4C875D3EEAA434C337751E4606AAE20D
6236E52CD645DA4A408EAF6CD0A1386D62D01D34CA441EDB0D1B7A861B145B6B
8B62FC7809BB5EAB15D744FE018743AF377E7B7C0FE12BDCF629855849D15479
22B405ADBF5F683BA7F6959EC8D5BEEA9224ED14B2F681A2C340967E4735C4F1
E0577EE6A50B68BF714D82894B89D667E94037182FFF78C090AAE4E5DFD92B9D
D5C99728CAE567E59849EF1EC3D652978E955DD3B3905CCEF7CCBF908F2F0738
203E4AFB7BC0F833C5AB1D939F3982AF794751D17AB6FCF9A460492E881D51AE
3BBD943C57D3F167D8E62A8B5222F8F554EADD8BA9F293EBA46B7111491121BD
B93F08D5FC1A9C38C7F2F535797E7FAD32A979D0BF0A6FA6F6DA7A3BDE7A507C
DB27A3537B77AA489493D15FE9FB543B5821FE3AF90E784FFFCF2B2134CB5086
E9E285610AB07AEEAC8829B558F179BAE83B2A4F2B9A835021EA40BC624ED541
45C4D4119AD32FE631AF21A3929B6C0581DEB93DD2EA2D9444998955A2E78849
4644CE06B89A8C882A39E608851FB10C8865654A5DB5C832DC647824727CAA5F
552AB9E387C454EDAB0F06C60EA75DB83E95BF412AAD817BC4ECB94627EC8B7E
E7E83DD5C4402EAF5F48CBEF96BFE9C1629D9BA86088EF30DAFB3F10BDB5FB37
29EC542C85079817BFF82C2B8CEE595400B56CA9FA8F1242DB812F2501344A96
3EA9DE4997D7B05C1919FE89057FBA2EF9D1264593A3D0ED202BBFAF14821673
B01DE184BA7BBE138D9BBAE94F906D8C71B020B4C737FD57D2CB6A121F4FE5C7
3DC7CC35C8455982782C2017BB85E1B52433AFE0DAB3FF42D977DCEFDDB2AAC2
8576718D4F5979761147777F85FC7870863B90E14345E8456435E1CEB74DEEBC
06F4EBCD0E6ADE8A80F7D0B219E7D7FFC3688CE3400943D647AD5672C096277C
F132F95800C0EB9872431644356F881B90F149FED4F23CAF54B2D52D100851BD
A8EE01FFDC060E2174ABBBF719E36D56F0FA306CE21779CF44409A4BFD48A8E1
9EBE632AA6ACFFEE6E18D914677B33E666AF5302A413B841E52107F784968E9C
64AAA89D53017D64A13ACD0E3A2ED7267772DF8D631F2CFEFA9C879838EADC7D
50E31E1E0ABE6EE4CA4FCAE3EE5542884D6EAA6D86621031D5148615F5DB2AD1
795E709A6EB9137A7346822D152D1FC457ED0B978167575BFC038B0141473837
AEC0544592322B0E773E433A1D6A044F419EE83F817EDE767BBA12FC8512E505
ADB660FF5A02434CB5A0C933FA42229228D964358AE95F0427517D4AF162C2FF
4A2428DB0F6D71CCCCEAD9418C37D72C6E23F44FB374535A8FB6030BA4B0B826
0D4B4B4832908D6544C8ED4FA682BE1B9E0D737A647B480E0675AD1545D6B310
AF496A4A5E933BC31477DA4CDE9E7FF3AA0ADF2803B9EC2C7DA6E0C82D5EBBCE
5A08531FD871A4E9735C05DA3C63E4716558F194C1E4B93607FBB8FFAB07BA80
47FAB24472D762C775332E9E03F8B751CFEC9B4514BB8B2CD222CB0D66118945
E0EFB15A99D9F141BACFAD9B7EE2090C510C21049815DD51ECE2A5B5EEF03494
107DC5190CF64BDCFFA0DCDDA01E6C96C8D204B8BA0EBAB88285E7FD86DDD4A3
55165DC5344FD15D033B67C052CC34D4151CB059FA36C3BB9CE4610124760684
5826EE3D0439F43501E3C45DA83D72C4C8CE66C23C7326D4F9B24FE3CF5836E6
C08A52BB0535B5AF1C177873397D12A681DF891DBD737B2C1F11C9065E8363F5
36CDB1AFDC2C52CE8D979DAA304B354AD0192532C958AB74EC56C4C68E402D82
CDDDAF61F1E70015C29B5A14999878E56CEAB7B24F9C8B0C1CE14298B210AC26
8B481737EC2546944F1FDA561BA9D27758DDB065F1AF690E188EDAFB2F6B7F28
0C9161AFEBE9952FC317EA1549BB3485B9B920B86F2593C506596D42616643E5
C899EB5D0FCBA6834ACE98FA02A06AE617B67C2E60B2973722673ED65436A364
BF380C17F1A7A7794B5E04EACB7BD14A28C971ABF824AA01036741D714FC499F
875D28A0342D4FFE2EEAEEC06B190514428857047099828F3AD34E3F92122699
7346785297D037E7C7C083143904778B2C80B6BB8BFD1CB6AEBF5700C8384E59
669DE1B2CC069A6314C039BEBECFCF589F805316723C0E0438915CF4560F434B
AE973C2569F1B09A80B36CE737E34B030C87964F0FC9F55B66C495D7998206F2
4A51B1984E8AE3437AADC0D998BB002B4CF7C245219D0DDA9C57A053383A7290
B35BC0513DD72B30FC8B89BB4EAF23C8432A12577DAAF9BD440743501D414D95
5EF815165AA2B6DBE8E73770FB37EFBF42D3539E950A56C61611517D09746942
E1DB3B6B9691B39C3B3019ECB5A34ABE7707A181DAA1F9711EF9935B690F4DC9
C030D1E61F62BC95DD60047F9AA7911C147DE7D45BA72269923B3DCE74742B8A
DBAD222EF43A7FF4B662075D70374080309F0699F58A670DEFF1865273D4CE23
E64AD57C823DCD1719F698E86636007102678F106AE91420B98839585FEDBD73
AFA186BADF28E1BC6048620D032F04008E811A6720D5092EF4B2E631DA92BABB
ECAF0270C5D5035D54705BF1255F8824C127349FB1960764C835882ACE8BB80C
AADA8C07535487CD6B3E4E298D94B7F01FB66CD4A738C4A7B4DED0EFDC5376E4
B685CB25470D1DBA78CA3C24774601D58589AD6CD6ECB4506AAF054BF0A53C9F
6D278253291501D876CDC7C74395C1D0DCA5097B3283933748B1ED58283D1EAB
1CA5A1C2A3F20351DEDF7CB8D3D05F4245C6231A440A4195AAE18ED5B40DD5F3
A4FEC08391BD7282D7EEAF7CF899C5C4919B892A3175ACE9605874F65BDD27BB
71E59509005E8E7A042331C5455C39D2DDF8BCFF2EA60FACC5A036E682FC1012
49C55467AA92C5E680D08E4479109D90040CF597FA613BABCA1FF1F880DD1E51
DD285C9F88DACEBF2A16294DA824D8F0117D18EFB203DA81FBDCB95FB77E416F
C90E482A11DC578B3C939A547C3F71D9FD8788D4D9392A555B2A022FC9858FB9
951FD6B2DE4F57A307C09C01FA634ACB308AE7F23976237C97A4C234485E21D0
E6D32ED82680FE5AA05224E4A38A5E5DEDCAF1464C10FE145A2C387B718B9A60
1B9BFAB5F7B3BB0D2DC8EA4559B8E69F4200A4320AEA96398E56EF208AC093BB
99088A4710309A8CBA96AC27708EC1B3FE4647FDC35126ED11A3F4EB4BFC8509
3B5338D0A3F06FE04BFBEB7C03E35EA0750FB5FC159F8F4B10B993DF88CBC19D
7C460825F70F88E92292D02C337AB051E8EE0165518BF7996E09172918EE9F6A
EC1A0A7009AF5C05B28F885C9C4652AF6845386F349EF3F3ABC8FD78E21404E8
D0BA47DE48097CEBBF69B19B81FE55E61DAC5F496104DAA997122936DA6714BF
F273FA47B03EB3D32E06268DF938CE0FDED9A2C30EE605D662C5ABCA81A31379
4A49CCD50259E173B7E4348B2C9CD498C5EE3487F9EB00F9411C88908AAF36B6
5CAD710C5A37B156FCBC3BD7BC9963FABA229234D2E7C4E9046A5FC3A6235329
78255D660B00D3F5AA4AE02BFB1C6293188189ED6610EF5D76578A28C375E9C2
9B02A8DF4357F38DB47C101C5D2E949D054DAA24BBC6C9B84CA3B3179A3355A8
17D4F0D36A8E3DEAD9E4C5AF6E364BD30B375A3962BED22FE7CFAF926A732016
35FD036B7A331CD245970B6056D2EF69D76FC144ADD030538B2DE3C123817E38
0076E4FC37CF42D9D7BB8E787FF1BD2F6777F590DB94586CD1D59E80B32DCE6D
6420A8A6CEFECAF66067FDB979D6F20231D492FA636B040A8BF91C27DD53D096
CC40A017126A50B1ECCC34E9C04804CB04B36B814DF1872EAE51C59A28B082D1
7C1451E8603CA534B2F0677DC21A9AA54D7B6C6C8CD1C28615E3E963BB917061
9FE57F47B1F1FCE60D6315D9873A3E7379EC5577A28EB61A180F1E341860B487
86880B03C761A3AA013917C7B19D873A35CC4217439219CCBB1B215B03A65019
1386A19F82072E5D62D7F053D68932783C6A7A9E13CABDCAF1BEB546F555D936
A4DDBBED5C1B752DE424C1C2BD4493B37213414AF936FE2B68B7AE7E462D8FC0
7F3B21B7C7225A662DBADA1D6694BC2C07EF3A9E1B363EBCE9DE5A1C273DF5B6
4C853AF7738D868142C0DA8DD2FDC98678D883E78CE70F9D51ABFAF18516076F
06322B0554C099C7AF185C8374C6BA6E5274555A66AD5D28A4F8E350EECF5C73
2E0418422E11D2A40FDDE3CEB4992D161512B1F8A08436BE96C8318F9B404401
B82C511CB0375FAD93AB6CF95CA8885229C21D8B63FCB0883011E8F699BF330D
F7FD4AC95154576459A0BF71A9AA5649C1133BF47F9E74183A996391E332CC81
6C3EB6FFE1A669258A161AC5864C26A441D70DAEDF0CE1140C1E4FB13C7B00CA
62DB457152117737F05B8EC1DA3DE229A6CE29D70001C42CBFFF79012BF79086
7A4B74241403D98CCF3628BD1F0F45D71E5F5C6DA6E4B75CB0D6A09DEDF57FA5
32E3CBA461CCD32957E92E124727520FB36E70D8E89583831544711C4F592BBD
02903896E53321F2B1E4EE4E11BEDA9D7DD2A87868E9E72BC225B0ABA41BA1AE
82F67F42F5EB3E8BF28B62F72A2D5F6F7EF7D9D6492E9D84F6A1DAC2987FD343
F3674B603F3EDFBE07910079DE0D0A7B849E94C7F24E5C8650145A5680963400
C8EAAFB866F3B307E6FB7CF772CFFBA49BBD30691CFB6BEB6D7FB3AD4EDB51DD
68857CAC2E130B9AE2D39F4F0EC51A56FF8FD5BAD6FC426281ECF47BDBA41F8F
A0DA6EDCADA409419B3B083605AD8E507D8F2122BC93BAB30D100CA8DD5F375C
E60C4911F19FAFCF1F84CAB08CE5446377AC2B83FAA3880D0A91A476477167EA
525ED7EBCA27ED020D788646B59FB808985303E7273D3C4D91DDCAA8044FABD6
B27F80C10AD00F78738719AB306946C235CE8693A395C2D56233E1253BC111CB
ABED30182C02551FE3BDC78C0353F33C80C4C8F034B8585D648389961290DF78
EA9DBAAC78DE16BDC2E03DF0F977EC4B16D12BAB0B180C57437A64B70A919799
C47812F61406554A49E3ED806F0084F4F3E86F09DB272A7C00CF103535D32467
A6691D88E7C4C69F40C03330E97C629F8F265B7E3E67FF3F195BF5E9221767AD
A6546EB7CFC6552E4D4B887411BA6047BB487399314E5536B24561FDB58D7A13
B4D778C56231C3E1FE9C11D5C57330101409A099971779AC99BAF87027D93528
C2335A9BE780C005D904DD2F2BA0AAD0052466424E49C7DB87DD0DCC0CB7304C
29BEBC57224E64D31D7D6691CAF4617EAFFEBEF01B086463EAB1FF176B33EA51
47425F03BCB318CC289FBC9C2AB20AC5CE598056EFDECE8F0515AE916365D173
AECA95DC64C8E04A8BC9996B3195D65A7598F68609B02AA0E60ABBA6F934C0E0
11AD7127AB10B29E49E942F42C7EA2B283A0E16F0E14E21A1A82024BF91AD2FC
6821AEE8A54C6D3499301150C5C817BFAF9456E90312AF13703D7435F7767D39
86687858FC2F787E2420A784B5EBF899F6C9D8478DEC292B7C6ADB8E82D2219C
EE2E5F23316EDE7FE048291515A7BDD0FD8B928E2EDA631B554ACF09330EFADD
FCE138D89C24088FE5D6DF21C136C90EDA2D58AA2F6844696C103374A392FC2E
7CE785FE52E2D405DBF0A3D1A4663593B0281C623638A601D70BDBDB5284E3F5
862DF61900A6B43DC57BDA6E19DE422900563770A83DC4FA966A451E0B2EBD0C
4F0FF1095F7D242A93204327C27B09F8FB74B7E91B941F1C234B97A5DA196BA0
5FD287FFF11E35332161D09FDFF6F1EFD1BA50990C9B11FB9F9335F0F22DC8AA
88C21AEE73AB8EE7532BD1D59E2C7FC3881B07EE879731F3786C2CFE72BF49EE
CB820B4882CF73DC9F4D01454B9C2D38A3CC62053A46CF09B3CEF59690D1B22D
AF4633FEF5F4FCD97CBA72139A783E82E1435525C67FD4FA258D660A6C7E7326
699043AB0F76E1BE3FC72D765CB95E05140BC874A0414893570363B979BA0479
816617C99ABB3B34CDE3E8CFB3E7813094F26E6F5EDCD2B415E498DDA03E8AA6
43F74128CE5B2FDA0D2789CF98AC4097C3CDD68EBD42BB79373FC8A82D740CF9
74C6C2CB86C9FE616C34962539749CA69D5B4BF0176CA88FBC4A35CFF9DC0816
3A21DCB24CA986D07CAA99E3E60069A68CBF325C924A3A69162A93C225D0A6FF
427B0753DF16BF95F7530D7403AD80FF9D7A49AB1493422EF7459D8812DBDA3D
80482627BA2A128D9AB3600DF2B4BEE0380C6B8FEF27B9930D851ED92A63057F
D3DE810452A287538D0C483B2219467C5C9FB30D7943677D72E1FC16418BC267
08CA35E9B961A69D8F9E52D4EFA6F26C9121FDA7DEC06C734E1F5E7D20190079
688FEA50B8C6357AB001E3ABE6222E9B5706F88EC69D2E456C8ED643DECBC8C0
C09BF2426B872A23C43266FE8C90AABA28B3FE1E2C9B250FC1220498478850F7
76D2ACA6A2B7793C0E06FCD72052E1AA87B86F0B7A918BE77ADCB424467E23C4
A60D4556B256F6EDBCDDAC65AF54D25C3C7CE4462726E7BE8672600AF0A7B648
8956FDC8BC9E1F56DD24C28AA1703A50ACE4EB81D083FE57C9665A1FD9111821
1315042979FAA6F6953E30FF6085E62272CD0915168B39A9490F20DBF72563A9
D3263948A5129F3E8CC8C3DC374D5EBDEBE63761F2690B9565B92320E5D8B405
706406D55535E1383C8DBE9CB32B6663C12DBB38D9184346C055F435125FF7C6
6FA84AAFC27D9502E04FB08A5243F331A512E1E024870ABA03901B1D54CD0F21
1D1C736712388171EFE06BFB32076B68BABEB92A92291B5DD8A51216E4E735A8
A1D2321E2B8FE59E1631D96EF4F38835628B03D1C82F3BDDFD1ADDA5FA78F449
5832ACD7257D0CAAD4A60F5D236670C7A5F99E7408C0C5FEB321B771CBB3553D
04B05959AF7F709542D68C52585E67906183CC48AC7D703A41CC9272B804312B
4640CDC7DAD92A040404EF278B26E83265A6C6C3263D3B389EB4845E7F9F2A84
D404CAE1F901E0111DE0B41DB6E2DED17A56E9CF875DC6092C5333391AE2EC2C
0C76810412CFFE9F8BB820C3E73D7013C852657BA98DD0785D5678C65CF3FC0A
9F8F32664EA880F297842558494D31C09CDE5E41B4BDDE39628D530EC7138753
48B2A4B4B68805F5A6827FC2D46A74F9A5212EDFE7A3C7DEB342A5414F7BEEDE
FB4CA90AF375B00B39E79E3077E85A474C5F8E12D8A450707F1C333703BFB751
CDC84D322F81FB17574D87D41AC5D5852ABB2FF37364D39B8DCEC51AB98A48C8
62294808419DE6BC29CD3172FAC041913E02
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
cleartomark
%%EndResource
/F9_0 /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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.69 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.427 Td
(2000\)\). See also http://pdos.csail.mit.edu/6.828/2007/v6.html\
, which) 297.059 Tj
0 -113.92 Td
(provides pointers to on-line resources for v6.) 200.952 Tj
0 -132.907 Td
(xv6 borrows code from the following sources:) 192.215 Tj
17.4609 -142.4 Td
(JOS \(asm.h, elf.h, mmu.h, bootasm.S, ide.c, console.c, and oth\
ers\)) 288.322 Tj
17.4609 -151.893 Td
(Plan 9 \(bootother.S, mp.h, mp.c, lapic.c\)) 179.109 Tj
17.4609 -161.387 Td
(FreeBSD \(ioapic.c\)) 78.6333 Tj
17.4609 -170.88 Td
(NetBSD \(console.c\)) 78.6333 Tj
0 -189.867 Td
(The following people made contributions:) 174.741 Tj
17.4609 -199.36 Td
(Russ Cox \(context switching, locking\)) 161.635 Tj
17.4609 -208.853 Td
(Cliff Frey \(MP\)) 65.5277 Tj
17.4609 -218.347 Td
(Xiao Yu \(MP\)) 52.4222 Tj
0 -237.334 Td
(The code in the files that constitute xv6 is) 192.215 Tj
0 -246.827 Td
(Copyright 2006-2007 Frans Kaashoek, Robert Morris, and Russ Cox\
.) 279.585 Tj
0 -265.813 Td
(ERROR REPORTS) 56.7907 Tj
0 -284.799 Td
(If you spot errors or have suggestions for improvement, please \
send) 292.69 Tj
0 -294.293 Td
(email to Frans Kaashoek and Robert Morris \(kaashoek,rtm@csail.\
mit.edu\). ) 314.533 Tj
0 -313.28 Td
(BUILDING AND RUNNING XV6) 104.844 Tj
0 -332.266 Td
(To build xv6 on an x86 ELF machine \(like Linux or FreeBSD\), r\
un "make".) 310.165 Tj
0 -341.76 Td
(On non-x86 or non-ELF machines \(like OS X, even on x86\), you \
will) 283.953 Tj
0 -351.253 Td
(need to install a cross-compiler gcc suite capable of producing\
 x86 ELF) 310.165 Tj
0 -360.746 Td
(binaries.  See http://pdos.csail.mit.edu/6.828/2007/tools.html.) 275.216 Tj
0 -370.24 Td
(Then run "make TOOLPREFIX=i386-jos-elf-".) 179.109 Tj
0 -389.226 Td
(To run xv6, you can use Bochs or QEMU, both PC simulators.) 253.374 Tj
0 -398.72 Td
(Bochs makes debugging easier, but QEMU is much faster. ) 240.268 Tj
0 -408.213 Td
(To run in Bochs, run "make bochs" and then type "c" at the boch\
s prompt.) 314.533 Tj
0 -417.706 Td
(To run in QEMU, run "make qemu".  Both log the xv6 screen outpu\
t to ) 297.059 Tj
0 -427.2 Td
(standard output.) 69.8962 Tj
0 -446.187 Td
(To create a typeset version of the code, run "make xv6.pdf".) 262.111 Tj
0 -455.68 Td
(This requires the "mpage" text formatting utility.) 218.426 Tj
0 -465.173 Td
(See http://www.mesa.nl/pub/mpage/.) 148.529 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  table of contents  Page 1) 192.215 Tj
0 -28.4801 Td
(The numbers to the left of the file names in the table are shee\
t numbers.) 318.902 Tj
0 -37.9735 Td
(The source code has been printed in a double column format with\
 fifty) 301.427 Tj
0 -47.4668 Td
(lines per column, giving one hundred lines per sheet \(or page\)\
.) 275.216 Tj
0 -56.9602 Td
(Thus there is a convenient relationship between line numbers an\
d sheet numbers.) 345.113 Tj
0 -85.4403 Td
(# basic headers) 65.5277 Tj
-4514.16 TJm
(# system calls) 61.1592 Tj
-5015.87 TJm
(# pipes) 30.5796 Tj
0 -94.9336 Td
(01 types.h) 43.6851 Tj
-7022.49 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.49 TJm
(24 vectors.pl) 56.7907 Tj
0 -113.92 Td
(02 defs.h) 39.3166 Tj
-7524.16 TJm
(24 trapasm.S) 52.4222 Tj
-6019.2 TJm
(# string operations) 83.0018 Tj
0 -123.414 Td
(03 x86.h) 34.9481 Tj
-8025.82 TJm
(25 trap.c) 39.3166 Tj
-7524.2 TJm
(53 string.c) 48.0537 Tj
0 -132.907 Td
(05 asm.h) 34.9481 Tj
-8025.82 TJm
(26 syscall.h) 52.4222 Tj
0 -142.4 Td
(06 mmu.h) 34.9481 Tj
-8025.82 TJm
(26 syscall.c) 52.4222 Tj
-6019.2 TJm
(# low-level hardware) 87.3703 Tj
0 -151.894 Td
(08 elf.h) 34.9481 Tj
-8025.82 TJm
(28 sysproc.c) 52.4222 Tj
-6019.2 TJm
(54 mp.h) 30.5796 Tj
209.535 -161.387 Td
(55 mp.c) 30.5796 Tj
0 -170.881 Td
(# startup) 39.3166 Tj
-7524.16 TJm
(# file system) 56.7907 Tj
-5517.54 TJm
(56 lapic.c) 43.6851 Tj
0 -180.374 Td
(09 bootasm.S) 52.4222 Tj
-6019.16 TJm
(29 buf.h) 34.9481 Tj
-8025.87 TJm
(58 ioapic.c) 48.0537 Tj
0 -189.867 Td
(10 bootother.S) 61.1592 Tj
-5015.82 TJm
(29 dev.h) 34.9481 Tj
-8025.87 TJm
(59 picirq.c) 48.0537 Tj
0 -199.361 Td
(11 bootmain.c) 56.7907 Tj
-5517.49 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.16 TJm
(30 stat.h) 39.3166 Tj
-7524.2 TJm
(61 kbd.c) 34.9481 Tj
104.767 -218.347 Td
(31 file.h) 39.3166 Tj
-7524.2 TJm
(62 console.c) 52.4222 Tj
0 -227.841 Td
(# locks) 30.5796 Tj
-8527.49 TJm
(31 fs.h) 30.5796 Tj
-8527.54 TJm
(65 timer.c) 43.6851 Tj
0 -237.334 Td
(13 spinlock.h) 56.7907 Tj
-5517.49 TJm
(32 fsvar.h) 43.6851 Tj
0 -246.827 Td
(14 spinlock.c) 56.7907 Tj
-5517.49 TJm
(33 ide.c) 34.9481 Tj
-8025.87 TJm
(# user-level) 52.4222 Tj
104.767 -256.321 Td
(35 bio.c) 34.9481 Tj
-8025.87 TJm
(66 initcode.S) 56.7907 Tj
0 -265.814 Td
(# processes) 48.0537 Tj
-6520.82 TJm
(36 fs.c) 30.5796 Tj
-8527.54 TJm
(66 init.c) 39.3166 Tj
0 -275.307 Td
(15 proc.h) 39.3166 Tj
-7524.16 TJm
(44 file.c) 39.3166 Tj
-7524.2 TJm
(67 usys.S) 39.3166 Tj
0 -284.8 Td
(16 proc.c) 39.3166 Tj
-7524.16 TJm
(45 sysfile.c) 52.4222 Tj
-6019.2 TJm
(67 sh.c) 30.5796 Tj
0 -294.294 Td
(21 swtch.S) 43.6851 Tj
-7022.49 TJm
(50 exec.c) 39.3166 Tj
0 -303.787 Td
(22 kalloc.c) 48.0537 Tj
0 -341.761 Td
(The source listing is preceded by a cross-reference that lists \
every defined ) 336.376 Tj
0 -351.254 Td
(constant, struct, global variable, and function in xv6.  Each e\
ntry gives,) 323.27 Tj
0 -360.747 Td
(on the same line as the name, the line number \(or, in a few ca\
ses, numbers\)) 327.639 Tj
0 -370.241 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.005 Tj
17.4609 -398.721 Td
(swtch 2256) 43.6851 Tj
34.9222 -408.214 Td
(0311 1928 1962 2255) 83.0018 Tj
34.9222 -417.707 Td
(2256) 17.4741 Tj
-7.10543e-15 -436.694 Td
(indicates that swtch is defined on line 2256 and is mentioned o\
n five lines) 327.639 Tj
-7.10543e-15 -446.187 Td
(on sheets 03, 19, and 22.) 109.213 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 1) 187.846 Tj
0 -28.4801 Td
(acquire 1425) 52.4222 Tj
-14045.3 TJm
(2911 3387 3414 3419) 83.0018 Tj
17.4609 -37.9735 Td
(0314 1425 1428 1633) 83.0018 Tj
-8527.18 TJm
(3460 3479 3618) 61.1592 Tj
17.4609 -47.4668 Td
(1815 1869 1918 1933) 83.0018 Tj
-6520.6 TJm
(bfree 3730) 43.6851 Tj
17.4609 -56.9602 Td
(1967 1980 2023 2058) 83.0018 Tj
-8527.18 TJm
(3730 4060 4070) 61.1592 Tj
17.4609 -66.4535 Td
(2265 2312 2553 2871) 83.0018 Tj
-6520.6 TJm
(bget 3565) 39.3166 Tj
17.4609 -75.9469 Td
(3406 3465 3569 3629) 83.0018 Tj
-8527.18 TJm
(3565 3596 3606) 61.1592 Tj
17.4609 -85.4403 Td
(3807 3840 3860 3889) 83.0018 Tj
-6520.6 TJm
(binit 3538) 43.6851 Tj
17.4609 -94.9336 Td
(3904 3914 4423 4440) 83.0018 Tj
-8527.18 TJm
(0210 1235 3538) 61.1592 Tj
17.4609 -104.427 Td
(4456 5217 5255 5278) 83.0018 Tj
-6520.6 TJm
(bmap 4010) 39.3166 Tj
17.4609 -113.92 Td
(6335 6390 6416 6458) 83.0018 Tj
-8527.18 TJm
(4010 4047 4119 4169) 83.0018 Tj
0 -123.413 Td
(allocproc 1628) 61.1592 Tj
-13042 TJm
(4222) 17.4741 Tj
17.4609 -132.907 Td
(1628 1710) 39.3166 Tj
-11537.3 TJm
(bootmain 1117) 56.7907 Tj
0 -142.4 Td
(alltraps 2456) 56.7907 Tj
-13543.7 TJm
(0975 1117) 39.3166 Tj
17.4609 -151.893 Td
(2410 2418 2432 2437) 83.0018 Tj
-6520.6 TJm
(bootothers 1276) 65.5277 Tj
17.4609 -161.387 Td
(2455 2456) 39.3166 Tj
-13543.8 TJm
(1207 1246 1276) 61.1592 Tj
0 -170.88 Td
(ALT 6010) 34.9481 Tj
-14045.4 TJm
(BPB 3193) 34.9481 Tj
17.4609 -180.373 Td
(6010 6038 6040) 61.1592 Tj
-11035.5 TJm
(3193 3196 3712 3714) 83.0018 Tj
0 -189.867 Td
(argfd 4564) 43.6851 Tj
-15048.7 TJm
(3740) 17.4741 Tj
17.4609 -199.36 Td
(4564 4607 4619 4630) 83.0018 Tj
-6520.6 TJm
(bread 3602) 43.6851 Tj
17.4609 -208.854 Td
(4644 4656) 39.3166 Tj
-13543.8 TJm
(0211 3602 3683 3694) 83.0018 Tj
0 -218.347 Td
(argint 2694) 48.0537 Tj
-14547 TJm
(3713 3739 3867 3961) 83.0018 Tj
17.4609 -227.84 Td
(0330 2694 2708 2724) 83.0018 Tj
-8527.18 TJm
(3982 4032 4066 4119) 83.0018 Tj
17.4609 -237.334 Td
(2835 2856 2869 4569) 83.0018 Tj
-8527.18 TJm
(4169 4222) 39.3166 Tj
17.4609 -246.827 Td
(4607 4619 4858 4909) 83.0018 Tj
-6520.6 TJm
(brelse 3624) 48.0537 Tj
17.4609 -256.32 Td
(4910 4957) 39.3166 Tj
-13543.8 TJm
(0212 3624 3627 3685) 83.0018 Tj
0 -265.813 Td
(argptr 2704) 48.0537 Tj
-14547 TJm
(3697 3719 3723 3746) 83.0018 Tj
17.4609 -275.307 Td
(0331 2704 4607 4619) 83.0018 Tj
-8527.18 TJm
(3875 3967 3970 3991) 83.0018 Tj
17.4609 -284.8 Td
(4656 4982) 39.3166 Tj
-13543.8 TJm
(4037 4043 4072 4122) 83.0018 Tj
0 -294.293 Td
(argstr 2721) 48.0537 Tj
-14547 TJm
(4173 4233 4237) 61.1592 Tj
17.4609 -303.787 Td
(0332 2721 4668 4758) 83.0018 Tj
-6520.6 TJm
(BSIZE 3157) 43.6851 Tj
17.4609 -313.28 Td
(4858 4908 4923 4935) 83.0018 Tj
-8527.18 TJm
(3157 3169 3187 3193) 83.0018 Tj
17.4609 -322.773 Td
(4957) 17.4741 Tj
-16052.2 TJm
(3695 4119 4120 4121) 83.0018 Tj
0 -332.267 Td
(BACK 6761) 39.3166 Tj
-15550.3 TJm
(4165 4166 4169 4170) 83.0018 Tj
17.4609 -341.76 Td
(6761 6874 7020 7289) 83.0018 Tj
-8527.18 TJm
(4171 4221 4222 4224) 83.0018 Tj
0 -351.254 Td
(backcmd 6796 7014) 74.2647 Tj
-9530.43 TJm
(buf 2900) 34.9481 Tj
17.4609 -360.747 Td
(6796 6809 6875 7014) 83.0018 Tj
-8527.18 TJm
(0200 0211 0212 0213) 83.0018 Tj
17.4609 -370.24 Td
(7016 7142 7255 7290) 83.0018 Tj
-8527.18 TJm
(0253 2900 2904 2905) 83.0018 Tj
0 -379.734 Td
(BACKSPACE 6216) 61.1592 Tj
-13042 TJm
(2906 3310 3325 3375) 83.0018 Tj
17.4609 -389.227 Td
(6216 6234 6263 6426) 83.0018 Tj
-8527.18 TJm
(3404 3454 3456 3459) 83.0018 Tj
17.4609 -398.72 Td
(6432) 17.4741 Tj
-16052.2 TJm
(3527 3529 3535 3540) 83.0018 Tj
0 -408.213 Td
(balloc 3704) 48.0537 Tj
-14547 TJm
(3553 3564 3567 3577) 83.0018 Tj
17.4609 -417.707 Td
(3704 3725 4019 4030) 83.0018 Tj
-8527.18 TJm
(3601 3604 3614 3624) 83.0018 Tj
17.4609 -427.2 Td
(4040) 17.4741 Tj
-16052.2 TJm
(3639 3669 3681 3692) 83.0018 Tj
0 -436.693 Td
(BBLOCK 3196) 48.0537 Tj
-14547 TJm
(3707 3732 3854 3955) 83.0018 Tj
17.4609 -446.187 Td
(3196 3713 3739) 61.1592 Tj
-11035.5 TJm
(3979 4013 4055 4105) 83.0018 Tj
0 -455.68 Td
(B_BUSY 2909) 48.0537 Tj
-14547 TJm
(4155 4215 6304 6316) 83.0018 Tj
17.4609 -465.173 Td
(2909 3458 3574 3576) 83.0018 Tj
-8527.18 TJm
(6319 6322 6385 6392) 83.0018 Tj
17.4609 -474.667 Td
(3580 3588 3589 3616) 83.0018 Tj
-8527.18 TJm
(6403 6424 6437 6468) 83.0018 Tj
17.4609 -484.16 Td
(3626 3638) 39.3166 Tj
-13543.8 TJm
(6884 6887 6888 6889) 83.0018 Tj
0 -493.654 Td
(B_DIRTY 2911) 52.4222 Tj
-14045.3 TJm
(6903 6915 6917) 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 2) 187.846 Tj
0 -28.4801 Td
(bufhead 3535) 52.4222 Tj
-14045.3 TJm
(7158 7160 7163 7164) 83.0018 Tj
17.4609 -37.9735 Td
(3535 3551 3552 3554) 83.0018 Tj
-8527.18 TJm
(7175 7178 7181 7185) 83.0018 Tj
17.4609 -47.4668 Td
(3555 3556 3557 3573) 83.0018 Tj
-8527.18 TJm
(7200 7203 7208 7212) 83.0018 Tj
17.4609 -56.9602 Td
(3587 3633 3634 3635) 83.0018 Tj
-8527.18 TJm
(7213 7216 7221 7222) 83.0018 Tj
17.4609 -66.4535 Td
(3636) 17.4741 Tj
-16052.2 TJm
(7228 7237 7238 7244) 83.0018 Tj
0 -75.9469 Td
(buf_table_lock 3530) 83.0018 Tj
-10533.7 TJm
(7245 7251 7252 7261) 83.0018 Tj
17.4609 -85.4403 Td
(3530 3542 3569 3577) 83.0018 Tj
-8527.18 TJm
(7264 7266 7272 7273) 83.0018 Tj
17.4609 -94.9336 Td
(3581 3592 3629 3641) 83.0018 Tj
-8527.18 TJm
(7278 7284 7290 7291) 83.0018 Tj
0 -104.427 Td
(B_VALID 2910) 52.4222 Tj
-14045.3 TJm
(7294) 17.4741 Tj
17.4609 -113.92 Td
(2910 3418 3460 3479) 83.0018 Tj
-6520.6 TJm
(cmpxchg 0469) 52.4222 Tj
17.4609 -123.414 Td
(3574 3607) 39.3166 Tj
-13543.9 TJm
(0469 1434) 39.3166 Tj
0 -132.907 Td
(bwrite 3614) 48.0537 Tj
-12540.4 TJm
(CONSOLE 2957) 52.4222 Tj
17.4609 -142.4 Td
(0213 3614 3617 3696) 83.0018 Tj
-8527.18 TJm
(2957 6506 6507) 61.1592 Tj
17.4609 -151.894 Td
(3718 3745 3966 3990) 83.0018 Tj
-6520.6 TJm
(console_init 6501) 74.2647 Tj
17.4609 -161.387 Td
(4041 4172) 39.3166 Tj
-13543.9 TJm
(0216 1244 6501) 61.1592 Tj
0 -170.88 Td
(bzero 3690) 43.6851 Tj
-13042.1 TJm
(console_intr 6412) 74.2647 Tj
17.4609 -180.374 Td
(3690 3736) 39.3166 Tj
-13543.9 TJm
(0218 6198 6412) 61.1592 Tj
0 -189.867 Td
(C 6031 6409) 48.0537 Tj
-12540.4 TJm
(console_lock 6220) 74.2647 Tj
17.4609 -199.361 Td
(6031 6079 6104 6105) 83.0018 Tj
-8527.18 TJm
(6220 6335 6381 6390) 83.0018 Tj
17.4609 -208.854 Td
(6106 6107 6108 6110) 83.0018 Tj
-8527.18 TJm
(6393 6503) 39.3166 Tj
17.4609 -218.347 Td
(6409 6419 6422 6429) 83.0018 Tj
-6520.6 TJm
(console_read 6451) 74.2647 Tj
17.4609 -227.841 Td
(6439 6469) 39.3166 Tj
-13543.9 TJm
(6451 6507) 39.3166 Tj
0 -237.334 Td
(CAPSLOCK 6012) 56.7907 Tj
-11537.1 TJm
(console_write 6385) 78.6333 Tj
17.4609 -246.827 Td
(6012 6045 6186) 61.1592 Tj
-11035.5 TJm
(6385 6506) 39.3166 Tj
0 -256.321 Td
(cga_putc 6251) 56.7907 Tj
-11537.1 TJm
(cons_putc 6283) 61.1592 Tj
17.4609 -265.814 Td
(6251 6292) 39.3166 Tj
-13543.9 TJm
(6283 6322 6346 6364) 83.0018 Tj
0 -275.307 Td
(cli 0482) 34.9481 Tj
-16052 TJm
(6367 6371 6372 6392) 83.0018 Tj
17.4609 -284.8 Td
(0482 0484 0914 1027) 83.0018 Tj
-8527.18 TJm
(6426 6432 6438) 61.1592 Tj
17.4609 -294.294 Td
(1431 6286 6520) 61.1592 Tj
-9028.94 TJm
(context 1515) 52.4222 Tj
0 -303.787 Td
(cmd 6765) 34.9481 Tj
-16052 TJm
(0201 0311 1515 1540) 83.0018 Tj
17.4609 -313.281 Td
(6765 6777 6786 6787) 83.0018 Tj
-8527.18 TJm
(1568 1740 1741 1742) 83.0018 Tj
17.4609 -322.774 Td
(6792 6793 6798 6802) 83.0018 Tj
-8527.18 TJm
(1828 1862 2129) 61.1592 Tj
17.4609 -332.267 Td
(6806 6815 6818 6823) 83.0018 Tj
-6520.6 TJm
(copyproc 1704) 56.7907 Tj
17.4609 -341.761 Td
(6831 6837 6841 6851) 83.0018 Tj
-8527.18 TJm
(0296 1704 1757 2811) 83.0018 Tj
17.4609 -351.254 Td
(6875 6877 6952 6955) 83.0018 Tj
-6520.6 TJm
(cp 1560) 30.5796 Tj
17.4609 -360.747 Td
(6957 6958 6959 6960) 83.0018 Tj
-8527.18 TJm
(1560 1657 1660 1661) 83.0018 Tj
17.4609 -370.241 Td
(6963 6964 6966 6968) 83.0018 Tj
-8527.18 TJm
(1662 1663 1664 1665) 83.0018 Tj
17.4609 -379.734 Td
(6969 6970 6971 6972) 83.0018 Tj
-8527.18 TJm
(1666 1825 1832 1855) 83.0018 Tj
17.4609 -389.227 Td
(6973 6974 6975 6976) 83.0018 Tj
-8527.18 TJm
(1862 1870 1884 1905) 83.0018 Tj
17.4609 -398.721 Td
(6979 6980 6982 6984) 83.0018 Tj
-8527.18 TJm
(1923 1924 1928 2009) 83.0018 Tj
17.4609 -408.214 Td
(6985 6986 6987 6988) 83.0018 Tj
-8527.18 TJm
(2014 2015 2016 2020) 83.0018 Tj
17.4609 -417.707 Td
(6989 7000 7001 7003) 83.0018 Tj
-8527.18 TJm
(2021 2026 2030 2038) 83.0018 Tj
17.4609 -427.201 Td
(7005 7006 7007 7008) 83.0018 Tj
-8527.18 TJm
(2039 2066 2084 2090) 83.0018 Tj
17.4609 -436.694 Td
(7009 7010 7013 7014) 83.0018 Tj
-8527.18 TJm
(2537 2539 2541 2574) 83.0018 Tj
17.4609 -446.188 Td
(7016 7018 7019 7020) 83.0018 Tj
-8527.18 TJm
(2582 2583 2590 2595) 83.0018 Tj
17.4609 -455.681 Td
(7021 7022 7112 7113) 83.0018 Tj
-8527.18 TJm
(2696 2710 2712 2726) 83.0018 Tj
17.4609 -465.174 Td
(7114 7115 7117 7121) 83.0018 Tj
-8527.18 TJm
(2778 2780 2783 2784) 83.0018 Tj
17.4609 -474.668 Td
(7124 7130 7131 7134) 83.0018 Tj
-8527.18 TJm
(2811 2843 2860 2874) 83.0018 Tj
17.4609 -484.161 Td
(7137 7139 7142 7146) 83.0018 Tj
-8527.18 TJm
(4361 4571 4588 4589) 83.0018 Tj
17.4609 -493.654 Td
(7148 7150 7153 7155) 83.0018 Tj
-8527.18 TJm
(4605 4607 4609 4617) 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 3) 187.846 Tj
17.4609 -28.4801 Td
(4619 4621 4646 4943) 83.0018 Tj
-6520.6 TJm
(DIRSIZ 3201) 48.0537 Tj
17.4609 -37.9735 Td
(4944 4963 4969 4989) 83.0018 Tj
-8527.18 TJm
(3201 3205 4205 4272) 83.0018 Tj
17.4609 -47.4668 Td
(5097 5101 5102 5103) 83.0018 Tj
-8527.18 TJm
(4327 4328 4391 4665) 83.0018 Tj
17.4609 -56.9602 Td
(5104 5105 5106 5258) 83.0018 Tj
-8527.18 TJm
(4755 4805) 39.3166 Tj
17.4609 -66.4535 Td
(5280 6461) 39.3166 Tj
-11537.3 TJm
(disk_1_present 3327) 83.0018 Tj
0 -75.9469 Td
(cprintf 6327) 52.4222 Tj
-14045.3 TJm
(3327 3364 3462) 61.1592 Tj
17.4609 -85.4403 Td
(0217 1232 1261 2127) 83.0018 Tj
-6520.6 TJm
(DPL_USER 0664) 56.7907 Tj
17.4609 -94.9336 Td
(2131 2133 2235 2328) 83.0018 Tj
-8527.18 TJm
(0664 1689 1690 1762) 83.0018 Tj
17.4609 -104.427 Td
(2569 2576 2581 2782) 83.0018 Tj
-8527.18 TJm
(1763 2522 2590) 61.1592 Tj
17.4609 -113.92 Td
(3408 5637 5862 6327) 83.0018 Tj
-6520.6 TJm
(E0ESC 6016) 43.6851 Tj
17.4609 -123.414 Td
(6522 6523 6524 6527) 83.0018 Tj
-8527.18 TJm
(6016 6170 6174 6175) 83.0018 Tj
0 -132.907 Td
(cpu 1566 5751) 56.7907 Tj
-13543.7 TJm
(6177 6180) 39.3166 Tj
17.4609 -142.4 Td
(0256 0269 1232 1251) 83.0018 Tj
-6520.6 TJm
(elfhdr 0805) 48.0537 Tj
17.4609 -151.894 Td
(1261 1263 1266 1269) 83.0018 Tj
-8527.18 TJm
(0805 1119 1123 5014) 83.0018 Tj
17.4609 -161.387 Td
(1280 1287 1306 1417) 83.0018 Tj
-6520.6 TJm
(ELF_MAGIC 0802) 61.1592 Tj
17.4609 -170.88 Td
(1430 1432 1445 1458) 83.0018 Tj
-8527.18 TJm
(0802 1129 5029) 61.1592 Tj
17.4609 -180.374 Td
(1465 1491 1560 1566) 83.0018 Tj
-6520.6 TJm
(ELF_PROG_LOAD 0836) 78.6333 Tj
17.4609 -189.867 Td
(1576 1674 1676 1828) 83.0018 Tj
-8527.18 TJm
(0836 5034 5061) 61.1592 Tj
17.4609 -199.361 Td
(1859 1862 2548 2552) 83.0018 Tj
-6520.6 TJm
(EOI 5660) 34.9481 Tj
17.4609 -208.854 Td
(2569 2576 2577 2581) 83.0018 Tj
-8527.18 TJm
(5660 5737 5763) 61.1592 Tj
17.4609 -218.347 Td
(2582 2585 5512 5513) 83.0018 Tj
-6520.6 TJm
(ERROR 5678) 43.6851 Tj
17.4609 -227.841 Td
(5751 6522) 39.3166 Tj
-13543.8 TJm
(5678 5730) 39.3166 Tj
0 -237.334 Td
(cpuid 0451) 43.6851 Tj
-13042.1 TJm
(ESR 5663) 34.9481 Tj
17.4609 -246.827 Td
(0451 0455 1265 1439) 83.0018 Tj
-8527.18 TJm
(5663 5733 5734) 61.1592 Tj
17.4609 -256.321 Td
(1462) 17.4741 Tj
-14045.6 TJm
(EXEC 6757) 39.3166 Tj
0 -265.814 Td
(create 4801) 48.0537 Tj
-14547 TJm
(6757 6822 6959 7265) 83.0018 Tj
17.4609 -275.307 Td
(4801 4843 4862 4911) 83.0018 Tj
-6520.6 TJm
(execcmd 6769 6953) 74.2647 Tj
17.4609 -284.8 Td
(4923) 17.4741 Tj
-16052.2 TJm
(6769 6810 6823 6953) 83.0018 Tj
0 -294.294 Td
(CRTPORT 6214) 52.4222 Tj
-14045.3 TJm
(6955 7221 7227 7228) 83.0018 Tj
17.4609 -303.787 Td
(6214 6256 6257 6258) 83.0018 Tj
-8527.18 TJm
(7256 7266) 39.3166 Tj
17.4609 -313.281 Td
(6259 6275 6276 6277) 83.0018 Tj
-6520.6 TJm
(exit 2004) 39.3166 Tj
17.4609 -322.774 Td
(6278) 17.4741 Tj
-16052.2 TJm
(0297 2004 2041 2538) 83.0018 Tj
0 -332.267 Td
(CTL 6009) 34.9481 Tj
-16052 TJm
(2542 2591 2820 6615) 83.0018 Tj
17.4609 -341.761 Td
(6009 6035 6039 6185) 83.0018 Tj
-8527.18 TJm
(6618 6676 6681 6711) 83.0018 Tj
0 -351.254 Td
(devsw 2950) 43.6851 Tj
-15048.7 TJm
(6816 6825 6835 6880) 83.0018 Tj
17.4609 -360.747 Td
(2950 2955 4108 4110) 83.0018 Tj
-8527.18 TJm
(6920 6927) 39.3166 Tj
17.4609 -370.241 Td
(4158 4160 4407 6506) 83.0018 Tj
-6520.6 TJm
(fdalloc 4583) 52.4222 Tj
17.4609 -379.734 Td
(6507) 17.4741 Tj
-16052.2 TJm
(4583 4632 4874 4987) 83.0018 Tj
0 -389.227 Td
(dinode 3173) 48.0537 Tj
-12540.4 TJm
(fetchint 2666) 56.7907 Tj
17.4609 -398.721 Td
(3173 3187 3855 3868) 83.0018 Tj
-8527.18 TJm
(0333 2666 2696 4963) 83.0018 Tj
17.4609 -408.214 Td
(3956 3962 3980 3983) 83.0018 Tj
-6520.6 TJm
(fetchstr 2678) 56.7907 Tj
0 -417.707 Td
(dirent 3203) 48.0537 Tj
-14547 TJm
(0334 2678 2726 4969) 83.0018 Tj
17.4609 -427.201 Td
(3203 4216 4223 4224) 83.0018 Tj
-6520.6 TJm
(file 3100) 39.3166 Tj
17.4609 -436.694 Td
(4255 4705 4754) 61.1592 Tj
-11035.5 TJm
(0202 0225 0226 0227) 83.0018 Tj
0 -446.188 Td
(dirlink 4252) 52.4222 Tj
-14045.3 TJm
(0229 0230 0231 0290) 83.0018 Tj
17.4609 -455.681 Td
(0234 4252 4267 4275) 83.0018 Tj
-8527.18 TJm
(1538 3100 4403 4409) 83.0018 Tj
17.4609 -465.174 Td
(4684 4831 4842) 61.1592 Tj
-11035.5 TJm
(4418 4425 4426 4427) 83.0018 Tj
0 -474.668 Td
(dirlookup 4212) 61.1592 Tj
-13042 TJm
(4429 4437 4438 4452) 83.0018 Tj
17.4609 -484.161 Td
(0235 4212 4219 4259) 83.0018 Tj
-8527.18 TJm
(4454 4478 4502 4522) 83.0018 Tj
17.4609 -493.654 Td
(4374 4770 4811) 61.1592 Tj
-11035.5 TJm
(4558 4564 4567 4583) 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 4) 187.846 Tj
17.4609 -28.4801 Td
(4603 4615 4627 4642) 83.0018 Tj
-6520.6 TJm
(ialloc 3952) 48.0537 Tj
17.4609 -37.9735 Td
(4653 4855 4979 5155) 83.0018 Tj
-8527.18 TJm
(0236 3952 3972 4821) 83.0018 Tj
17.4609 -47.4668 Td
(5170 6778 6833 6834) 83.0018 Tj
-6520.6 TJm
(IBLOCK 3190) 48.0537 Tj
17.4609 -56.9602 Td
(6964 6972 7172) 61.1592 Tj
-11035.5 TJm
(3190 3867 3961 3982) 83.0018 Tj
0 -66.4535 Td
(filealloc 4419) 61.1592 Tj
-11035.4 TJm
(I_BUSY 3266) 48.0537 Tj
17.4609 -75.9469 Td
(0225 4419 4874 5176) 83.0018 Tj
-8527.18 TJm
(3266 3861 3863 3886) 83.0018 Tj
0 -85.4403 Td
(fileclose 4452) 61.1592 Tj
-13042 TJm
(3890 3907 3909 3915) 83.0018 Tj
17.4609 -94.9336 Td
(0226 2015 4452 4458) 83.0018 Tj
-6520.6 TJm
(ICRHI 5671) 43.6851 Tj
17.4609 -104.427 Td
(4473 4647 4876 4990) 83.0018 Tj
-8527.18 TJm
(5671 5740 5786 5792) 83.0018 Tj
17.4609 -113.92 Td
(4991 5205 5209) 61.1592 Tj
-9028.94 TJm
(ICRLO 5664) 43.6851 Tj
0 -123.413 Td
(filedup 4438) 52.4222 Tj
-14045.3 TJm
(5664 5741 5742 5787) 83.0018 Tj
17.4609 -132.907 Td
(0227 1735 4438 4442) 83.0018 Tj
-8527.18 TJm
(5793) 17.4741 Tj
17.4609 -142.4 Td
(4634) 17.4741 Tj
-14045.6 TJm
(ID 5657) 30.5796 Tj
0 -151.893 Td
(fileinit 4412) 56.7907 Tj
-13543.7 TJm
(5657 5754) 39.3166 Tj
17.4609 -161.387 Td
(0228 1241 4412) 61.1592 Tj
-9028.94 TJm
(IDE_BSY 3312) 52.4222 Tj
0 -170.88 Td
(fileread 4502) 56.7907 Tj
-13543.7 TJm
(3312 3336) 39.3166 Tj
17.4609 -180.373 Td
(0229 4502 4517 4609) 83.0018 Tj
-6520.6 TJm
(IDE_CMD_READ 3317) 74.2647 Tj
0 -189.867 Td
(filestat 4478) 56.7907 Tj
-13543.7 TJm
(3317 3391) 39.3166 Tj
17.4609 -199.36 Td
(0230 4478 4658) 61.1592 Tj
-9028.94 TJm
(IDE_CMD_WRITE 3318) 78.6333 Tj
0 -208.854 Td
(file_table_lock 4408) 87.3703 Tj
-10032 TJm
(3318 3388) 39.3166 Tj
17.4609 -218.347 Td
(4408 4414 4423 4428) 83.0018 Tj
-6520.6 TJm
(IDE_DF 3314) 48.0537 Tj
17.4609 -227.84 Td
(4432 4440 4444 4456) 83.0018 Tj
-8527.18 TJm
(3314 3338) 39.3166 Tj
17.4609 -237.334 Td
(4460 4466) 39.3166 Tj
-11537.3 TJm
(IDE_DRDY 3313) 56.7907 Tj
0 -246.827 Td
(filewrite 4522) 61.1592 Tj
-13042 TJm
(3313 3336) 39.3166 Tj
17.4609 -256.32 Td
(0231 4522 4537 4621) 83.0018 Tj
-6520.6 TJm
(IDE_ERR 3315) 52.4222 Tj
0 -265.813 Td
(FL_IF 0610) 43.6851 Tj
-15048.7 TJm
(3315 3338) 39.3166 Tj
17.4609 -275.307 Td
(0610 1766) 39.3166 Tj
-11537.3 TJm
(ide_init 3351) 56.7907 Tj
0 -284.8 Td
(fork1 6931) 43.6851 Tj
-15048.7 TJm
(0251 1245 3351) 61.1592 Tj
17.4609 -294.293 Td
(6800 6842 6854 6861) 83.0018 Tj
-6520.6 TJm
(ide_intr 3402) 56.7907 Tj
17.4609 -303.787 Td
(6876 6916 6931) 61.1592 Tj
-11035.5 TJm
(0252 2561 3402) 61.1592 Tj
0 -313.28 Td
(forkret 1878) 52.4222 Tj
-12038.8 TJm
(ide_lock 3324) 56.7907 Tj
17.4609 -322.773 Td
(1615 1741 1878) 61.1592 Tj
-11035.5 TJm
(3324 3355 3406 3409) 83.0018 Tj
0 -332.267 Td
(forkret1 2484) 56.7907 Tj
-13543.7 TJm
(3426 3465 3480 3482) 83.0018 Tj
17.4609 -341.76 Td
(1616 1884 2483 2484) 83.0018 Tj
-6520.6 TJm
(ide_rw 3454) 48.0537 Tj
0 -351.254 Td
(gatedesc 0751) 56.7907 Tj
-13543.7 TJm
(0253 3454 3459 3461) 83.0018 Tj
17.4609 -360.747 Td
(0414 0417 0751 2510) 83.0018 Tj
-8527.18 TJm
(3608 3619) 39.3166 Tj
0 -370.24 Td
(getcallerpcs 1471) 74.2647 Tj
-9530.42 TJm
(ide_start_request 3375) 96.1073 Tj
17.4609 -379.734 Td
(0315 1446 1471 2129) 83.0018 Tj
-8527.18 TJm
(3328 3375 3378 3424) 83.0018 Tj
17.4609 -389.227 Td
(6525) 17.4741 Tj
-16052.2 TJm
(3475) 17.4741 Tj
0 -398.72 Td
(getcmd 6884) 48.0537 Tj
-12540.4 TJm
(ide_wait_ready 3332) 83.0018 Tj
17.4609 -408.213 Td
(6884 6915) 39.3166 Tj
-13543.9 TJm
(3332 3358 3380 3414) 83.0018 Tj
0 -417.707 Td
(gettoken 7056) 56.7907 Tj
-11537.1 TJm
(idtinit 2528) 52.4222 Tj
17.4609 -427.2 Td
(7056 7141 7145 7157) 83.0018 Tj
-8527.18 TJm
(0341 1240 1262 2528) 83.0018 Tj
17.4609 -436.693 Td
(7170 7171 7207 7211) 83.0018 Tj
-6520.6 TJm
(idup 3838) 39.3166 Tj
17.4609 -446.187 Td
(7233) 17.4741 Tj
-16052.2 TJm
(0237 1736 3838 4361) 83.0018 Tj
0 -455.68 Td
(growproc 1653) 56.7907 Tj
-11537.1 TJm
(iget 3803) 39.3166 Tj
17.4609 -465.173 Td
(0298 1653 2858) 61.1592 Tj
-11035.5 TJm
(3803 3823 3968 4234) 83.0018 Tj
0 -474.667 Td
(holding 1489) 52.4222 Tj
-14045.3 TJm
(4359) 17.4741 Tj
17.4609 -484.16 Td
(0316 1427 1454 1489) 83.0018 Tj
-6520.6 TJm
(iinit 3789) 43.6851 Tj
17.4609 -493.654 Td
(1857) 17.4741 Tj
-16052.2 TJm
(0238 1242 3789) 61.1592 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 5) 187.846 Tj
0 -28.4801 Td
(ilock 3852) 43.6851 Tj
-13042.1 TJm
(ioapic_read 5834) 69.8962 Tj
17.4609 -37.9735 Td
(0239 3852 3858 3878) 83.0018 Tj
-8527.18 TJm
(5834 5859 5860) 61.1592 Tj
17.4609 -47.4668 Td
(4364 4481 4511 4531) 83.0018 Tj
-6520.6 TJm
(ioapic_write 5841) 74.2647 Tj
17.4609 -56.9602 Td
(4672 4683 4693 4762) 83.0018 Tj
-8527.18 TJm
(5841 5867 5868 5881) 83.0018 Tj
17.4609 -66.4535 Td
(4774 4809 4813 4825) 83.0018 Tj
-8527.18 TJm
(5882) 17.4741 Tj
17.4609 -75.9469 Td
(4867 4937 5020 6394) 83.0018 Tj
-6520.6 TJm
(IO_PIC1 5907) 52.4222 Tj
17.4609 -85.4403 Td
(6463 6485) 39.3166 Tj
-13543.8 TJm
(5907 5920 5935 5944) 83.0018 Tj
0 -94.9336 Td
(inb 0354) 34.9481 Tj
-16052 TJm
(5947 5952 5962 5976) 83.0018 Tj
17.4609 -104.427 Td
(0354 0928 0936 1154) 83.0018 Tj
-8527.18 TJm
(5977) 17.4741 Tj
17.4609 -113.92 Td
(3336 3363 5646 6164) 83.0018 Tj
-6520.6 TJm
(IO_PIC2 5908) 52.4222 Tj
17.4609 -123.414 Td
(6167 6232 6257 6259) 83.0018 Tj
-8527.18 TJm
(5908 5921 5936 5965) 83.0018 Tj
0 -132.907 Td
(INDIRECT 3168) 56.7907 Tj
-13543.7 TJm
(5966 5967 5970 5979) 83.0018 Tj
17.4609 -142.4 Td
(3168 4027 4030 4065) 83.0018 Tj
-8527.18 TJm
(5980) 17.4741 Tj
17.4609 -151.894 Td
(4066 4073) 39.3166 Tj
-11537.3 TJm
(IO_TIMER1 6559) 61.1592 Tj
0 -161.387 Td
(initlock 1413) 56.7907 Tj
-13543.7 TJm
(6559 6568 6578 6579) 83.0018 Tj
17.4609 -170.88 Td
(0317 1413 1621 2231) 83.0018 Tj
-6520.6 TJm
(IPB 3187) 34.9481 Tj
17.4609 -180.374 Td
(2524 3355 3542 3791) 83.0018 Tj
-8527.18 TJm
(3187 3190 3196 3868) 83.0018 Tj
17.4609 -189.867 Td
(4414 5184 6503 6504) 83.0018 Tj
-8527.18 TJm
(3962 3983) 39.3166 Tj
0 -199.361 Td
(inode 3252) 43.6851 Tj
-13042.1 TJm
(iput 3902) 39.3166 Tj
17.4609 -208.854 Td
(0203 0234 0235 0236) 83.0018 Tj
-8527.18 TJm
(0240 2020 3902 3908) 83.0018 Tj
17.4609 -218.347 Td
(0237 0239 0240 0241) 83.0018 Tj
-8527.18 TJm
(3927 4260 4382 4471) 83.0018 Tj
17.4609 -227.841 Td
(0242 0243 0245 0246) 83.0018 Tj
-8527.18 TJm
(4687 4943) 39.3166 Tj
17.4609 -237.334 Td
(0247 0248 0249 1539) 83.0018 Tj
-6520.6 TJm
(IRQ_ERROR 2384) 61.1592 Tj
17.4609 -246.827 Td
(2951 2952 3106 3252) 83.0018 Tj
-8527.18 TJm
(2384 5730) 39.3166 Tj
17.4609 -256.321 Td
(3675 3785 3802 3805) 83.0018 Tj
-6520.6 TJm
(IRQ_IDE 2383) 52.4222 Tj
17.4609 -265.814 Td
(3811 3837 3838 3852) 83.0018 Tj
-8527.18 TJm
(2383 2560 3356 3357) 83.0018 Tj
17.4609 -275.307 Td
(3884 3902 3924 3951) 83.0018 Tj
-6520.6 TJm
(IRQ_KBD 2382) 52.4222 Tj
17.4609 -284.801 Td
(3977 4010 4052 4082) 83.0018 Tj
-8527.18 TJm
(2382 2564 6510 6511) 83.0018 Tj
17.4609 -294.294 Td
(4102 4152 4211 4212) 83.0018 Tj
-6520.6 TJm
(IRQ_OFFSET 2379) 65.5277 Tj
17.4609 -303.788 Td
(4252 4256 4353 4356) 83.0018 Tj
-8527.18 TJm
(2379 2551 2560 2564) 83.0018 Tj
17.4609 -313.281 Td
(4388 4395 4666 4702) 83.0018 Tj
-8527.18 TJm
(2568 2595 5707 5718) 83.0018 Tj
17.4609 -322.774 Td
(4753 4800 4804 4856) 83.0018 Tj
-8527.18 TJm
(5730 5867 5881 5947) 83.0018 Tj
17.4609 -332.268 Td
(4903 4921 4933 5015) 83.0018 Tj
-8527.18 TJm
(5966) 17.4741 Tj
17.4609 -341.761 Td
(6385 6451) 39.3166 Tj
-11537.3 TJm
(IRQ_SLAVE 5910) 61.1592 Tj
0 -351.254 Td
(INPUT_BUF 6400) 61.1592 Tj
-13042 TJm
(5910 5914 5952 5967) 83.0018 Tj
17.4609 -360.748 Td
(6400 6403 6424 6436) 83.0018 Tj
-6520.6 TJm
(IRQ_SPURIOUS 2385) 74.2647 Tj
17.4609 -370.241 Td
(6439 6481) 39.3166 Tj
-13543.8 TJm
(2385 2568 5707) 61.1592 Tj
0 -379.734 Td
(insl 0363) 39.3166 Tj
-13543.8 TJm
(IRQ_TIMER 2381) 61.1592 Tj
17.4609 -389.228 Td
(0363 1173 3415) 61.1592 Tj
-11035.5 TJm
(2381 2551 2595 5718) 83.0018 Tj
0 -398.721 Td
(INT_DISABLED 5819) 74.2647 Tj
-11537 TJm
(6580) 17.4741 Tj
17.4609 -408.214 Td
(5819 5867) 39.3166 Tj
-11537.3 TJm
(isdirempty 4702) 65.5277 Tj
0 -417.707 Td
(IOAPIC 5808) 48.0537 Tj
-14547 TJm
(4702 4709 4778) 61.1592 Tj
17.4609 -427.201 Td
(5808 5858) 39.3166 Tj
-11537.3 TJm
(ismp 5514) 39.3166 Tj
0 -436.694 Td
(ioapic_enable 5873) 78.6333 Tj
-11035.3 TJm
(0280 1247 5514 5613) 83.0018 Tj
17.4609 -446.188 Td
(0256 3357 5873 6511) 83.0018 Tj
-8527.18 TJm
(5855 5875) 39.3166 Tj
0 -455.681 Td
(ioapic_id 5516) 61.1592 Tj
-11035.4 TJm
(itrunc 4052) 48.0537 Tj
17.4609 -465.174 Td
(0257 5516 5628 5861) 83.0018 Tj
-8527.18 TJm
(3675 3911 4052) 61.1592 Tj
17.4609 -474.668 Td
(5862) 17.4741 Tj
-14045.6 TJm
(iunlock 3884) 52.4222 Tj
0 -484.161 Td
(ioapic_init 5851) 69.8962 Tj
-12038.7 TJm
(0241 3884 3887 3926) 83.0018 Tj
17.4609 -493.654 Td
(0258 1237 5851 5862) 83.0018 Tj
-8527.18 TJm
(4371 4483 4514 4534) 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 6) 187.846 Tj
17.4609 -28.4801 Td
(4679 4880 4942 6389) 83.0018 Tj
-8527.18 TJm
(6024 6067 6089 6113) 83.0018 Tj
17.4609 -37.9735 Td
(6456) 17.4741 Tj
-14045.6 TJm
(KEY_UP 6021) 48.0537 Tj
0 -47.4668 Td
(iunlockput 3924) 65.5277 Tj
-12540.3 TJm
(6021 6065 6087 6111) 83.0018 Tj
17.4609 -56.9602 Td
(0242 3924 4366 4375) 83.0018 Tj
-6520.6 TJm
(kfree 2255) 43.6851 Tj
17.4609 -66.4535 Td
(4378 4674 4686 4692) 83.0018 Tj
-8527.18 TJm
(0262 1664 1726 2069) 83.0018 Tj
17.4609 -75.9469 Td
(4696 4766 4771 4779) 83.0018 Tj
-8527.18 TJm
(2070 2236 2255 2260) 83.0018 Tj
17.4609 -85.4403 Td
(4780 4787 4791 4812) 83.0018 Tj
-8527.18 TJm
(5101 5111 5202 5228) 83.0018 Tj
17.4609 -94.9336 Td
(4815 4822 4833 4834) 83.0018 Tj
-6520.6 TJm
(kill 1976) 39.3166 Tj
17.4609 -104.427 Td
(4845 4869 4877 4913) 83.0018 Tj
-8527.18 TJm
(0299 1976 2581 2837) 83.0018 Tj
17.4609 -113.92 Td
(4925 4939 5069 5112) 83.0018 Tj
-8527.18 TJm
(6717) 17.4741 Tj
0 -123.413 Td
(iupdate 3977) 52.4222 Tj
-12038.8 TJm
(kinit 2225) 43.6851 Tj
17.4609 -132.907 Td
(0243 3913 3977 4077) 83.0018 Tj
-8527.18 TJm
(0263 1238 2225) 61.1592 Tj
17.4609 -142.4 Td
(4178 4678 4695 4790) 83.0018 Tj
-6520.6 TJm
(KSTACKSIZE 0152) 65.5277 Tj
17.4609 -151.893 Td
(4829 4840) 39.3166 Tj
-13543.9 TJm
(0152 1679 1714 1718) 83.0018 Tj
0 -161.387 Td
(I_VALID 3267) 52.4222 Tj
-14045.3 TJm
(1726 2070) 39.3166 Tj
17.4609 -170.88 Td
(3267 3866 3876 3905) 83.0018 Tj
-6520.6 TJm
(lapic_eoi 5760) 61.1592 Tj
0 -180.373 Td
(kalloc 2304) 48.0537 Tj
-14547 TJm
(0273 2558 2562 2566) 83.0018 Tj
17.4609 -189.867 Td
(0261 1657 1714 1725) 83.0018 Tj
-8527.18 TJm
(2570 5760) 39.3166 Tj
17.4609 -199.36 Td
(1759 2231 2304 2310) 83.0018 Tj
-6520.6 TJm
(lapic_init 5701) 65.5277 Tj
17.4609 -208.854 Td
(2328 5052 5178) 61.1592 Tj
-11035.5 TJm
(0274 1231 1263 5701) 83.0018 Tj
0 -218.347 Td
(kalloc_lock 2212) 69.8962 Tj
-10032.1 TJm
(lapic_startap 5780) 78.6333 Tj
17.4609 -227.84 Td
(2212 2231 2265 2293) 83.0018 Tj
-8527.18 TJm
(0275 1293 5780) 61.1592 Tj
17.4609 -237.334 Td
(2312 2316 2322 2326) 83.0018 Tj
-6520.6 TJm
(lgdt 0403) 39.3166 Tj
0 -246.827 Td
(KBDATAP 6004) 52.4222 Tj
-14045.3 TJm
(0403 0411 0954 1054) 83.0018 Tj
17.4609 -256.32 Td
(6004 6167) 39.3166 Tj
-13543.9 TJm
(1696) 17.4741 Tj
0 -265.813 Td
(kbd_getc 6156) 56.7907 Tj
-11537.1 TJm
(lidt 0417) 39.3166 Tj
17.4609 -275.307 Td
(6156 6198) 39.3166 Tj
-13543.9 TJm
(0417 0425 2530) 61.1592 Tj
0 -284.8 Td
(kbd_intr 6196) 56.7907 Tj
-11537.1 TJm
(LINT0 5676) 43.6851 Tj
17.4609 -294.293 Td
(0266 2565 6196) 61.1592 Tj
-11035.5 TJm
(5676 5721) 39.3166 Tj
0 -303.787 Td
(KBS_DIB 6003) 52.4222 Tj
-12038.8 TJm
(LINT1 5677) 43.6851 Tj
17.4609 -313.28 Td
(6003 6165) 39.3166 Tj
-13543.9 TJm
(5677 5722) 39.3166 Tj
0 -322.773 Td
(KBSTATP 6002) 52.4222 Tj
-12038.8 TJm
(LIST 6760) 39.3166 Tj
17.4609 -332.267 Td
(6002 6164) 39.3166 Tj
-13543.9 TJm
(6760 6840 7007 7283) 83.0018 Tj
0 -341.76 Td
(KEY_DEL 6028) 52.4222 Tj
-12038.8 TJm
(listcmd 6790 7001) 74.2647 Tj
17.4609 -351.254 Td
(6028 6069 6091 6115) 83.0018 Tj
-8527.18 TJm
(6790 6811 6841 7001) 83.0018 Tj
0 -360.747 Td
(KEY_DN 6022) 48.0537 Tj
-14547 TJm
(7003 7146 7257 7284) 83.0018 Tj
17.4609 -370.24 Td
(6022 6065 6087 6111) 83.0018 Tj
-6520.6 TJm
(LPTPORT 6215) 52.4222 Tj
0 -379.734 Td
(KEY_END 6020) 52.4222 Tj
-14045.3 TJm
(6215 6232 6236 6237) 83.0018 Tj
17.4609 -389.227 Td
(6020 6068 6090 6114) 83.0018 Tj
-8527.18 TJm
(6238) 17.4741 Tj
0 -398.72 Td
(KEY_HOME 6019) 56.7907 Tj
-11537.1 TJm
(lpt_putc 6228) 56.7907 Tj
17.4609 -408.213 Td
(6019 6068 6090 6114) 83.0018 Tj
-8527.18 TJm
(6228 6291) 39.3166 Tj
0 -417.707 Td
(KEY_INS 6027) 52.4222 Tj
-12038.8 TJm
(ltr 0429) 34.9481 Tj
17.4609 -427.2 Td
(6027 6069 6091 6115) 83.0018 Tj
-8527.18 TJm
(0429 0431 1697) 61.1592 Tj
0 -436.693 Td
(KEY_LF 6023) 48.0537 Tj
-12540.4 TJm
(MAXARGS 6763) 52.4222 Tj
17.4609 -446.187 Td
(6023 6067 6089 6113) 83.0018 Tj
-8527.18 TJm
(6763 6771 6772 7240) 83.0018 Tj
0 -455.68 Td
(KEY_PGDN 6026) 56.7907 Tj
-11537.1 TJm
(MAXFILE 3170) 52.4222 Tj
17.4609 -465.173 Td
(6026 6066 6088 6112) 83.0018 Tj
-8527.18 TJm
(3170 4165 4166) 61.1592 Tj
0 -474.667 Td
(KEY_PGUP 6025) 56.7907 Tj
-11537.1 TJm
(memcmp 5315) 48.0537 Tj
17.4609 -484.16 Td
(6025 6066 6088 6112) 83.0018 Tj
-8527.18 TJm
(0321 5315 5543 5588) 83.0018 Tj
0 -493.654 Td
(KEY_RT 6024) 48.0537 Tj
-12540.4 TJm
(memmove 5331) 52.4222 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 7) 187.846 Tj
17.4609 -28.4801 Td
(0322 1284 1660 1722) 83.0018 Tj
-8527.18 TJm
(3166 3179 3263) 61.1592 Tj
17.4609 -37.9735 Td
(1731 1775 3684 3874) 83.0018 Tj
-6520.6 TJm
(namecmp 4203) 52.4222 Tj
17.4609 -47.4668 Td
(3989 4121 4171 4328) 83.0018 Tj
-8527.18 TJm
(0244 4203 4228 4765) 83.0018 Tj
17.4609 -56.9602 Td
(4330 5080 5331 6270) 83.0018 Tj
-6520.6 TJm
(namei 4389) 43.6851 Tj
0 -66.4535 Td
(memset 5303) 48.0537 Tj
-14547 TJm
(0245 1760 4389 4670) 83.0018 Tj
17.4609 -75.9469 Td
(0323 1218 1661 1740) 83.0018 Tj
-8527.18 TJm
(4865 4935 5018) 61.1592 Tj
17.4609 -85.4403 Td
(1761 2263 3695 3964) 83.0018 Tj
-6520.6 TJm
(_namei 4354) 48.0537 Tj
17.4609 -94.9336 Td
(4784 4959 5055 5067) 83.0018 Tj
-8527.18 TJm
(4354 4392 4398) 61.1592 Tj
17.4609 -104.427 Td
(5303 6272 6887 6958) 83.0018 Tj
-6520.6 TJm
(nameiparent 4396) 69.8962 Tj
17.4609 -113.92 Td
(6969 6985 7006 7019) 83.0018 Tj
-8527.18 TJm
(0246 4396 4681 4760) 83.0018 Tj
0 -123.413 Td
(microdelay 5769) 65.5277 Tj
-12540.3 TJm
(4807) 17.4741 Tj
17.4609 -132.907 Td
(5769 5788) 39.3166 Tj
-11537.3 TJm
(NBUF 0156) 39.3166 Tj
0 -142.4 Td
(min 3674) 34.9481 Tj
-16052 TJm
(0156 3529 3553) 61.1592 Tj
17.4609 -151.893 Td
(3674 4120 4170) 61.1592 Tj
-9028.94 TJm
(NCPU 0153) 39.3166 Tj
0 -161.387 Td
(mp 5402) 30.5796 Tj
174.613 -161.387 Td
(0153 1221 1559 1576) 83.0018 Tj
17.461 -170.88 Td
(5402 5507 5536 5542) 83.0018 Tj
-8527.18 TJm
(1611 5512) 39.3166 Tj
17.461 -180.373 Td
(5543 5544 5555 5560) 83.0018 Tj
-6520.6 TJm
(NDEV 0158) 39.3166 Tj
17.461 -189.867 Td
(5564 5565 5568 5569) 83.0018 Tj
-8527.18 TJm
(0158 4108 4158 4407) 83.0018 Tj
17.461 -199.36 Td
(5580 5583 5585 5587) 83.0018 Tj
-6520.6 TJm
(NDIRECT 3167) 52.4222 Tj
17.461 -208.854 Td
(5594 5604 5610 5642) 83.0018 Tj
-8527.18 TJm
(3166 3167 3170 4015) 83.0018 Tj
1e-04 -218.347 Td
(mp_bcpu 5519) 52.4222 Tj
-14045.3 TJm
(4023 4058) 39.3166 Tj
17.461 -227.84 Td
(0281 1225 5519) 61.1592 Tj
-9028.94 TJm
(NELEM 0347) 43.6851 Tj
1e-04 -237.334 Td
(MPBUS 5452) 43.6851 Tj
-15048.7 TJm
(0347 2123 2779 4961) 83.0018 Tj
17.461 -246.827 Td
(5452 5631) 39.3166 Tj
-11537.3 TJm
(NFILE 0155) 43.6851 Tj
1e-04 -256.32 Td
(mpconf 5413) 48.0537 Tj
-14547 TJm
(0155 4409 4424) 61.1592 Tj
17.461 -265.813 Td
(5413 5579 5582 5587) 83.0018 Tj
-6520.6 TJm
(NINDIRECT 3169) 61.1592 Tj
17.461 -275.307 Td
(5605) 17.4741 Tj
-16052.2 TJm
(3169 3170 4025 4068) 83.0018 Tj
1e-04 -284.8 Td
(mp_config 5580) 61.1592 Tj
-11035.4 TJm
(NINODE 0157) 48.0537 Tj
17.461 -294.293 Td
(5580 5610) 39.3166 Tj
-13543.8 TJm
(0157 3785 3811) 61.1592 Tj
1e-04 -303.787 Td
(mp_init 5601) 52.4222 Tj
-12038.8 TJm
(NO 6006) 30.5796 Tj
17.461 -313.28 Td
(0282 1224 5601 5637) 83.0018 Tj
-8527.18 TJm
(6006 6052 6055 6057) 83.0018 Tj
17.461 -322.773 Td
(5638) 17.4741 Tj
-16052.2 TJm
(6058 6059 6060 6062) 83.0018 Tj
1e-04 -332.267 Td
(mpioapic 5439) 56.7907 Tj
-13543.7 TJm
(6074 6077 6079 6080) 83.0018 Tj
17.461 -341.76 Td
(5439 5607 5627 5629) 83.0018 Tj
-8527.18 TJm
(6081 6082 6084 6102) 83.0018 Tj
1e-04 -351.254 Td
(MPIOINTR 5454) 56.7907 Tj
-13543.7 TJm
(6103 6105 6106 6107) 83.0018 Tj
17.461 -360.747 Td
(5454 5632) 39.3166 Tj
-13543.8 TJm
(6108) 17.4741 Tj
1e-04 -370.24 Td
(MPLINTR 5455) 52.4222 Tj
-12038.8 TJm
(NOFILE 0154) 48.0537 Tj
17.461 -379.734 Td
(5455 5633) 39.3166 Tj
-13543.8 TJm
(0154 1538 1733 2013) 83.0018 Tj
1e-04 -389.227 Td
(mpmain 1259) 48.0537 Tj
-14547 TJm
(4571 4587) 39.3166 Tj
17.461 -398.72 Td
(1259 1292) 39.3166 Tj
-11537.3 TJm
(NPROC 0150) 43.6851 Tj
1e-04 -408.213 Td
(mpproc 5428) 48.0537 Tj
-14547 TJm
(0150 1610 1634 1817) 83.0018 Tj
17.461 -417.707 Td
(5428 5606 5619 5624) 83.0018 Tj
-8527.18 TJm
(1957 1981 2029 2062) 83.0018 Tj
1e-04 -427.2 Td
(mp_search 5556) 61.1592 Tj
-13042 TJm
(2119) 17.4741 Tj
17.461 -436.693 Td
(5556 5585) 39.3166 Tj
-11537.3 TJm
(NSEGS 1506) 43.6851 Tj
1e-04 -446.187 Td
(mp_search1 5537) 65.5277 Tj
-12540.3 TJm
(1506 1570) 39.3166 Tj
17.461 -455.68 Td
(5537 5564 5568 5571) 83.0018 Tj
-6520.6 TJm
(nulterminate 7252) 74.2647 Tj
1e-04 -465.173 Td
(MPSTACK 1563) 52.4222 Tj
-14045.3 TJm
(7115 7130 7252 7273) 83.0018 Tj
17.461 -474.667 Td
(1228 1229 1291 1563) 83.0018 Tj
-8527.18 TJm
(7279 7280 7285 7286) 83.0018 Tj
17.461 -484.16 Td
(1571) 17.4741 Tj
-16052.2 TJm
(7291) 17.4741 Tj
1e-04 -493.654 Td
(NADDRS 3166) 48.0537 Tj
-12540.4 TJm
(NUMLOCK 6013) 52.4222 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 8) 187.846 Tj
17.4609 -28.4801 Td
(6013 6046) 39.3166 Tj
-13543.9 TJm
(7201 7206 7225) 61.1592 Tj
0 -37.9735 Td
(O_CREATE 3003) 56.7907 Tj
-11537.1 TJm
(parsecmd 7118) 56.7907 Tj
17.4609 -47.4668 Td
(3003 4861 7178 7181) 83.0018 Tj
-8527.18 TJm
(6802 6917 7118) 61.1592 Tj
0 -56.9602 Td
(O_RDONLY 3000) 56.7907 Tj
-11537.1 TJm
(parseexec 7217) 61.1592 Tj
17.4609 -66.4535 Td
(3000 7175) 39.3166 Tj
-13543.9 TJm
(7114 7155 7217) 61.1592 Tj
0 -75.9469 Td
(O_RDWR 3002) 48.0537 Tj
-12540.4 TJm
(parseline 7135) 61.1592 Tj
17.4609 -85.4403 Td
(3002 4868 4886 6664) 83.0018 Tj
-8527.18 TJm
(7112 7124 7135 7146) 83.0018 Tj
17.4609 -94.9336 Td
(6666 6907) 39.3166 Tj
-13543.9 TJm
(7208) 17.4741 Tj
0 -104.427 Td
(outb 0372) 39.3166 Tj
-13543.8 TJm
(parsepipe 7151) 61.1592 Tj
17.4609 -113.92 Td
(0372 0933 0941 1164) 83.0018 Tj
-8527.18 TJm
(7113 7139 7151 7158) 83.0018 Tj
17.4609 -123.414 Td
(1165 1166 1167 1168) 83.0018 Tj
-6520.6 TJm
(parseredirs 7164) 69.8962 Tj
17.4609 -132.907 Td
(1169 3361 3370 3381) 83.0018 Tj
-8527.18 TJm
(7164 7212 7231 7242) 83.0018 Tj
17.4609 -142.4 Td
(3382 3383 3384 3385) 83.0018 Tj
-6520.6 TJm
(PCINT 5675) 43.6851 Tj
17.4609 -151.894 Td
(3386 3388 3391 5645) 83.0018 Tj
-8527.18 TJm
(5675 5727) 39.3166 Tj
17.4609 -161.387 Td
(5646 5920 5921 5935) 83.0018 Tj
-6520.6 TJm
(peek 7101) 39.3166 Tj
17.4609 -170.88 Td
(5936 5944 5947 5952) 83.0018 Tj
-8527.18 TJm
(7101 7125 7140 7144) 83.0018 Tj
17.4609 -180.374 Td
(5962 5965 5966 5967) 83.0018 Tj
-8527.18 TJm
(7156 7169 7205 7209) 83.0018 Tj
17.4609 -189.867 Td
(5970 5976 5977 5979) 83.0018 Tj
-8527.18 TJm
(7224 7232) 39.3166 Tj
17.4609 -199.361 Td
(5980 6236 6237 6238) 83.0018 Tj
-6520.6 TJm
(pic_enable 5925) 65.5277 Tj
17.4609 -208.854 Td
(6256 6258 6275 6276) 83.0018 Tj
-8527.18 TJm
(0286 3356 5925 6510) 83.0018 Tj
17.4609 -218.347 Td
(6277 6278 6577 6578) 83.0018 Tj
-8527.18 TJm
(6580) 17.4741 Tj
17.4609 -227.841 Td
(6579) 17.4741 Tj
-14045.6 TJm
(pic_init 5932) 56.7907 Tj
0 -237.334 Td
(outsl 0384) 43.6851 Tj
-15048.7 TJm
(0287 1236 5932) 61.1592 Tj
17.4609 -246.827 Td
(0384 3389) 39.3166 Tj
-11537.3 TJm
(pic_setmask 5917) 69.8962 Tj
0 -256.321 Td
(outw 0378) 39.3166 Tj
-15550.3 TJm
(5917 5927 5983) 61.1592 Tj
17.4609 -265.814 Td
(0378 1144 1145) 61.1592 Tj
-9028.94 TJm
(pinit 1619) 43.6851 Tj
0 -275.307 Td
(O_WRONLY 3001) 56.7907 Tj
-13543.7 TJm
(0300 1234 1619) 61.1592 Tj
17.4609 -284.8 Td
(3001 4868 4885 4886) 83.0018 Tj
-6520.6 TJm
(pipe 5160) 39.3166 Tj
17.4609 -294.294 Td
(7178 7181) 39.3166 Tj
-13543.9 TJm
(0204 0291 0292 0293) 83.0018 Tj
0 -303.787 Td
(PAGE 0151) 39.3166 Tj
-15550.3 TJm
(3105 4469 4509 4529) 83.0018 Tj
17.4609 -313.281 Td
(0151 0152 1758 2233) 83.0018 Tj
-8527.18 TJm
(5160 5172 5178 5184) 83.0018 Tj
17.4609 -322.774 Td
(2235 2236 2259 2309) 83.0018 Tj
-8527.18 TJm
(5188 5192 5215 5251) 83.0018 Tj
17.4609 -332.267 Td
(5049 5051 5178 5202) 83.0018 Tj
-8527.18 TJm
(5274 6713 6852 6853) 83.0018 Tj
17.4609 -341.761 Td
(5228) 17.4741 Tj
-14045.6 TJm
(pipealloc 5170) 61.1592 Tj
0 -351.254 Td
(panic 6515 6924) 65.5277 Tj
-12540.3 TJm
(0290 4984 5170) 61.1592 Tj
17.4609 -360.747 Td
(0219 1428 1455 1856) 83.0018 Tj
-6520.6 TJm
(pipeclose 5215) 61.1592 Tj
17.4609 -370.241 Td
(1858 1860 1906 1909) 83.0018 Tj
-8527.18 TJm
(0291 4469 5215) 61.1592 Tj
17.4609 -379.734 Td
(2010 2041 2260 2271) 83.0018 Tj
-6520.6 TJm
(pipecmd 6784 6980) 74.2647 Tj
17.4609 -389.227 Td
(2310 2578 3378 3459) 83.0018 Tj
-8527.18 TJm
(6784 6812 6851 6980) 83.0018 Tj
17.4609 -398.721 Td
(3461 3463 3596 3617) 83.0018 Tj
-8527.18 TJm
(6982 7158 7258 7278) 83.0018 Tj
17.4609 -408.214 Td
(3627 3725 3743 3823) 83.0018 Tj
-6520.6 TJm
(piperead 5274) 56.7907 Tj
17.4609 -417.707 Td
(3858 3878 3887 3908) 83.0018 Tj
-8527.18 TJm
(0292 4509 5274) 61.1592 Tj
17.4609 -427.201 Td
(3972 4047 4219 4267) 83.0018 Tj
-6520.6 TJm
(PIPESIZE 5158) 56.7907 Tj
17.4609 -436.694 Td
(4275 4442 4458 4473) 83.0018 Tj
-8527.18 TJm
(5158 5166 5257 5266) 83.0018 Tj
17.4609 -446.188 Td
(4517 4537 4709 4777) 83.0018 Tj
-8527.18 TJm
(5290) 17.4741 Tj
17.4609 -455.681 Td
(4786 4843 5638 6515) 83.0018 Tj
-6520.6 TJm
(pipewrite 5251) 61.1592 Tj
17.4609 -465.174 Td
(6522 6801 6820 6853) 83.0018 Tj
-8527.18 TJm
(0293 4529 5251) 61.1592 Tj
17.4609 -474.668 Td
(6924 6937 7128 7172) 83.0018 Tj
-6520.6 TJm
(printint 6301) 56.7907 Tj
17.4609 -484.161 Td
(7206 7210 7236 7241) 83.0018 Tj
-8527.18 TJm
(6301 6353 6357) 61.1592 Tj
0 -493.654 Td
(parseblock 7201) 65.5277 Tj
-10533.8 TJm
(proc 1529) 39.3166 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 9) 187.846 Tj
17.4609 -28.4801 Td
(0205 0296 0303 0333) 83.0018 Tj
-8527.18 TJm
(1643 1836 1872 1881) 83.0018 Tj
17.4609 -37.9735 Td
(0334 1204 1407 1529) 83.0018 Tj
-8527.18 TJm
(1919 1932 1969 1987) 83.0018 Tj
17.4609 -47.4668 Td
(1535 1559 1605 1610) 83.0018 Tj
-8527.18 TJm
(1991 2076 2085 2293) 83.0018 Tj
17.4609 -56.9602 Td
(1611 1612 1627 1631) 83.0018 Tj
-8527.18 TJm
(2316 2322 2326 2556) 83.0018 Tj
17.4609 -66.4535 Td
(1635 1672 1703 1704) 83.0018 Tj
-8527.18 TJm
(2875 2880 3409 3426) 83.0018 Tj
17.4609 -75.9469 Td
(1707 1754 1810 1818) 83.0018 Tj
-8527.18 TJm
(3482 3581 3592 3641) 83.0018 Tj
17.4609 -85.4403 Td
(1955 1957 1978 1981) 83.0018 Tj
-8527.18 TJm
(3814 3830 3842 3864) 83.0018 Tj
17.4609 -94.9336 Td
(2006 2029 2055 2063) 83.0018 Tj
-8527.18 TJm
(3892 3910 3919 4428) 83.0018 Tj
17.4609 -104.427 Td
(2115 2120 2504 2581) 83.0018 Tj
-8527.18 TJm
(4432 4444 4460 4466) 83.0018 Tj
17.4609 -113.92 Td
(2654 2666 2678 2804) 83.0018 Tj
-8527.18 TJm
(5225 5259 5269 5281) 83.0018 Tj
17.4609 -123.414 Td
(2809 3306 3667 4555) 83.0018 Tj
-8527.18 TJm
(5293 6381 6393 6447) 83.0018 Tj
17.4609 -132.907 Td
(5003 5154 5510 5606) 83.0018 Tj
-8527.18 TJm
(6462 6484) 39.3166 Tj
17.4609 -142.4 Td
(5619 5620 5621 6211) 83.0018 Tj
-6520.6 TJm
(ROOTDEV 0159) 52.4222 Tj
0 -151.894 Td
(procdump 2104) 56.7907 Tj
-13543.7 TJm
(0159 4359) 39.3166 Tj
17.4609 -161.387 Td
(0301 2104 6420) 61.1592 Tj
-9028.94 TJm
(run 2214) 34.9481 Tj
0 -170.88 Td
(proc_table_lock 1608) 87.3703 Tj
-10032 TJm
(2111 2214 2215 2218) 83.0018 Tj
17.4609 -180.374 Td
(1608 1621 1633 1639) 83.0018 Tj
-8527.18 TJm
(2257 2266 2267 2269) 83.0018 Tj
17.4609 -189.867 Td
(1643 1815 1836 1857) 83.0018 Tj
-8527.18 TJm
(2307) 17.4741 Tj
17.4609 -199.361 Td
(1858 1869 1872 1881) 83.0018 Tj
-6520.6 TJm
(runcmd 6806) 48.0537 Tj
17.4609 -208.854 Td
(1917 1918 1931 1932) 83.0018 Tj
-8527.18 TJm
(6806 6820 6837 6843) 83.0018 Tj
17.4609 -218.347 Td
(1967 1969 1980 1987) 83.0018 Tj
-8527.18 TJm
(6845 6859 6866 6877) 83.0018 Tj
17.4609 -227.841 Td
(1991 2023 2058 2076) 83.0018 Tj
-8527.18 TJm
(6917) 17.4741 Tj
17.4609 -237.334 Td
(2085 2090) 39.3166 Tj
-11537.3 TJm
(RUNNING 1526) 52.4222 Tj
0 -246.827 Td
(proghdr 0824) 52.4222 Tj
-14045.3 TJm
(1526 1827 1855 2111) 83.0018 Tj
17.4609 -256.321 Td
(0824 1120 1133 5016) 83.0018 Tj
-8527.18 TJm
(2595) 17.4741 Tj
0 -265.814 Td
(readi 4102) 43.6851 Tj
-13042.1 TJm
(safestrcpy 5375) 65.5277 Tj
17.4609 -275.307 Td
(0247 4102 4266 4512) 83.0018 Tj
-8527.18 TJm
(0324 1776 5097 5375) 83.0018 Tj
17.4609 -284.8 Td
(4708 4709 5027 5032) 83.0018 Tj
-6520.6 TJm
(sched 1853) 43.6851 Tj
17.4609 -294.294 Td
(5059 5065) 39.3166 Tj
-13543.8 TJm
(1853 1856 1858 1860) 83.0018 Tj
0 -303.787 Td
(readsb 3679) 48.0537 Tj
-14547 TJm
(1871 1925 2040) 61.1592 Tj
17.4609 -313.281 Td
(3679 3711 3738 3959) 83.0018 Tj
-6520.6 TJm
(scheduler 1808) 61.1592 Tj
0 -322.774 Td
(readsect 1160) 56.7907 Tj
-13543.7 TJm
(0302 1254 1272 1808) 83.0018 Tj
17.4609 -332.267 Td
(1160 1196) 39.3166 Tj
-11537.3 TJm
(SCROLLLOCK 6014) 65.5277 Tj
0 -341.761 Td
(readseg 1179) 52.4222 Tj
-14045.3 TJm
(6014 6047) 39.3166 Tj
17.4609 -351.254 Td
(1114 1126 1136 1179) 83.0018 Tj
-6520.6 TJm
(SECTSIZE 1112) 56.7907 Tj
0 -360.747 Td
(REDIR 6758) 43.6851 Tj
-15048.7 TJm
(1112 1126 1173 1187) 83.0018 Tj
17.4609 -370.241 Td
(6758 6830 6970 7271) 83.0018 Tj
-8527.18 TJm
(1190 1195) 39.3166 Tj
0 -379.734 Td
(redircmd 6775 6964) 78.6333 Tj
-9028.76 TJm
(SEG 0654) 34.9481 Tj
17.4609 -389.227 Td
(6775 6813 6831 6964) 83.0018 Tj
-8527.18 TJm
(0654 1684 1685 1689) 83.0018 Tj
17.4609 -398.721 Td
(6966 7175 7178 7181) 83.0018 Tj
-8527.18 TJm
(1690) 17.4741 Tj
17.4609 -408.214 Td
(7259 7272) 39.3166 Tj
-11537.3 TJm
(SEG16 0659) 43.6851 Tj
0 -417.707 Td
(REG_ID 5810) 48.0537 Tj
-14547 TJm
(0659 1686) 39.3166 Tj
17.4609 -427.201 Td
(5810 5860) 39.3166 Tj
-11537.3 TJm
(SEG_ASM 0558) 52.4222 Tj
0 -436.694 Td
(REG_TABLE 5812) 61.1592 Tj
-13042 TJm
(0558 0985 0986 1081) 83.0018 Tj
17.4609 -446.188 Td
(5812 5867 5868 5881) 83.0018 Tj
-8527.18 TJm
(1082) 17.4741 Tj
17.4609 -455.681 Td
(5882) 17.4741 Tj
-14045.6 TJm
(segdesc 0627) 52.4222 Tj
0 -465.174 Td
(REG_VER 5811) 52.4222 Tj
-14045.3 TJm
(0400 0403 0627 0651) 83.0018 Tj
17.4609 -474.668 Td
(5811 5859) 39.3166 Tj
-13543.8 TJm
(0654 0659 1570) 61.1592 Tj
0 -484.161 Td
(release 1452) 52.4222 Tj
-12038.8 TJm
(SEG_KCODE 1501) 61.1592 Tj
17.4609 -493.654 Td
(0318 1452 1455 1639) 83.0018 Tj
-8527.18 TJm
(1501 1684 2521 2522) 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 10) 192.215 Tj
0 -28.4801 Td
(SEG_KDATA 1502) 61.1592 Tj
-11035.4 TJm
(STA_W 0566 0670) 65.5277 Tj
17.4609 -37.9735 Td
(1502 1677 1685) 61.1592 Tj
-11035.5 TJm
(0566 0670 0986 1082) 83.0018 Tj
0 -47.4668 Td
(SEG_NULL 0651) 56.7907 Tj
-13543.7 TJm
(1685 1690) 39.3166 Tj
17.4609 -56.9602 Td
(0651 1683 1692 1693) 83.0018 Tj
-6520.6 TJm
(STA_X 0563 0667) 65.5277 Tj
0 -66.4535 Td
(SEG_NULLASM 0554) 69.8962 Tj
-12038.7 TJm
(0563 0667 0985 1081) 83.0018 Tj
17.4609 -75.9469 Td
(0554 0984 1080) 61.1592 Tj
-11035.5 TJm
(1684 1689) 39.3166 Tj
0 -85.4403 Td
(SEG_TSS 1505) 52.4222 Tj
-12038.8 TJm
(sti 0488) 34.9481 Tj
17.4609 -94.9336 Td
(1505 1686 1687 1697) 83.0018 Tj
-8527.18 TJm
(0488 0490 1252 1270) 83.0018 Tj
0 -104.427 Td
(SEG_UCODE 1503) 61.1592 Tj
-13042 TJm
(1466) 17.4741 Tj
17.4609 -113.92 Td
(1503 1689 1692 1762) 83.0018 Tj
-6520.6 TJm
(strlen 5389) 48.0537 Tj
0 -123.413 Td
(SEG_UDATA 1504) 61.1592 Tj
-13042 TJm
(0325 5044 5078 5389) 83.0018 Tj
17.4609 -132.907 Td
(1504 1690 1693 1763) 83.0018 Tj
-8527.18 TJm
(7123) 17.4741 Tj
0 -142.4 Td
(SETGATE 0771) 52.4222 Tj
-12038.8 TJm
(strncmp 5351) 52.4222 Tj
17.4609 -151.893 Td
(0771 2521 2522) 61.1592 Tj
-11035.5 TJm
(0326 4205 5351) 61.1592 Tj
0 -161.387 Td
(setupsegs 1672) 61.1592 Tj
-11035.4 TJm
(strncpy 5361) 52.4222 Tj
17.4609 -170.88 Td
(0303 1243 1264 1672) 83.0018 Tj
-8527.18 TJm
(0327 4272 5361) 61.1592 Tj
17.4609 -180.373 Td
(1826 1833 2860 5106) 83.0018 Tj
-6520.6 TJm
(STS_IG32 0685) 56.7907 Tj
0 -189.867 Td
(SHIFT 6008) 43.6851 Tj
-15048.7 TJm
(0685 0777) 39.3166 Tj
17.4609 -199.36 Td
(6008 6036 6037 6185) 83.0018 Tj
-6520.6 TJm
(STS_T32A 0682) 56.7907 Tj
0 -208.854 Td
(skipelem 4314) 56.7907 Tj
-13543.7 TJm
(0682 1686) 39.3166 Tj
17.4609 -218.347 Td
(4314 4363) 39.3166 Tj
-11537.3 TJm
(STS_TG32 0686) 56.7907 Tj
0 -227.84 Td
(sleep 1903) 43.6851 Tj
-15048.7 TJm
(0686 0777) 39.3166 Tj
17.4609 -237.334 Td
(0304 1903 1906 1909) 83.0018 Tj
-6520.6 TJm
(STUB 6703 6710 6711 6712 6713 6714) 148.529 Tj
17.4609 -246.827 Td
(2090 2109 2878 3480) 83.0018 Tj
-8527.18 TJm
(6710 6711 6712 6713) 83.0018 Tj
17.4609 -256.32 Td
(3577 3862 5263 5284) 83.0018 Tj
-8527.18 TJm
(6714 6715 6716 6717) 83.0018 Tj
17.4609 -265.814 Td
(6466 6729) 39.3166 Tj
-13543.9 TJm
(6718 6719 6720 6721) 83.0018 Tj
0 -275.307 Td
(spinlock 1301) 56.7907 Tj
-13543.7 TJm
(6722 6723 6724 6725) 83.0018 Tj
17.4609 -284.8 Td
(0206 0304 0314 0316) 83.0018 Tj
-8527.18 TJm
(6726 6727 6728 6729) 83.0018 Tj
17.4609 -294.294 Td
(0317 0318 0344 1301) 83.0018 Tj
-6520.6 TJm
(sum 5525) 34.9481 Tj
17.4609 -303.787 Td
(1408 1413 1425 1452) 83.0018 Tj
-8527.18 TJm
(5525 5527 5529 5531) 83.0018 Tj
17.4609 -313.281 Td
(1489 1606 1608 1903) 83.0018 Tj
-8527.18 TJm
(5532 5543 5592) 61.1592 Tj
17.4609 -322.774 Td
(2210 2212 2507 2512) 83.0018 Tj
-6520.6 TJm
(superblock 3160) 65.5277 Tj
17.4609 -332.267 Td
(3309 3324 3526 3530) 83.0018 Tj
-8527.18 TJm
(3160 3679 3708 3733) 83.0018 Tj
17.4609 -341.761 Td
(3668 3784 4404 4408) 83.0018 Tj
-8527.18 TJm
(3957) 17.4741 Tj
17.4609 -351.254 Td
(5156 5165 6208 6220) 83.0018 Tj
-6520.6 TJm
(SVR 5661) 34.9481 Tj
17.4609 -360.747 Td
(6402) 17.4741 Tj
-16052.2 TJm
(5661 5707) 39.3166 Tj
0 -370.241 Td
(STA_R 0567 0671) 65.5277 Tj
-10533.8 TJm
(swtch 2156) 43.6851 Tj
17.4609 -379.734 Td
(0567 0671 0985 1081) 83.0018 Tj
-8527.18 TJm
(0311 1828 1862 2155) 83.0018 Tj
17.4609 -389.227 Td
(1684 1689) 39.3166 Tj
-13543.9 TJm
(2156) 17.4741 Tj
0 -398.721 Td
(start 0912 1025 6607) 87.3703 Tj
-8025.43 TJm
(syscall 2774) 52.4222 Tj
17.4609 -408.214 Td
(0911 0912 0974 1024) 83.0018 Tj
-8527.18 TJm
(0335 2540 2656 2774) 83.0018 Tj
17.4609 -417.707 Td
(1025 1073 1074 2229) 83.0018 Tj
-6520.6 TJm
(SYS_chdir 2616) 61.1592 Tj
17.4609 -427.2 Td
(2232 2233 2236 6606) 83.0018 Tj
-8527.18 TJm
(2616 2751) 39.3166 Tj
17.4609 -436.694 Td
(6607) 17.4741 Tj
-14045.6 TJm
(SYS_close 2607) 61.1592 Tj
0 -446.187 Td
(stat 3050) 39.3166 Tj
-15550.3 TJm
(2607 2752) 39.3166 Tj
17.4609 -455.681 Td
(0207 0230 0248 3050) 83.0018 Tj
-6520.6 TJm
(SYS_dup 2617) 52.4222 Tj
17.4609 -465.174 Td
(3665 4082 4478 4553) 83.0018 Tj
-8527.18 TJm
(2617 2753) 39.3166 Tj
17.4609 -474.667 Td
(4654 6653) 39.3166 Tj
-11537.3 TJm
(SYS_exec 2609) 56.7907 Tj
0 -484.161 Td
(stati 4082) 43.6851 Tj
-15048.7 TJm
(2609 2754 6611) 61.1592 Tj
17.4609 -493.654 Td
(0248 4082 4482) 61.1592 Tj
-9028.94 TJm
(SYS_exit 2602) 56.7907 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 11) 192.215 Tj
17.4609 -28.4801 Td
(2602 2755 6616) 61.1592 Tj
-11035.5 TJm
(2556 2871 2875 2878) 83.0018 Tj
0 -37.9735 Td
(SYS_fork 2601) 56.7907 Tj
-13543.7 TJm
(2880) 17.4741 Tj
17.4609 -47.4668 Td
(2601 2756) 39.3166 Tj
-11537.3 TJm
(TICR 5680) 39.3166 Tj
0 -56.9602 Td
(SYS_fstat 2613) 61.1592 Tj
-13042 TJm
(5680 5716) 39.3166 Tj
17.4609 -66.4535 Td
(2613 2757) 39.3166 Tj
-11537.3 TJm
(TIMER 5672) 43.6851 Tj
0 -75.9469 Td
(SYS_getpid 2618) 65.5277 Tj
-12540.3 TJm
(5672 5718) 39.3166 Tj
17.4609 -85.4403 Td
(2618 2758) 39.3166 Tj
-11537.3 TJm
(TIMER_16BIT 6571) 69.8962 Tj
0 -94.9336 Td
(SYS_kill 2608) 56.7907 Tj
-13543.7 TJm
(6571 6577) 39.3166 Tj
17.4609 -104.427 Td
(2608 2759) 39.3166 Tj
-11537.3 TJm
(TIMER_DIV 6566) 61.1592 Tj
0 -113.92 Td
(SYS_link 2614) 56.7907 Tj
-13543.7 TJm
(6566 6578 6579) 61.1592 Tj
17.4609 -123.413 Td
(2614 2760) 39.3166 Tj
-11537.3 TJm
(TIMER_FREQ 6565) 65.5277 Tj
0 -132.907 Td
(SYS_mkdir 2615) 61.1592 Tj
-13042 TJm
(6565 6566) 39.3166 Tj
17.4609 -142.4 Td
(2615 2761) 39.3166 Tj
-11537.3 TJm
(timer_init 6574) 65.5277 Tj
0 -151.893 Td
(SYS_mknod 2611) 61.1592 Tj
-13042 TJm
(0338 1248 6574) 61.1592 Tj
17.4609 -161.387 Td
(2611 2762) 39.3166 Tj
-11537.3 TJm
(TIMER_MODE 6568) 65.5277 Tj
0 -170.88 Td
(SYS_open 2610) 56.7907 Tj
-13543.7 TJm
(6568 6577) 39.3166 Tj
17.4609 -180.373 Td
(2610 2763) 39.3166 Tj
-11537.3 TJm
(TIMER_RATEGEN 6570) 78.6333 Tj
0 -189.867 Td
(SYS_pipe 2604) 56.7907 Tj
-13543.7 TJm
(6570 6577) 39.3166 Tj
17.4609 -199.36 Td
(2604 2764) 39.3166 Tj
-11537.3 TJm
(TIMER_SEL0 6569) 65.5277 Tj
0 -208.854 Td
(SYS_read 2606) 56.7907 Tj
-13543.7 TJm
(6569 6577) 39.3166 Tj
17.4609 -218.347 Td
(2606 2765) 39.3166 Tj
-11537.3 TJm
(TPR 5659) 34.9481 Tj
0 -227.84 Td
(SYS_sbrk 2619) 56.7907 Tj
-13543.7 TJm
(5659 5746) 39.3166 Tj
17.4609 -237.334 Td
(2619 2766) 39.3166 Tj
-11537.3 TJm
(trap 2534) 39.3166 Tj
0 -246.827 Td
(SYS_sleep 2620) 61.1592 Tj
-13042 TJm
(2402 2404 2469 2534) 83.0018 Tj
17.4609 -256.32 Td
(2620 2767) 39.3166 Tj
-13543.8 TJm
(2576 2578 2581) 61.1592 Tj
0 -265.813 Td
(SYS_unlink 2612) 65.5277 Tj
-10533.8 TJm
(trapframe 0501) 61.1592 Tj
17.4609 -275.307 Td
(2612 2768) 39.3166 Tj
-13543.8 TJm
(0501 1541 1616 1718) 83.0018 Tj
0 -284.8 Td
(SYS_wait 2603) 56.7907 Tj
-13543.7 TJm
(2534) 17.4741 Tj
17.4609 -294.293 Td
(2603 2769) 39.3166 Tj
-11537.3 TJm
(trapret 2474) 52.4222 Tj
0 -303.787 Td
(SYS_write 2605) 61.1592 Tj
-13042 TJm
(2473 2474 2486) 61.1592 Tj
17.4609 -313.28 Td
(2605 2770) 39.3166 Tj
-11537.3 TJm
(T_SYSCALL 2376) 61.1592 Tj
0 -322.773 Td
(taskstate 0701) 61.1592 Tj
-13042 TJm
(2376 2522 2536 6612) 83.0018 Tj
17.4609 -332.267 Td
(0701 1569) 39.3166 Tj
-13543.8 TJm
(6617 6707) 39.3166 Tj
0 -341.76 Td
(TCCR 5681) 39.3166 Tj
-13543.8 TJm
(tvinit 2516) 48.0537 Tj
17.4609 -351.254 Td
(5681 5717) 39.3166 Tj
-13543.8 TJm
(0343 1239 2516) 61.1592 Tj
0 -360.747 Td
(TDCR 5682) 39.3166 Tj
-13543.8 TJm
(userinit 1752) 56.7907 Tj
17.4609 -370.24 Td
(5682 5715) 39.3166 Tj
-13543.8 TJm
(0305 1249 1752) 61.1592 Tj
0 -379.734 Td
(T_DEV 3184) 43.6851 Tj
-13042.1 TJm
(VER 5658) 34.9481 Tj
17.4609 -389.227 Td
(3184 4107 4157 4911) 83.0018 Tj
-8527.18 TJm
(5658 5726) 39.3166 Tj
0 -398.72 Td
(T_DIR 3182) 43.6851 Tj
-13042.1 TJm
(wait 2053) 39.3166 Tj
17.4609 -408.213 Td
(3182 4218 4365 4673) 83.0018 Tj
-8527.18 TJm
(0306 2053 2827 6683) 83.0018 Tj
17.4609 -417.707 Td
(4778 4838 4868 4923) 83.0018 Tj
-8527.18 TJm
(6712 6844 6870 6871) 83.0018 Tj
17.4609 -427.2 Td
(4938) 17.4741 Tj
-16052.2 TJm
(6918) 17.4741 Tj
0 -436.693 Td
(T_FILE 3183) 48.0537 Tj
-12540.4 TJm
(waitdisk 1151) 56.7907 Tj
17.4609 -446.187 Td
(3183 4862) 39.3166 Tj
-13543.8 TJm
(1151 1163 1172) 61.1592 Tj
0 -455.68 Td
(ticks 2513) 43.6851 Tj
-13042.1 TJm
(wakeup 1965) 48.0537 Tj
17.4609 -465.173 Td
(0342 2513 2554 2555) 83.0018 Tj
-8527.18 TJm
(0307 1965 2555 3420) 83.0018 Tj
17.4609 -474.667 Td
(2872 2873 2878) 61.1592 Tj
-11035.5 TJm
(3639 3891 3916 5220) 83.0018 Tj
0 -484.16 Td
(tickslock 2512) 61.1592 Tj
-13042 TJm
(5223 5262 5268 5292) 83.0018 Tj
17.4609 -493.654 Td
(0344 2512 2524 2553) 83.0018 Tj
-8527.18 TJm
(6441) 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  cross-references  Page 12) 192.215 Tj
0 -28.4801 Td
(wakeup1 1953) 52.4222 Tj
-14045.3 TJm
(4785 4786) 39.3166 Tj
17.4609 -37.9735 Td
(1953 1968 2026 2033) 83.0018 Tj
-6520.6 TJm
(yield 1867) 43.6851 Tj
0 -47.4668 Td
(writei 4152) 48.0537 Tj
-14547 TJm
(0308 1867 2596) 61.1592 Tj
17.4609 -56.9602 Td
(0249 4152 4274 4532) 83.0018 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/types.h  Page 1) 166.004 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.529 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.92 Td
(0109 ) 21.8426 Tj
0 -123.414 Td
(0110 ) 21.8426 Tj
0 -132.907 Td
(0111 ) 21.8426 Tj
0 -142.4 Td
(0112 ) 21.8426 Tj
0 -151.894 Td
(0113 ) 21.8426 Tj
0 -161.387 Td
(0114 ) 21.8426 Tj
0 -170.88 Td
(0115 ) 21.8426 Tj
0 -180.374 Td
(0116 ) 21.8426 Tj
0 -189.867 Td
(0117 ) 21.8426 Tj
0 -199.361 Td
(0118 ) 21.8426 Tj
0 -208.854 Td
(0119 ) 21.8426 Tj
0 -218.347 Td
(0120 ) 21.8426 Tj
0 -227.841 Td
(0121 ) 21.8426 Tj
0 -237.334 Td
(0122 ) 21.8426 Tj
0 -246.827 Td
(0123 ) 21.8426 Tj
0 -256.321 Td
(0124 ) 21.8426 Tj
0 -265.814 Td
(0125 ) 21.8426 Tj
0 -275.307 Td
(0126 ) 21.8426 Tj
0 -284.801 Td
(0127 ) 21.8426 Tj
0 -294.294 Td
(0128 ) 21.8426 Tj
0 -303.788 Td
(0129 ) 21.8426 Tj
0 -313.281 Td
(0130 ) 21.8426 Tj
0 -322.774 Td
(0131 ) 21.8426 Tj
0 -332.268 Td
(0132 ) 21.8426 Tj
0 -341.761 Td
(0133 ) 21.8426 Tj
0 -351.254 Td
(0134 ) 21.8426 Tj
0 -360.748 Td
(0135 ) 21.8426 Tj
0 -370.241 Td
(0136 ) 21.8426 Tj
0 -379.734 Td
(0137 ) 21.8426 Tj
0 -389.228 Td
(0138 ) 21.8426 Tj
0 -398.721 Td
(0139 ) 21.8426 Tj
0 -408.214 Td
(0140 ) 21.8426 Tj
0 -417.708 Td
(0141 ) 21.8426 Tj
0 -427.201 Td
(0142 ) 21.8426 Tj
0 -436.695 Td
(0143 ) 21.8426 Tj
0 -446.188 Td
(0144 ) 21.8426 Tj
0 -455.681 Td
(0145 ) 21.8426 Tj
0 -465.175 Td
(0146 ) 21.8426 Tj
0 -474.668 Td
(0147 ) 21.8426 Tj
0 -484.161 Td
(0148 ) 21.8426 Tj
0 -493.655 Td
(0149 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/param.h  Page 1) 166.004 Tj
0 -28.4801 Td
(0150 #define NPROC        64  // maximum number of processes) 262.111 Tj
0 -37.9735 Td
(0151 #define PAGE       4096  // granularity of user-space memo\
ry allocation) 332.007 Tj
0 -47.4668 Td
(0152 #define KSTACKSIZE PAGE  // size of per-process kernel sta\
ck) 283.953 Tj
0 -56.9602 Td
(0153 #define NCPU          8  // maximum number of CPUs) 240.268 Tj
0 -66.4535 Td
(0154 #define NOFILE       16  // open files per process) 240.268 Tj
0 -75.9469 Td
(0155 #define NFILE       100  // open files per system) 235.9 Tj
0 -85.4403 Td
(0156 #define NBUF         10  // size of disk block cache) 249.005 Tj
0 -94.9336 Td
(0157 #define NINODE       50  // maximum number of active i-nod\
es) 283.953 Tj
0 -104.427 Td
(0158 #define NDEV         10  // maximum major device number) 262.111 Tj
0 -113.92 Td
(0159 #define ROOTDEV       1  // device number of file system r\
oot disk) 310.165 Tj
0 -123.414 Td
(0160 ) 21.8426 Tj
0 -132.907 Td
(0161 ) 21.8426 Tj
0 -142.4 Td
(0162 ) 21.8426 Tj
0 -151.894 Td
(0163 ) 21.8426 Tj
0 -161.387 Td
(0164 ) 21.8426 Tj
0 -170.88 Td
(0165 ) 21.8426 Tj
0 -180.374 Td
(0166 ) 21.8426 Tj
0 -189.867 Td
(0167 ) 21.8426 Tj
0 -199.361 Td
(0168 ) 21.8426 Tj
0 -208.854 Td
(0169 ) 21.8426 Tj
0 -218.347 Td
(0170 ) 21.8426 Tj
0 -227.841 Td
(0171 ) 21.8426 Tj
0 -237.334 Td
(0172 ) 21.8426 Tj
0 -246.827 Td
(0173 ) 21.8426 Tj
0 -256.321 Td
(0174 ) 21.8426 Tj
0 -265.814 Td
(0175 ) 21.8426 Tj
0 -275.307 Td
(0176 ) 21.8426 Tj
0 -284.801 Td
(0177 ) 21.8426 Tj
0 -294.294 Td
(0178 ) 21.8426 Tj
0 -303.788 Td
(0179 ) 21.8426 Tj
0 -313.281 Td
(0180 ) 21.8426 Tj
0 -322.774 Td
(0181 ) 21.8426 Tj
0 -332.268 Td
(0182 ) 21.8426 Tj
0 -341.761 Td
(0183 ) 21.8426 Tj
0 -351.254 Td
(0184 ) 21.8426 Tj
0 -360.748 Td
(0185 ) 21.8426 Tj
0 -370.241 Td
(0186 ) 21.8426 Tj
0 -379.734 Td
(0187 ) 21.8426 Tj
0 -389.228 Td
(0188 ) 21.8426 Tj
0 -398.721 Td
(0189 ) 21.8426 Tj
0 -408.214 Td
(0190 ) 21.8426 Tj
0 -417.708 Td
(0191 ) 21.8426 Tj
0 -427.201 Td
(0192 ) 21.8426 Tj
0 -436.695 Td
(0193 ) 21.8426 Tj
0 -446.188 Td
(0194 ) 21.8426 Tj
0 -455.681 Td
(0195 ) 21.8426 Tj
0 -465.175 Td
(0196 ) 21.8426 Tj
0 -474.668 Td
(0197 ) 21.8426 Tj
0 -484.161 Td
(0198 ) 21.8426 Tj
0 -493.655 Td
(0199 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.92 Td
(0209 // bio.c) 56.7907 Tj
0 -123.414 Td
(0210 void            binit\(void\);) 144.161 Tj
0 -132.907 Td
(0211 struct buf*     bread\(uint, uint\);) 170.372 Tj
0 -142.4 Td
(0212 void            brelse\(struct buf*\);) 179.109 Tj
0 -151.894 Td
(0213 void            bwrite\(struct buf*\);) 179.109 Tj
0 -161.387 Td
(0214 ) 21.8426 Tj
0 -170.88 Td
(0215 // console.c) 74.2647 Tj
0 -180.374 Td
(0216 void            console_init\(void\);) 174.741 Tj
0 -189.867 Td
(0217 void            cprintf\(char*, ...\);) 179.109 Tj
0 -199.361 Td
(0218 void            console_intr\(int\(*\)\(void\)\);) 209.689 Tj
0 -208.854 Td
(0219 void            panic\(char*\) __attribute__\(\(noreturn\)\
\);) 262.111 Tj
0 -218.347 Td
(0220 ) 21.8426 Tj
0 -227.841 Td
(0221 // exec.c) 61.1592 Tj
0 -237.334 Td
(0222 int             exec\(char*, char**\);) 179.109 Tj
0 -246.827 Td
(0223 ) 21.8426 Tj
0 -256.321 Td
(0224 // file.c) 61.1592 Tj
0 -265.814 Td
(0225 struct file*    filealloc\(void\);) 161.635 Tj
0 -275.307 Td
(0226 void            fileclose\(struct file*\);) 196.583 Tj
0 -284.801 Td
(0227 struct file*    filedup\(struct file*\);) 187.846 Tj
0 -294.294 Td
(0228 void            fileinit\(void\);) 157.267 Tj
0 -303.788 Td
(0229 int             fileread\(struct file*, char*, int n\);) 253.374 Tj
0 -313.281 Td
(0230 int             filestat\(struct file*, struct stat*\);) 253.374 Tj
0 -322.774 Td
(0231 int             filewrite\(struct file*, char*, int n\);) 257.742 Tj
0 -332.268 Td
(0232 ) 21.8426 Tj
0 -341.761 Td
(0233 // fs.c) 52.4222 Tj
0 -351.254 Td
(0234 int             dirlink\(struct inode*, char*, uint\);) 249.005 Tj
0 -360.748 Td
(0235 struct inode*   dirlookup\(struct inode*, char*, uint*\);) 262.111 Tj
0 -370.241 Td
(0236 struct inode*   ialloc\(uint, short\);) 179.109 Tj
0 -379.734 Td
(0237 struct inode*   idup\(struct inode*\);) 179.109 Tj
0 -389.228 Td
(0238 void            iinit\(void\);) 144.161 Tj
0 -398.721 Td
(0239 void            ilock\(struct inode*\);) 183.478 Tj
0 -408.214 Td
(0240 void            iput\(struct inode*\);) 179.109 Tj
0 -417.708 Td
(0241 void            iunlock\(struct inode*\);) 192.215 Tj
0 -427.201 Td
(0242 void            iunlockput\(struct inode*\);) 205.32 Tj
0 -436.695 Td
(0243 void            iupdate\(struct inode*\);) 192.215 Tj
0 -446.188 Td
(0244 int             namecmp\(const char*, const char*\);) 240.268 Tj
0 -455.681 Td
(0245 struct inode*   namei\(char*\);) 148.529 Tj
0 -465.175 Td
(0246 struct inode*   nameiparent\(char*, char*\);) 205.32 Tj
0 -474.668 Td
(0247 int             readi\(struct inode*, char*, uint, uint\);) 266.479 Tj
0 -484.161 Td
(0248 void            stati\(struct inode*, struct stat*\);) 244.637 Tj
0 -493.655 Td
(0249 int             writei\(struct inode*, char*, uint, uint\)\
;) 270.848 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.267 Tj
0 -47.4668 Td
(0252 void            ide_intr\(void\);) 157.267 Tj
0 -56.9602 Td
(0253 void            ide_rw\(struct buf *\);) 183.478 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.531 Tj
0 -94.9336 Td
(0257 extern uchar    ioapic_id;) 135.424 Tj
0 -104.427 Td
(0258 void            ioapic_init\(void\);) 170.372 Tj
0 -113.92 Td
(0259 ) 21.8426 Tj
0 -123.414 Td
(0260 // kalloc.c) 69.8962 Tj
0 -132.907 Td
(0261 char*           kalloc\(int\);) 144.161 Tj
0 -142.4 Td
(0262 void            kfree\(char*, int\);) 170.372 Tj
0 -151.894 Td
(0263 void            kinit\(void\);) 144.161 Tj
0 -161.387 Td
(0264 ) 21.8426 Tj
0 -170.88 Td
(0265 // kbd.c) 56.7907 Tj
0 -180.374 Td
(0266 void            kbd_intr\(void\);) 157.267 Tj
0 -189.867 Td
(0267 ) 21.8426 Tj
0 -199.361 Td
(0268 // lapic.c) 65.5277 Tj
0 -208.854 Td
(0269 int             cpu\(void\);) 135.424 Tj
0 -218.347 Td
(0270 extern volatile uint*    lapic;) 157.267 Tj
0 -227.841 Td
(0271 void            lapic_disableintr\(void\);) 196.583 Tj
0 -237.334 Td
(0272 void            lapic_enableintr\(void\);) 192.215 Tj
0 -246.827 Td
(0273 void            lapic_eoi\(void\);) 161.635 Tj
0 -256.321 Td
(0274 void            lapic_init\(int\);) 161.635 Tj
0 -265.814 Td
(0275 void            lapic_startap\(uchar, uint\);) 209.689 Tj
0 -275.307 Td
(0276 void            lapic_timerinit\(void\);) 187.846 Tj
0 -284.801 Td
(0277 void            lapic_timerintr\(void\);) 187.846 Tj
0 -294.294 Td
(0278 ) 21.8426 Tj
0 -303.788 Td
(0279 // mp.c) 52.4222 Tj
0 -313.281 Td
(0280 extern int      ismp;) 113.581 Tj
0 -322.774 Td
(0281 int             mp_bcpu\(void\);) 152.898 Tj
0 -332.268 Td
(0282 void            mp_init\(void\);) 152.898 Tj
0 -341.761 Td
(0283 void            mp_startthem\(void\);) 174.741 Tj
0 -351.254 Td
(0284 ) 21.8426 Tj
0 -360.748 Td
(0285 // picirq.c) 69.8962 Tj
0 -370.241 Td
(0286 void            pic_enable\(int\);) 161.635 Tj
0 -379.734 Td
(0287 void            pic_init\(void\);) 157.267 Tj
0 -389.228 Td
(0288 ) 21.8426 Tj
0 -398.721 Td
(0289 // pipe.c) 61.1592 Tj
0 -408.214 Td
(0290 int             pipealloc\(struct file**, struct file**\);) 266.479 Tj
0 -417.708 Td
(0291 void            pipeclose\(struct pipe*, int\);) 218.426 Tj
0 -427.201 Td
(0292 int             piperead\(struct pipe*, char*, int\);) 244.637 Tj
0 -436.695 Td
(0293 int             pipewrite\(struct pipe*, char*, int\);) 249.005 Tj
0 -446.188 Td
(0294 ) 21.8426 Tj
0 -455.681 Td
(0295 // proc.c) 61.1592 Tj
0 -465.175 Td
(0296 struct proc*    copyproc\(struct proc*\);) 192.215 Tj
0 -474.668 Td
(0297 void            exit\(void\);) 139.792 Tj
0 -484.161 Td
(0298 int             growproc\(int\);) 152.898 Tj
0 -493.655 Td
(0299 int             kill\(int\);) 135.424 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/defs.h  Page 3) 161.635 Tj
0 -28.4801 Td
(0300 void            pinit\(void\);) 144.161 Tj
0 -37.9735 Td
(0301 void            procdump\(void\);) 157.267 Tj
0 -47.4668 Td
(0302 void            scheduler\(void\) __attribute__\(\(noretur\
n\)\);) 275.216 Tj
0 -56.9602 Td
(0303 void            setupsegs\(struct proc*\);) 196.583 Tj
0 -66.4535 Td
(0304 void            sleep\(void*, struct spinlock*\);) 227.163 Tj
0 -75.9469 Td
(0305 void            userinit\(void\);) 157.267 Tj
0 -85.4403 Td
(0306 int             wait\(void\);) 139.792 Tj
0 -94.9336 Td
(0307 void            wakeup\(void*\);) 152.898 Tj
0 -104.427 Td
(0308 void            yield\(void\);) 144.161 Tj
0 -113.92 Td
(0309 ) 21.8426 Tj
0 -123.414 Td
(0310 // swtch.S) 65.5277 Tj
0 -132.907 Td
(0311 void            swtch\(struct context*, struct context*\);) 266.479 Tj
0 -142.4 Td
(0312 ) 21.8426 Tj
0 -151.894 Td
(0313 // spinlock.c) 78.6333 Tj
0 -161.387 Td
(0314 void            acquire\(struct spinlock*\);) 205.32 Tj
0 -170.88 Td
(0315 void            getcallerpcs\(void*, uint*\);) 209.689 Tj
0 -180.374 Td
(0316 int             holding\(struct spinlock*\);) 205.32 Tj
0 -189.867 Td
(0317 void            initlock\(struct spinlock*, char*\);) 240.268 Tj
0 -199.361 Td
(0318 void            release\(struct spinlock*\);) 205.32 Tj
0 -208.854 Td
(0319 ) 21.8426 Tj
0 -218.347 Td
(0320 // string.c) 69.8962 Tj
0 -227.841 Td
(0321 int             memcmp\(const void*, const void*, uint\);) 262.111 Tj
0 -237.334 Td
(0322 void*           memmove\(void*, const void*, uint\);) 240.268 Tj
0 -246.827 Td
(0323 void*           memset\(void*, int, uint\);) 200.952 Tj
0 -256.321 Td
(0324 char*           safestrcpy\(char*, const char*, int\);) 249.005 Tj
0 -265.814 Td
(0325 int             strlen\(const char*\);) 179.109 Tj
0 -275.307 Td
(0326 int             strncmp\(const char*, const char*, uint\);) 266.479 Tj
0 -284.801 Td
(0327 char*           strncpy\(char*, const char*, int\);) 235.9 Tj
0 -294.294 Td
(0328 ) 21.8426 Tj
0 -303.788 Td
(0329 // syscall.c) 74.2647 Tj
0 -313.281 Td
(0330 int             argint\(int, int*\);) 170.372 Tj
0 -322.774 Td
(0331 int             argptr\(int, char**, int\);) 200.952 Tj
0 -332.268 Td
(0332 int             argstr\(int, char**\);) 179.109 Tj
0 -341.761 Td
(0333 int             fetchint\(struct proc*, uint, int*\);) 244.637 Tj
0 -351.254 Td
(0334 int             fetchstr\(struct proc*, uint, char**\);) 253.374 Tj
0 -360.748 Td
(0335 void            syscall\(void\);) 152.898 Tj
0 -370.241 Td
(0336 ) 21.8426 Tj
0 -379.734 Td
(0337 // timer.c) 65.5277 Tj
0 -389.228 Td
(0338 void            timer_init\(void\);) 166.004 Tj
0 -398.721 Td
(0339 ) 21.8426 Tj
0 -408.214 Td
(0340 // trap.c) 61.1592 Tj
0 -417.708 Td
(0341 void            idtinit\(void\);) 152.898 Tj
0 -427.201 Td
(0342 extern int      ticks;) 117.95 Tj
0 -436.695 Td
(0343 void            tvinit\(void\);) 148.529 Tj
0 -446.188 Td
(0344 extern struct spinlock tickslock;) 166.004 Tj
0 -455.681 Td
(0345 ) 21.8426 Tj
0 -465.175 Td
(0346 // number of elements in fixed-size array) 200.952 Tj
0 -474.668 Td
(0347 #define NELEM\(x\) \(sizeof\(x\)/sizeof\(\(x\)[0]\)\)) 209.689 Tj
0 -484.161 Td
(0348 ) 21.8426 Tj
0 -493.655 Td
(0349 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/x86.h  Page 1) 157.267 Tj
0 -28.4801 Td
(0350 // Special assembly routines to access x86-specific) 244.637 Tj
0 -37.9735 Td
(0351 // hardware instructions.) 131.055 Tj
0 -47.4668 Td
(0352 ) 21.8426 Tj
0 -56.9602 Td
(0353 static inline uchar) 104.844 Tj
0 -66.4535 Td
(0354 inb\(ushort port\)) 91.7388 Tj
0 -75.9469 Td
(0355 {) 26.2111 Tj
0 -85.4403 Td
(0356   uchar data;) 78.6333 Tj
0 -94.9336 Td
(0357 ) 21.8426 Tj
0 -104.427 Td
(0358   asm volatile\("in %1,%0" : "=a" \(data\) : "d" \(port\)\)\
;) 257.742 Tj
0 -113.92 Td
(0359   return data;) 83.0018 Tj
0 -123.414 Td
(0360 }) 26.2111 Tj
0 -132.907 Td
(0361 ) 21.8426 Tj
0 -142.4 Td
(0362 static inline void) 100.476 Tj
0 -151.894 Td
(0363 insl\(int port, void *addr, int cnt\)) 174.741 Tj
0 -161.387 Td
(0364 {) 26.2111 Tj
0 -170.88 Td
(0365   asm volatile\("cld\\n\\trepne\\n\\tinsl"     :) 209.689 Tj
0 -180.374 Td
(0366                    "=D" \(addr\), "=c" \(cnt\)    :) 227.163 Tj
0 -189.867 Td
(0367                    "d" \(port\), "0" \(addr\), "1" \(cnt\)\
  :) 262.111 Tj
0 -199.361 Td
(0368                    "memory", "cc"\);) 174.741 Tj
0 -208.854 Td
(0369 }) 26.2111 Tj
0 -218.347 Td
(0370 ) 21.8426 Tj
0 -227.841 Td
(0371 static inline void) 100.476 Tj
0 -237.334 Td
(0372 outb\(ushort port, uchar data\)) 148.529 Tj
0 -246.827 Td
(0373 {) 26.2111 Tj
0 -256.321 Td
(0374   asm volatile\("out %0,%1" : : "a" \(data\), "d" \(port\)\
\);) 262.111 Tj
0 -265.814 Td
(0375 }) 26.2111 Tj
0 -275.307 Td
(0376 ) 21.8426 Tj
0 -284.801 Td
(0377 static inline void) 100.476 Tj
0 -294.294 Td
(0378 outw\(ushort port, ushort data\)) 152.898 Tj
0 -303.788 Td
(0379 {) 26.2111 Tj
0 -313.281 Td
(0380   asm volatile\("out %0,%1" : : "a" \(data\), "d" \(port\)\
\);) 262.111 Tj
0 -322.774 Td
(0381 }) 26.2111 Tj
0 -332.268 Td
(0382 ) 21.8426 Tj
0 -341.761 Td
(0383 static inline void) 100.476 Tj
0 -351.254 Td
(0384 outsl\(int port, const void *addr, int cnt\)) 205.32 Tj
0 -360.748 Td
(0385 {) 26.2111 Tj
0 -370.241 Td
(0386   asm volatile\("cld\\n\\trepne\\n\\toutsl"    :) 209.689 Tj
0 -379.734 Td
(0387                    "=S" \(addr\), "=c" \(cnt\)    :) 227.163 Tj
0 -389.228 Td
(0388                    "d" \(port\), "0" \(addr\), "1" \(cnt\)\
  :) 262.111 Tj
0 -398.721 Td
(0389                    "cc"\);) 131.055 Tj
0 -408.214 Td
(0390 }) 26.2111 Tj
0 -417.708 Td
(0391 ) 21.8426 Tj
0 -427.201 Td
(0392 ) 21.8426 Tj
0 -436.695 Td
(0393 ) 21.8426 Tj
0 -446.188 Td
(0394 ) 21.8426 Tj
0 -455.681 Td
(0395 ) 21.8426 Tj
0 -465.175 Td
(0396 ) 21.8426 Tj
0 -474.668 Td
(0397 ) 21.8426 Tj
0 -484.161 Td
(0398 ) 21.8426 Tj
0 -493.655 Td
(0399 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/x86.h  Page 2) 157.267 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.476 Tj
0 -56.9602 Td
(0403 lgdt\(struct segdesc *p, int size\)) 166.004 Tj
0 -66.4535 Td
(0404 {) 26.2111 Tj
0 -75.9469 Td
(0405   volatile ushort pd[3];) 126.687 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.476 Tj
0 -113.92 Td
(0409   pd[2] = \(uint\)p >> 16;) 126.687 Tj
0 -123.414 Td
(0410 ) 21.8426 Tj
0 -132.907 Td
(0411   asm volatile\("lgdt \(%0\)" : : "r" \(pd\)\);) 200.952 Tj
0 -142.4 Td
(0412 }) 26.2111 Tj
0 -151.894 Td
(0413 ) 21.8426 Tj
0 -161.387 Td
(0414 struct gatedesc;) 91.7388 Tj
0 -170.88 Td
(0415 ) 21.8426 Tj
0 -180.374 Td
(0416 static inline void) 100.476 Tj
0 -189.867 Td
(0417 lidt\(struct gatedesc *p, int size\)) 170.372 Tj
0 -199.361 Td
(0418 {) 26.2111 Tj
0 -208.854 Td
(0419   volatile ushort pd[3];) 126.687 Tj
0 -218.347 Td
(0420 ) 21.8426 Tj
0 -227.841 Td
(0421   pd[0] = size-1;) 96.1073 Tj
0 -237.334 Td
(0422   pd[1] = \(uint\)p;) 100.476 Tj
0 -246.827 Td
(0423   pd[2] = \(uint\)p >> 16;) 126.687 Tj
0 -256.321 Td
(0424 ) 21.8426 Tj
0 -265.814 Td
(0425   asm volatile\("lidt \(%0\)" : : "r" \(pd\)\);) 200.952 Tj
0 -275.307 Td
(0426 }) 26.2111 Tj
0 -284.801 Td
(0427 ) 21.8426 Tj
0 -294.294 Td
(0428 static inline void) 100.476 Tj
0 -303.788 Td
(0429 ltr\(ushort sel\)) 87.3703 Tj
0 -313.281 Td
(0430 {) 26.2111 Tj
0 -322.774 Td
(0431   asm volatile\("ltr %0" : : "r" \(sel\)\);) 192.215 Tj
0 -332.268 Td
(0432 }) 26.2111 Tj
0 -341.761 Td
(0433 ) 21.8426 Tj
0 -351.254 Td
(0434 static inline uint) 100.476 Tj
0 -360.748 Td
(0435 read_eflags\(void\)) 96.1073 Tj
0 -370.241 Td
(0436 {) 26.2111 Tj
0 -379.734 Td
(0437   uint eflags;) 83.0018 Tj
0 -389.228 Td
(0438   asm volatile\("pushfl; popl %0" : "=r" \(eflags\)\);) 240.268 Tj
0 -398.721 Td
(0439   return eflags;) 91.7388 Tj
0 -408.214 Td
(0440 }) 26.2111 Tj
0 -417.708 Td
(0441 ) 21.8426 Tj
0 -427.201 Td
(0442 static inline void) 100.476 Tj
0 -436.695 Td
(0443 write_eflags\(uint eflags\)) 131.055 Tj
0 -446.188 Td
(0444 {) 26.2111 Tj
0 -455.681 Td
(0445   asm volatile\("pushl %0; popfl" : : "r" \(eflags\)\);) 244.637 Tj
0 -465.175 Td
(0446 }) 26.2111 Tj
0 -474.668 Td
(0447 ) 21.8426 Tj
0 -484.161 Td
(0448 ) 21.8426 Tj
0 -493.655 Td
(0449 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/x86.h  Page 3) 157.267 Tj
0 -28.4801 Td
(0450 static inline void) 100.476 Tj
0 -37.9735 Td
(0451 cpuid\(uint info, uint *eaxp, uint *ebxp, uint *ecxp, uint\
 *edxp\)) 301.427 Tj
0 -47.4668 Td
(0452 {) 26.2111 Tj
0 -56.9602 Td
(0453   uint eax, ebx, ecx, edx;) 135.424 Tj
0 -66.4535 Td
(0454 ) 21.8426 Tj
0 -75.9469 Td
(0455   asm volatile\("cpuid" :) 126.687 Tj
0 -85.4403 Td
(0456                "=a" \(eax\), "=b" \(ebx\), "=c" \(ecx\), "\
=d" \(edx\) :) 297.059 Tj
0 -94.9336 Td
(0457                "a" \(info\)\);) 139.792 Tj
0 -104.427 Td
(0458   if\(eaxp\)) 65.5277 Tj
0 -113.92 Td
(0459     *eaxp = eax;) 91.7388 Tj
0 -123.414 Td
(0460   if\(ebxp\)) 65.5277 Tj
0 -132.907 Td
(0461     *ebxp = ebx;) 91.7388 Tj
0 -142.4 Td
(0462   if\(ecxp\)) 65.5277 Tj
0 -151.894 Td
(0463     *ecxp = ecx;) 91.7388 Tj
0 -161.387 Td
(0464   if\(edxp\)) 65.5277 Tj
0 -170.88 Td
(0465     *edxp = edx;) 91.7388 Tj
0 -180.374 Td
(0466 }) 26.2111 Tj
0 -189.867 Td
(0467 ) 21.8426 Tj
0 -199.361 Td
(0468 static inline uint) 100.476 Tj
0 -208.854 Td
(0469 cmpxchg\(uint oldval, uint newval, volatile uint* lock_add\
r\)) 279.585 Tj
0 -218.347 Td
(0470 {) 26.2111 Tj
0 -227.841 Td
(0471   uint result;) 83.0018 Tj
0 -237.334 Td
(0472 ) 21.8426 Tj
0 -246.827 Td
(0473   // The + in "+m" denotes a read-modify-write operand.) 262.111 Tj
0 -256.321 Td
(0474   asm volatile\("lock; cmpxchgl %2, %0" :) 196.583 Tj
0 -265.814 Td
(0475                        "+m" \(*lock_addr\), "=a" \(result\)\
 :) 270.848 Tj
0 -275.307 Td
(0476                        "r"\(newval\), "1"\(oldval\) :) 235.9 Tj
0 -284.801 Td
(0477                        "cc"\);) 148.529 Tj
0 -294.294 Td
(0478   return result;) 91.7388 Tj
0 -303.788 Td
(0479 }) 26.2111 Tj
0 -313.281 Td
(0480 ) 21.8426 Tj
0 -322.774 Td
(0481 static inline void) 100.476 Tj
0 -332.268 Td
(0482 cli\(void\)) 61.1592 Tj
0 -341.761 Td
(0483 {) 26.2111 Tj
0 -351.254 Td
(0484   asm volatile\("cli"\);) 117.95 Tj
0 -360.748 Td
(0485 }) 26.2111 Tj
0 -370.241 Td
(0486 ) 21.8426 Tj
0 -379.734 Td
(0487 static inline void) 100.476 Tj
0 -389.228 Td
(0488 sti\(void\)) 61.1592 Tj
0 -398.721 Td
(0489 {) 26.2111 Tj
0 -408.214 Td
(0490   asm volatile\("sti"\);) 117.95 Tj
0 -417.708 Td
(0491 }) 26.2111 Tj
0 -427.201 Td
(0492 ) 21.8426 Tj
0 -436.695 Td
(0493 ) 21.8426 Tj
0 -446.188 Td
(0494 ) 21.8426 Tj
0 -455.681 Td
(0495 ) 21.8426 Tj
0 -465.175 Td
(0496 ) 21.8426 Tj
0 -474.668 Td
(0497 ) 21.8426 Tj
0 -484.161 Td
(0498 ) 21.8426 Tj
0 -493.655 Td
(0499 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/x86.h  Page 4) 157.267 Tj
0 -28.4801 Td
(0500 // Layout of the trap frame on the stack upon entry to tra\
p.) 283.953 Tj
0 -37.9735 Td
(0501 struct trapframe {) 100.476 Tj
0 -47.4668 Td
(0502   // registers as pushed by pusha) 166.004 Tj
0 -56.9602 Td
(0503   uint edi;) 69.8962 Tj
0 -66.4535 Td
(0504   uint esi;) 69.8962 Tj
0 -75.9469 Td
(0505   uint ebp;) 69.8962 Tj
0 -85.4403 Td
(0506   uint oesp;      // useless & ignored) 187.846 Tj
0 -94.9336 Td
(0507   uint ebx;) 69.8962 Tj
0 -104.427 Td
(0508   uint edx;) 69.8962 Tj
0 -113.92 Td
(0509   uint ecx;) 69.8962 Tj
0 -123.414 Td
(0510   uint eax;) 69.8962 Tj
0 -132.907 Td
(0511 ) 21.8426 Tj
0 -142.4 Td
(0512   // rest of trap frame) 122.318 Tj
0 -151.894 Td
(0513   ushort es;) 74.2647 Tj
0 -161.387 Td
(0514   ushort padding1;) 100.476 Tj
0 -170.88 Td
(0515   ushort ds;) 74.2647 Tj
0 -180.374 Td
(0516   ushort padding2;) 100.476 Tj
0 -189.867 Td
(0517   uint trapno;) 83.0018 Tj
0 -199.361 Td
(0518 ) 21.8426 Tj
0 -208.854 Td
(0519   // below here defined by x86 hardware) 192.215 Tj
0 -218.347 Td
(0520   uint err;) 69.8962 Tj
0 -227.841 Td
(0521   uint eip;) 69.8962 Tj
0 -237.334 Td
(0522   ushort cs;) 74.2647 Tj
0 -246.827 Td
(0523   ushort padding3;) 100.476 Tj
0 -256.321 Td
(0524   uint eflags;) 83.0018 Tj
0 -265.814 Td
(0525 ) 21.8426 Tj
0 -275.307 Td
(0526   // below here only when crossing rings, such as from use\
r to kernel) 323.27 Tj
0 -284.801 Td
(0527   uint esp;) 69.8962 Tj
0 -294.294 Td
(0528   ushort ss;) 74.2647 Tj
0 -303.788 Td
(0529   ushort padding4;) 100.476 Tj
0 -313.281 Td
(0530 };) 30.5796 Tj
0 -322.774 Td
(0531 ) 21.8426 Tj
0 -332.268 Td
(0532 ) 21.8426 Tj
0 -341.761 Td
(0533 ) 21.8426 Tj
0 -351.254 Td
(0534 ) 21.8426 Tj
0 -360.748 Td
(0535 ) 21.8426 Tj
0 -370.241 Td
(0536 ) 21.8426 Tj
0 -379.734 Td
(0537 ) 21.8426 Tj
0 -389.228 Td
(0538 ) 21.8426 Tj
0 -398.721 Td
(0539 ) 21.8426 Tj
0 -408.214 Td
(0540 ) 21.8426 Tj
0 -417.708 Td
(0541 ) 21.8426 Tj
0 -427.201 Td
(0542 ) 21.8426 Tj
0 -436.695 Td
(0543 ) 21.8426 Tj
0 -446.188 Td
(0544 ) 21.8426 Tj
0 -455.681 Td
(0545 ) 21.8426 Tj
0 -465.175 Td
(0546 ) 21.8426 Tj
0 -474.668 Td
(0547 ) 21.8426 Tj
0 -484.161 Td
(0548 ) 21.8426 Tj
0 -493.655 Td
(0549 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/asm.h  Page 1) 157.267 Tj
0 -28.4801 Td
(0550 //) 30.5796 Tj
0 -37.9735 Td
(0551 // macros to create x86 segments from assembler) 227.163 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.687 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.92 Td
(0559         .word \(\(\(lim\) >> 12\) & 0xffff\), \(\(base\) &\
 0xffff\);      \\) 305.796 Tj
0 -123.414 Td
(0560         .byte \(\(\(base\) >> 16\) & 0xff\), \(0x90 | \(ty\
pe\)\),         \\) 305.796 Tj
0 -132.907 Td
(0561                 \(0xC0 | \(\(\(lim\) >> 28\) & 0xf\)\), \(\
\(\(base\) >> 24\) & 0xff\)) 332.007 Tj
0 -142.4 Td
(0562 ) 21.8426 Tj
0 -151.894 Td
(0563 #define STA_X     0x8       // Executable segment) 235.9 Tj
0 -161.387 Td
(0564 #define STA_E     0x4       // Expand down \(non-executabl\
e segments\)) 318.902 Tj
0 -170.88 Td
(0565 #define STA_C     0x4       // Conforming code segment \(e\
xecutable only\)) 336.376 Tj
0 -180.374 Td
(0566 #define STA_W     0x2       // Writeable \(non-executable \
segments\)) 310.165 Tj
0 -189.867 Td
(0567 #define STA_R     0x2       // Readable \(executable segme\
nts\)) 288.322 Tj
0 -199.361 Td
(0568 #define STA_A     0x1       // Accessed) 192.215 Tj
0 -208.854 Td
(0569 ) 21.8426 Tj
0 -218.347 Td
(0570 ) 21.8426 Tj
0 -227.841 Td
(0571 ) 21.8426 Tj
0 -237.334 Td
(0572 ) 21.8426 Tj
0 -246.827 Td
(0573 ) 21.8426 Tj
0 -256.321 Td
(0574 ) 21.8426 Tj
0 -265.814 Td
(0575 ) 21.8426 Tj
0 -275.307 Td
(0576 ) 21.8426 Tj
0 -284.801 Td
(0577 ) 21.8426 Tj
0 -294.294 Td
(0578 ) 21.8426 Tj
0 -303.788 Td
(0579 ) 21.8426 Tj
0 -313.281 Td
(0580 ) 21.8426 Tj
0 -322.774 Td
(0581 ) 21.8426 Tj
0 -332.268 Td
(0582 ) 21.8426 Tj
0 -341.761 Td
(0583 ) 21.8426 Tj
0 -351.254 Td
(0584 ) 21.8426 Tj
0 -360.748 Td
(0585 ) 21.8426 Tj
0 -370.241 Td
(0586 ) 21.8426 Tj
0 -379.734 Td
(0587 ) 21.8426 Tj
0 -389.228 Td
(0588 ) 21.8426 Tj
0 -398.721 Td
(0589 ) 21.8426 Tj
0 -408.214 Td
(0590 ) 21.8426 Tj
0 -417.708 Td
(0591 ) 21.8426 Tj
0 -427.201 Td
(0592 ) 21.8426 Tj
0 -436.695 Td
(0593 ) 21.8426 Tj
0 -446.188 Td
(0594 ) 21.8426 Tj
0 -455.681 Td
(0595 ) 21.8426 Tj
0 -465.175 Td
(0596 ) 21.8426 Tj
0 -474.668 Td
(0597 ) 21.8426 Tj
0 -484.161 Td
(0598 ) 21.8426 Tj
0 -493.655 Td
(0599 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/mmu.h  Page 1) 157.267 Tj
0 -28.4801 Td
(0600 // This file contains definitions for the) 200.952 Tj
0 -37.9735 Td
(0601 // x86 memory management unit \(MMU\).) 179.109 Tj
0 -47.4668 Td
(0602 ) 21.8426 Tj
0 -56.9602 Td
(0603 // Eflags register) 100.476 Tj
0 -66.4535 Td
(0604 #define FL_CF           0x00000001      // Carry Flag) 253.374 Tj
0 -75.9469 Td
(0605 #define FL_PF           0x00000004      // Parity Flag) 257.742 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.005 Tj
0 -104.427 Td
(0608 #define FL_SF           0x00000080      // Sign Flag) 249.005 Tj
0 -113.92 Td
(0609 #define FL_TF           0x00000100      // Trap Flag) 249.005 Tj
0 -123.414 Td
(0610 #define FL_IF           0x00000200      // Interrupt Enabl\
e) 279.585 Tj
0 -132.907 Td
(0611 #define FL_DF           0x00000400      // Direction Flag) 270.848 Tj
0 -142.4 Td
(0612 #define FL_OF           0x00000800      // Overflow Flag) 266.479 Tj
0 -151.894 Td
(0613 #define FL_IOPL_MASK    0x00003000      // I/O Privilege L\
evel bitmask) 327.639 Tj
0 -161.387 Td
(0614 #define FL_IOPL_0       0x00000000      //   IOPL == 0) 257.742 Tj
0 -170.88 Td
(0615 #define FL_IOPL_1       0x00001000      //   IOPL == 1) 257.742 Tj
0 -180.374 Td
(0616 #define FL_IOPL_2       0x00002000      //   IOPL == 2) 257.742 Tj
0 -189.867 Td
(0617 #define FL_IOPL_3       0x00003000      //   IOPL == 3) 257.742 Tj
0 -199.361 Td
(0618 #define FL_NT           0x00004000      // Nested Task) 257.742 Tj
0 -208.854 Td
(0619 #define FL_RF           0x00010000      // Resume Flag) 257.742 Tj
0 -218.347 Td
(0620 #define FL_VM           0x00020000      // Virtual 8086 mo\
de) 283.953 Tj
0 -227.841 Td
(0621 #define FL_AC           0x00040000      // Alignment Check) 275.216 Tj
0 -237.334 Td
(0622 #define FL_VIF          0x00080000      // Virtual Interru\
pt Flag) 305.796 Tj
0 -246.827 Td
(0623 #define FL_VIP          0x00100000      // Virtual Interru\
pt Pending) 318.902 Tj
0 -256.321 Td
(0624 #define FL_ID           0x00200000      // ID flag) 240.268 Tj
0 -265.814 Td
(0625 ) 21.8426 Tj
0 -275.307 Td
(0626 // Segment Descriptor) 113.581 Tj
0 -284.801 Td
(0627 struct segdesc {) 91.7388 Tj
0 -294.294 Td
(0628   uint lim_15_0 : 16;  // Low bits of segment limit) 244.637 Tj
0 -303.788 Td
(0629   uint base_15_0 : 16; // Low bits of segment base address) 275.216 Tj
0 -313.281 Td
(0630   uint base_23_16 : 8; // Middle bits of segment base addr\
ess) 288.322 Tj
0 -322.774 Td
(0631   uint type : 4;       // Segment type \(see STS_ constant\
s\)) 279.585 Tj
0 -332.268 Td
(0632   uint s : 1;          // 0 = system, 1 = application) 253.374 Tj
0 -341.761 Td
(0633   uint dpl : 2;        // Descriptor Privilege Level) 249.005 Tj
0 -351.254 Td
(0634   uint p : 1;          // Present) 166.004 Tj
0 -360.748 Td
(0635   uint lim_19_16 : 4;  // High bits of segment limit) 249.005 Tj
0 -370.241 Td
(0636   uint avl : 1;        // Unused \(available for software \
use\)) 288.322 Tj
0 -379.734 Td
(0637   uint rsv1 : 1;       // Reserved) 170.372 Tj
0 -389.228 Td
(0638   uint db : 1;         // 0 = 16-bit segment, 1 = 32-bit s\
egment) 301.427 Tj
0 -398.721 Td
(0639   uint g : 1;          // Granularity: limit scaled by 4K \
when set) 310.165 Tj
0 -408.214 Td
(0640   uint base_31_24 : 8; // High bits of segment base addres\
s) 279.585 Tj
0 -417.708 Td
(0641 };) 30.5796 Tj
0 -427.201 Td
(0642 ) 21.8426 Tj
0 -436.695 Td
(0643 ) 21.8426 Tj
0 -446.188 Td
(0644 ) 21.8426 Tj
0 -455.681 Td
(0645 ) 21.8426 Tj
0 -465.175 Td
(0646 ) 21.8426 Tj
0 -474.668 Td
(0647 ) 21.8426 Tj
0 -484.161 Td
(0648 ) 21.8426 Tj
0 -493.655 Td
(0649 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/mmu.h  Page 2) 157.267 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.27 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.744 Tj
0 -75.9469 Td
(0655 { \(\(lim\) >> 12\) & 0xffff, \(base\) & 0xffff, \(\(base\)\
 >> 16\) & 0xff,       \\) 340.744 Tj
0 -85.4403 Td
(0656     type, 1, dpl, 1, \(uint\) \(lim\) >> 28, 0, 0, 1, 1,  \
                  \\) 340.744 Tj
0 -94.9336 Td
(0657     \(uint\) \(base\) >> 24 }) 131.055 Tj
0 -104.427 Td
(0658 ) 21.8426 Tj
0 -113.92 Td
(0659 #define SEG16\(type, base, lim, dpl\) \(struct segdesc\)  \
                  \\) 340.744 Tj
0 -123.414 Td
(0660 { \(lim\) & 0xffff, \(base\) & 0xffff, \(\(base\) >> 16\) \
& 0xff,               \\) 340.744 Tj
0 -132.907 Td
(0661     type, 1, dpl, 1, \(uint\) \(lim\) >> 16, 0, 0, 1, 0,  \
                  \\) 340.744 Tj
0 -142.4 Td
(0662     \(uint\) \(base\) >> 24 }) 131.055 Tj
0 -151.894 Td
(0663 ) 21.8426 Tj
0 -161.387 Td
(0664 #define DPL_USER    0x3     // User DPL) 192.215 Tj
0 -170.88 Td
(0665 ) 21.8426 Tj
0 -180.374 Td
(0666 // Application segment type bits) 161.635 Tj
0 -189.867 Td
(0667 #define STA_X       0x8     // Executable segment) 235.9 Tj
0 -199.361 Td
(0668 #define STA_E       0x4     // Expand down \(non-executabl\
e segments\)) 318.902 Tj
0 -208.854 Td
(0669 #define STA_C       0x4     // Conforming code segment \(e\
xecutable only\)) 336.376 Tj
0 -218.347 Td
(0670 #define STA_W       0x2     // Writeable \(non-executable \
segments\)) 310.165 Tj
0 -227.841 Td
(0671 #define STA_R       0x2     // Readable \(executable segme\
nts\)) 288.322 Tj
0 -237.334 Td
(0672 #define STA_A       0x1     // Accessed) 192.215 Tj
0 -246.827 Td
(0673 ) 21.8426 Tj
0 -256.321 Td
(0674 // System segment type bits) 139.792 Tj
0 -265.814 Td
(0675 #define STS_T16A    0x1     // Available 16-bit TSS) 244.637 Tj
0 -275.307 Td
(0676 #define STS_LDT     0x2     // Local Descriptor Table) 253.374 Tj
0 -284.801 Td
(0677 #define STS_T16B    0x3     // Busy 16-bit TSS) 222.794 Tj
0 -294.294 Td
(0678 #define STS_CG16    0x4     // 16-bit Call Gate) 227.163 Tj
0 -303.788 Td
(0679 #define STS_TG      0x5     // Task Gate / Coum Transmitio\
ns) 283.953 Tj
0 -313.281 Td
(0680 #define STS_IG16    0x6     // 16-bit Interrupt Gate) 249.005 Tj
0 -322.774 Td
(0681 #define STS_TG16    0x7     // 16-bit Trap Gate) 227.163 Tj
0 -332.268 Td
(0682 #define STS_T32A    0x9     // Available 32-bit TSS) 244.637 Tj
0 -341.761 Td
(0683 #define STS_T32B    0xB     // Busy 32-bit TSS) 222.794 Tj
0 -351.254 Td
(0684 #define STS_CG32    0xC     // 32-bit Call Gate) 227.163 Tj
0 -360.748 Td
(0685 #define STS_IG32    0xE     // 32-bit Interrupt Gate) 249.005 Tj
0 -370.241 Td
(0686 #define STS_TG32    0xF     // 32-bit Trap Gate) 227.163 Tj
0 -379.734 Td
(0687 ) 21.8426 Tj
0 -389.228 Td
(0688 ) 21.8426 Tj
0 -398.721 Td
(0689 ) 21.8426 Tj
0 -408.214 Td
(0690 ) 21.8426 Tj
0 -417.708 Td
(0691 ) 21.8426 Tj
0 -427.201 Td
(0692 ) 21.8426 Tj
0 -436.695 Td
(0693 ) 21.8426 Tj
0 -446.188 Td
(0694 ) 21.8426 Tj
0 -455.681 Td
(0695 ) 21.8426 Tj
0 -465.175 Td
(0696 ) 21.8426 Tj
0 -474.668 Td
(0697 ) 21.8426 Tj
0 -484.161 Td
(0698 ) 21.8426 Tj
0 -493.655 Td
(0699 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/mmu.h  Page 3) 157.267 Tj
0 -28.4801 Td
(0700 // Task state segment format) 144.161 Tj
0 -37.9735 Td
(0701 struct taskstate {) 100.476 Tj
0 -47.4668 Td
(0702   uint link;         // Old ts selector) 192.215 Tj
0 -56.9602 Td
(0703   uint esp0;         // Stack pointers and segment selecto\
rs) 283.953 Tj
0 -66.4535 Td
(0704   ushort ss0;        //   after an increase in privilege l\
evel) 292.69 Tj
0 -75.9469 Td
(0705   ushort padding1;) 100.476 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.476 Tj
0 -113.92 Td
(0709   uint *esp2;) 78.6333 Tj
0 -123.414 Td
(0710   ushort ss2;) 78.6333 Tj
0 -132.907 Td
(0711   ushort padding3;) 100.476 Tj
0 -142.4 Td
(0712   void *cr3;         // Page directory base) 209.689 Tj
0 -151.894 Td
(0713   uint *eip;         // Saved state from last task switch) 270.848 Tj
0 -161.387 Td
(0714   uint eflags;) 83.0018 Tj
0 -170.88 Td
(0715   uint eax;          // More saved state \(registers\)) 249.005 Tj
0 -180.374 Td
(0716   uint ecx;) 69.8962 Tj
0 -189.867 Td
(0717   uint edx;) 69.8962 Tj
0 -199.361 Td
(0718   uint ebx;) 69.8962 Tj
0 -208.854 Td
(0719   uint *esp;) 74.2647 Tj
0 -218.347 Td
(0720   uint *ebp;) 74.2647 Tj
0 -227.841 Td
(0721   uint esi;) 69.8962 Tj
0 -237.334 Td
(0722   uint edi;) 69.8962 Tj
0 -246.827 Td
(0723   ushort es;         // Even more saved state \(segment se\
lectors\)) 305.796 Tj
0 -256.321 Td
(0724   ushort padding4;) 100.476 Tj
0 -265.814 Td
(0725   ushort cs;) 74.2647 Tj
0 -275.307 Td
(0726   ushort padding5;) 100.476 Tj
0 -284.801 Td
(0727   ushort ss;) 74.2647 Tj
0 -294.294 Td
(0728   ushort padding6;) 100.476 Tj
0 -303.788 Td
(0729   ushort ds;) 74.2647 Tj
0 -313.281 Td
(0730   ushort padding7;) 100.476 Tj
0 -322.774 Td
(0731   ushort fs;) 74.2647 Tj
0 -332.268 Td
(0732   ushort padding8;) 100.476 Tj
0 -341.761 Td
(0733   ushort gs;) 74.2647 Tj
0 -351.254 Td
(0734   ushort padding9;) 100.476 Tj
0 -360.748 Td
(0735   ushort ldt;) 78.6333 Tj
0 -370.241 Td
(0736   ushort padding10;) 104.844 Tj
0 -379.734 Td
(0737   ushort t;          // Trap on task switch) 209.689 Tj
0 -389.228 Td
(0738   ushort iomb;       // I/O map base address) 214.057 Tj
0 -398.721 Td
(0739 };) 30.5796 Tj
0 -408.214 Td
(0740 ) 21.8426 Tj
0 -417.708 Td
(0741 ) 21.8426 Tj
0 -427.201 Td
(0742 ) 21.8426 Tj
0 -436.695 Td
(0743 ) 21.8426 Tj
0 -446.188 Td
(0744 ) 21.8426 Tj
0 -455.681 Td
(0745 ) 21.8426 Tj
0 -465.175 Td
(0746 ) 21.8426 Tj
0 -474.668 Td
(0747 ) 21.8426 Tj
0 -484.161 Td
(0748 ) 21.8426 Tj
0 -493.655 Td
(0749 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/mmu.h  Page 4) 157.267 Tj
0 -28.4801 Td
(0750 // Gate descriptors for interrupts and traps) 214.057 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.585 Tj
0 -56.9602 Td
(0753   uint ss : 16;         // segment selector) 209.689 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.585 Tj
0 -85.4403 Td
(0756   uint type : 4;        // type\(STS_{TG,IG32,TG32}\)) 244.637 Tj
0 -94.9336 Td
(0757   uint s : 1;           // must be 0 \(system\)) 218.426 Tj
0 -104.427 Td
(0758   uint dpl : 2;         // descriptor\(meaning new\) privi\
lege level) 310.165 Tj
0 -113.92 Td
(0759   uint p : 1;           // Present) 170.372 Tj
0 -123.414 Td
(0760   uint off_31_16 : 16;  // high bits of offset in segment) 270.848 Tj
0 -132.907 Td
(0761 };) 30.5796 Tj
0 -142.4 Td
(0762 ) 21.8426 Tj
0 -151.894 Td
(0763 // Set up a normal interrupt/trap gate descriptor.) 240.268 Tj
0 -161.387 Td
(0764 // - istrap: 1 for a trap \(= exception\) gate, 0 for an i\
nterrupt gate.) 327.639 Tj
0 -170.88 Td
(0765 //   interrupt gate clears FL_IF, trap gate leaves FL_IF a\
lone) 292.69 Tj
0 -180.374 Td
(0766 // - sel: Code segment selector for interrupt/trap handler) 275.216 Tj
0 -189.867 Td
(0767 // - off: Offset in code segment for interrupt/trap handle\
r) 279.585 Tj
0 -199.361 Td
(0768 // - dpl: Descriptor Privilege Level -) 187.846 Tj
0 -208.854 Td
(0769 //        the privilege level required for software to inv\
oke) 288.322 Tj
0 -218.347 Td
(0770 //        this interrupt/trap gate explicitly using an int\
 instruction.) 332.007 Tj
0 -227.841 Td
(0771 #define SETGATE\(gate, istrap, sel, off, d\)              \
  \\) 279.585 Tj
0 -237.334 Td
(0772 {                                                         \
\\) 279.585 Tj
0 -246.827 Td
(0773   \(gate\).off_15_0 = \(uint\) \(off\) & 0xffff;          \
      \\) 279.585 Tj
0 -256.321 Td
(0774   \(gate\).ss = \(sel\);                                  \
    \\) 279.585 Tj
0 -265.814 Td
(0775   \(gate\).args = 0;                                      \
  \\) 279.585 Tj
0 -275.307 Td
(0776   \(gate\).rsv1 = 0;                                      \
  \\) 279.585 Tj
0 -284.801 Td
(0777   \(gate\).type = \(istrap\) ? STS_TG32 : STS_IG32;       \
    \\) 279.585 Tj
0 -294.294 Td
(0778   \(gate\).s = 0;                                         \
  \\) 279.585 Tj
0 -303.788 Td
(0779   \(gate\).dpl = \(d\);                                   \
    \\) 279.585 Tj
0 -313.281 Td
(0780   \(gate\).p = 1;                                         \
  \\) 279.585 Tj
0 -322.774 Td
(0781   \(gate\).off_31_16 = \(uint\) \(off\) >> 16;            \
      \\) 279.585 Tj
0 -332.268 Td
(0782 }) 26.2111 Tj
0 -341.761 Td
(0783 ) 21.8426 Tj
0 -351.254 Td
(0784 ) 21.8426 Tj
0 -360.748 Td
(0785 ) 21.8426 Tj
0 -370.241 Td
(0786 ) 21.8426 Tj
0 -379.734 Td
(0787 ) 21.8426 Tj
0 -389.228 Td
(0788 ) 21.8426 Tj
0 -398.721 Td
(0789 ) 21.8426 Tj
0 -408.214 Td
(0790 ) 21.8426 Tj
0 -417.708 Td
(0791 ) 21.8426 Tj
0 -427.201 Td
(0792 ) 21.8426 Tj
0 -436.695 Td
(0793 ) 21.8426 Tj
0 -446.188 Td
(0794 ) 21.8426 Tj
0 -455.681 Td
(0795 ) 21.8426 Tj
0 -465.175 Td
(0796 ) 21.8426 Tj
0 -474.668 Td
(0797 ) 21.8426 Tj
0 -484.161 Td
(0798 ) 21.8426 Tj
0 -493.655 Td
(0799 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/elf.h  Page 1) 157.267 Tj
0 -28.4801 Td
(0800 // Format of an ELF executable file) 174.741 Tj
0 -37.9735 Td
(0801 ) 21.8426 Tj
0 -47.4668 Td
(0802 #define ELF_MAGIC 0x464C457FU  // "\\x7FELF" in little end\
ian) 283.953 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.846 Tj
0 -94.9336 Td
(0807   uchar elf[12];) 91.7388 Tj
0 -104.427 Td
(0808   ushort type;) 83.0018 Tj
0 -113.92 Td
(0809   ushort machine;) 96.1073 Tj
0 -123.414 Td
(0810   uint version;) 87.3703 Tj
0 -132.907 Td
(0811   uint entry;) 78.6333 Tj
0 -142.4 Td
(0812   uint phoff;) 78.6333 Tj
0 -151.894 Td
(0813   uint shoff;) 78.6333 Tj
0 -161.387 Td
(0814   uint flags;) 78.6333 Tj
0 -170.88 Td
(0815   ushort ehsize;) 91.7388 Tj
0 -180.374 Td
(0816   ushort phentsize;) 104.844 Tj
0 -189.867 Td
(0817   ushort phnum;) 87.3703 Tj
0 -199.361 Td
(0818   ushort shentsize;) 104.844 Tj
0 -208.854 Td
(0819   ushort shnum;) 87.3703 Tj
0 -218.347 Td
(0820   ushort shstrndx;) 100.476 Tj
0 -227.841 Td
(0821 };) 30.5796 Tj
0 -237.334 Td
(0822 ) 21.8426 Tj
0 -246.827 Td
(0823 // Program section header) 131.055 Tj
0 -256.321 Td
(0824 struct proghdr {) 91.7388 Tj
0 -265.814 Td
(0825   uint type;) 74.2647 Tj
0 -275.307 Td
(0826   uint offset;) 83.0018 Tj
0 -284.801 Td
(0827   uint va;) 65.5277 Tj
0 -294.294 Td
(0828   uint pa;) 65.5277 Tj
0 -303.788 Td
(0829   uint filesz;) 83.0018 Tj
0 -313.281 Td
(0830   uint memsz;) 78.6333 Tj
0 -322.774 Td
(0831   uint flags;) 78.6333 Tj
0 -332.268 Td
(0832   uint align;) 78.6333 Tj
0 -341.761 Td
(0833 };) 30.5796 Tj
0 -351.254 Td
(0834 ) 21.8426 Tj
0 -360.748 Td
(0835 // Values for Proghdr type) 135.424 Tj
0 -370.241 Td
(0836 #define ELF_PROG_LOAD           1) 166.004 Tj
0 -379.734 Td
(0837 ) 21.8426 Tj
0 -389.228 Td
(0838 // Flag bits for Proghdr flags) 152.898 Tj
0 -398.721 Td
(0839 #define ELF_PROG_FLAG_EXEC      1) 166.004 Tj
0 -408.214 Td
(0840 #define ELF_PROG_FLAG_WRITE     2) 166.004 Tj
0 -417.708 Td
(0841 #define ELF_PROG_FLAG_READ      4) 166.004 Tj
0 -427.201 Td
(0842 ) 21.8426 Tj
0 -436.695 Td
(0843 ) 21.8426 Tj
0 -446.188 Td
(0844 ) 21.8426 Tj
0 -455.681 Td
(0845 ) 21.8426 Tj
0 -465.175 Td
(0846 ) 21.8426 Tj
0 -474.668 Td
(0847 ) 21.8426 Tj
0 -484.161 Td
(0848 ) 21.8426 Tj
0 -493.655 Td
(0849 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/elf.h  Page 2) 157.267 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.92 Td
(0859 ) 21.8426 Tj
0 -123.414 Td
(0860 ) 21.8426 Tj
0 -132.907 Td
(0861 ) 21.8426 Tj
0 -142.4 Td
(0862 ) 21.8426 Tj
0 -151.894 Td
(0863 ) 21.8426 Tj
0 -161.387 Td
(0864 ) 21.8426 Tj
0 -170.88 Td
(0865 ) 21.8426 Tj
0 -180.374 Td
(0866 ) 21.8426 Tj
0 -189.867 Td
(0867 ) 21.8426 Tj
0 -199.361 Td
(0868 ) 21.8426 Tj
0 -208.854 Td
(0869 ) 21.8426 Tj
0 -218.347 Td
(0870 ) 21.8426 Tj
0 -227.841 Td
(0871 ) 21.8426 Tj
0 -237.334 Td
(0872 ) 21.8426 Tj
0 -246.827 Td
(0873 ) 21.8426 Tj
0 -256.321 Td
(0874 ) 21.8426 Tj
0 -265.814 Td
(0875 ) 21.8426 Tj
0 -275.307 Td
(0876 ) 21.8426 Tj
0 -284.801 Td
(0877 ) 21.8426 Tj
0 -294.294 Td
(0878 ) 21.8426 Tj
0 -303.788 Td
(0879 ) 21.8426 Tj
0 -313.281 Td
(0880 ) 21.8426 Tj
0 -322.774 Td
(0881 ) 21.8426 Tj
0 -332.268 Td
(0882 ) 21.8426 Tj
0 -341.761 Td
(0883 ) 21.8426 Tj
0 -351.254 Td
(0884 ) 21.8426 Tj
0 -360.748 Td
(0885 ) 21.8426 Tj
0 -370.241 Td
(0886 ) 21.8426 Tj
0 -379.734 Td
(0887 ) 21.8426 Tj
0 -389.228 Td
(0888 ) 21.8426 Tj
0 -398.721 Td
(0889 ) 21.8426 Tj
0 -408.214 Td
(0890 ) 21.8426 Tj
0 -417.708 Td
(0891 ) 21.8426 Tj
0 -427.201 Td
(0892 ) 21.8426 Tj
0 -436.695 Td
(0893 ) 21.8426 Tj
0 -446.188 Td
(0894 ) 21.8426 Tj
0 -455.681 Td
(0895 ) 21.8426 Tj
0 -465.175 Td
(0896 ) 21.8426 Tj
0 -474.668 Td
(0897 ) 21.8426 Tj
0 -484.161 Td
(0898 ) 21.8426 Tj
0 -493.655 Td
(0899 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/bootasm.S  Page 1) 174.741 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.902 Tj
0 -56.9602 Td
(0903 # The BIOS loads this code from the first sector of the ha\
rd disk into) 327.639 Tj
0 -66.4535 Td
(0904 # memory at physical address 0x7c00 and starts executing i\
n real mode) 323.27 Tj
0 -75.9469 Td
(0905 # with %cs=0 %ip=7c00.) 117.95 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.92 Td
(0909 .set CR0_PE_ON,      0x1         # protected mode enable f\
lag) 288.322 Tj
0 -123.414 Td
(0910 ) 21.8426 Tj
0 -132.907 Td
(0911 .globl start) 74.2647 Tj
0 -142.4 Td
(0912 start:) 48.0537 Tj
0 -151.894 Td
(0913   .code16                     # Assemble for 16-bit mode) 266.479 Tj
0 -161.387 Td
(0914   cli                         # Disable interrupts) 240.268 Tj
0 -170.88 Td
(0915   cld                         # String operations incremen\
t) 279.585 Tj
0 -180.374 Td
(0916 ) 21.8426 Tj
0 -189.867 Td
(0917   # Set up the important data segment registers \(DS, ES, \
SS\).) 288.322 Tj
0 -199.361 Td
(0918   xorw    %ax,%ax             # Segment number zero) 244.637 Tj
0 -208.854 Td
(0919   movw    %ax,%ds             # -> Data Segment) 227.163 Tj
0 -218.347 Td
(0920   movw    %ax,%es             # -> Extra Segment) 231.531 Tj
0 -227.841 Td
(0921   movw    %ax,%ss             # -> Stack Segment) 231.531 Tj
0 -237.334 Td
(0922 ) 21.8426 Tj
0 -246.827 Td
(0923   # Enable A20:) 87.3703 Tj
0 -256.321 Td
(0924   #   For backwards compatibility with the earliest PCs, p\
hysical) 305.796 Tj
0 -265.814 Td
(0925   #   address line 20 is tied low, so that addresses highe\
r than) 301.427 Tj
0 -275.307 Td
(0926   #   1MB wrap around to zero by default.  This code undoe\
s this.) 305.796 Tj
0 -284.801 Td
(0927 seta20.1:) 61.1592 Tj
0 -294.294 Td
(0928   inb     $0x64,%al               # Wait for not busy) 253.374 Tj
0 -303.788 Td
(0929   testb   $0x2,%al) 100.476 Tj
0 -313.281 Td
(0930   jnz     seta20.1) 100.476 Tj
0 -322.774 Td
(0931 ) 21.8426 Tj
0 -332.268 Td
(0932   movb    $0xd1,%al               # 0xd1 -> port 0x64) 253.374 Tj
0 -341.761 Td
(0933   outb    %al,$0x64) 104.844 Tj
0 -351.254 Td
(0934 ) 21.8426 Tj
0 -360.748 Td
(0935 seta20.2:) 61.1592 Tj
0 -370.241 Td
(0936   inb     $0x64,%al               # Wait for not busy) 253.374 Tj
0 -379.734 Td
(0937   testb   $0x2,%al) 100.476 Tj
0 -389.228 Td
(0938   jnz     seta20.2) 100.476 Tj
0 -398.721 Td
(0939 ) 21.8426 Tj
0 -408.214 Td
(0940   movb    $0xdf,%al               # 0xdf -> port 0x60) 253.374 Tj
0 -417.708 Td
(0941   outb    %al,$0x60) 104.844 Tj
0 -427.201 Td
(0942 ) 21.8426 Tj
0 -436.695 Td
(0943 ) 21.8426 Tj
0 -446.188 Td
(0944 ) 21.8426 Tj
0 -455.681 Td
(0945 ) 21.8426 Tj
0 -465.175 Td
(0946 ) 21.8426 Tj
0 -474.668 Td
(0947 ) 21.8426 Tj
0 -484.161 Td
(0948 ) 21.8426 Tj
0 -493.655 Td
(0949 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/bootasm.S  Page 2) 174.741 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.479 Tj
0 -47.4668 Td
(0952   # identical to their physical addresses, so that the) 257.742 Tj
0 -56.9602 Td
(0953   # effective memory map does not change during the switch\
.) 279.585 Tj
0 -66.4535 Td
(0954   lgdt    gdtdesc) 96.1073 Tj
0 -75.9469 Td
(0955   movl    %cr0, %eax) 109.213 Tj
0 -85.4403 Td
(0956   orl     $CR0_PE_ON, %eax) 135.424 Tj
0 -94.9336 Td
(0957   movl    %eax, %cr0) 109.213 Tj
0 -104.427 Td
(0958 ) 21.8426 Tj
0 -113.92 Td
(0959   # Jump to next instruction, but in 32-bit code segment.) 270.848 Tj
0 -123.414 Td
(0960   # Switches processor into 32-bit mode.) 196.583 Tj
0 -132.907 Td
(0961   ljmp    $PROT_MODE_CSEG, $protcseg) 179.109 Tj
0 -142.4 Td
(0962 ) 21.8426 Tj
0 -151.894 Td
(0963   .code32                     # Assemble for 32-bit mode) 266.479 Tj
0 -161.387 Td
(0964 protcseg:) 61.1592 Tj
0 -170.88 Td
(0965   # Set up the protected-mode data segment registers) 249.005 Tj
0 -180.374 Td
(0966   movw    $PROT_MODE_DSEG, %ax    # Our data segment selec\
tor) 288.322 Tj
0 -189.867 Td
(0967   movw    %ax, %ds                # -> DS: Data Segment) 262.111 Tj
0 -199.361 Td
(0968   movw    %ax, %es                # -> ES: Extra Segment) 266.479 Tj
0 -208.854 Td
(0969   movw    %ax, %fs                # -> FS) 200.952 Tj
0 -218.347 Td
(0970   movw    %ax, %gs                # -> GS) 200.952 Tj
0 -227.841 Td
(0971   movw    %ax, %ss                # -> SS: Stack Segment) 266.479 Tj
0 -237.334 Td
(0972 ) 21.8426 Tj
0 -246.827 Td
(0973   # Set up the stack pointer and call into C.) 218.426 Tj
0 -256.321 Td
(0974   movl    $start, %esp) 117.95 Tj
0 -265.814 Td
(0975   call    bootmain) 100.476 Tj
0 -275.307 Td
(0976 ) 21.8426 Tj
0 -284.801 Td
(0977   # If bootmain returns \(it shouldn't\), loop.) 218.426 Tj
0 -294.294 Td
(0978 spin:) 43.6851 Tj
0 -303.788 Td
(0979   jmp     spin) 83.0018 Tj
0 -313.281 Td
(0980 ) 21.8426 Tj
0 -322.774 Td
(0981 # Bootstrap GDT) 87.3703 Tj
0 -332.268 Td
(0982 .p2align 2                                # force 4 byte a\
lignment) 310.165 Tj
0 -341.761 Td
(0983 gdt:) 39.3166 Tj
0 -351.254 Td
(0984   SEG_NULLASM                             # null seg) 249.005 Tj
0 -360.748 Td
(0985   SEG_ASM\(STA_X|STA_R, 0x0, 0xffffffff\)   # code seg) 249.005 Tj
0 -370.241 Td
(0986   SEG_ASM\(STA_W, 0x0, 0xffffffff\)         # data seg) 249.005 Tj
0 -379.734 Td
(0987 ) 21.8426 Tj
0 -389.228 Td
(0988 gdtdesc:) 56.7907 Tj
0 -398.721 Td
(0989   .word   0x17                            # sizeof\(gdt\) \
- 1) 279.585 Tj
0 -408.214 Td
(0990   .long   gdt                             # address gdt) 262.111 Tj
0 -417.708 Td
(0991 ) 21.8426 Tj
0 -427.201 Td
(0992 ) 21.8426 Tj
0 -436.695 Td
(0993 ) 21.8426 Tj
0 -446.188 Td
(0994 ) 21.8426 Tj
0 -455.681 Td
(0995 ) 21.8426 Tj
0 -465.175 Td
(0996 ) 21.8426 Tj
0 -474.668 Td
(0997 ) 21.8426 Tj
0 -484.161 Td
(0998 ) 21.8426 Tj
0 -493.655 Td
(0999 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/bootother.S  Page 1) 183.478 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 # Start an Application Processor. This must be placed on a\
 4KB boundary) 332.007 Tj
0 -56.9602 Td
(1003 # somewhere in the 1st MB of conventional memory \(APBOOTS\
TRAP\). However,) 336.376 Tj
0 -66.4535 Td
(1004 # due to some shortcuts below it's restricted further to w\
ithin the 1st) 332.007 Tj
0 -75.9469 Td
(1005 # 64KB. The AP starts in real-mode, with) 196.583 Tj
0 -85.4403 Td
(1006 #   CS selector set to the startup memory address/16;) 253.374 Tj
0 -94.9336 Td
(1007 #   CS base set to startup memory address;) 205.32 Tj
0 -104.427 Td
(1008 #   CS limit set to 64KB;) 131.055 Tj
0 -113.92 Td
(1009 #   CPL and IP set to 0.) 126.687 Tj
0 -123.414 Td
(1010 #) 26.2111 Tj
0 -132.907 Td
(1011 # Bootothers \(in main.c\) starts each non-boot CPU in tur\
n.) 275.216 Tj
0 -142.4 Td
(1012 # It puts the correct %esp in start-4,) 187.846 Tj
0 -151.894 Td
(1013 # and the place to jump to in start-8.) 187.846 Tj
0 -161.387 Td
(1014 #) 26.2111 Tj
0 -170.88 Td
(1015 # This code is identical to bootasm.S except:) 218.426 Tj
0 -180.374 Td
(1016 #   - it does not need to enable A20) 179.109 Tj
0 -189.867 Td
(1017 #   - it uses the address at start-4 for the %esp) 235.9 Tj
0 -199.361 Td
(1018 #   - it jumps to the address at start-8 instead of callin\
g bootmain) 318.902 Tj
0 -208.854 Td
(1019 ) 21.8426 Tj
0 -218.347 Td
(1020 .set PROT_MODE_CSEG, 0x8         # kernel code segment sel\
ector) 297.059 Tj
0 -227.841 Td
(1021 .set PROT_MODE_DSEG, 0x10        # kernel data segment sel\
ector) 297.059 Tj
0 -237.334 Td
(1022 .set CR0_PE_ON,      0x1         # protected mode enable f\
lag) 288.322 Tj
0 -246.827 Td
(1023 ) 21.8426 Tj
0 -256.321 Td
(1024 .globl start) 74.2647 Tj
0 -265.814 Td
(1025 start:) 48.0537 Tj
0 -275.307 Td
(1026   .code16                     # Assemble for 16-bit mode) 266.479 Tj
0 -284.801 Td
(1027   cli                         # Disable interrupts) 240.268 Tj
0 -294.294 Td
(1028   cld                         # String operations incremen\
t) 279.585 Tj
0 -303.788 Td
(1029 ) 21.8426 Tj
0 -313.281 Td
(1030   # Set up the important data segment registers \(DS, ES, \
SS\).) 288.322 Tj
0 -322.774 Td
(1031   xorw    %ax,%ax             # Segment number zero) 244.637 Tj
0 -332.268 Td
(1032   movw    %ax,%ds             # -> Data Segment) 227.163 Tj
0 -341.761 Td
(1033   movw    %ax,%es             # -> Extra Segment) 231.531 Tj
0 -351.254 Td
(1034   movw    %ax,%ss             # -> Stack Segment) 231.531 Tj
0 -360.748 Td
(1035 ) 21.8426 Tj
0 -370.241 Td
(1036 ) 21.8426 Tj
0 -379.734 Td
(1037 ) 21.8426 Tj
0 -389.228 Td
(1038 ) 21.8426 Tj
0 -398.721 Td
(1039 ) 21.8426 Tj
0 -408.214 Td
(1040 ) 21.8426 Tj
0 -417.708 Td
(1041 ) 21.8426 Tj
0 -427.201 Td
(1042 ) 21.8426 Tj
0 -436.695 Td
(1043 ) 21.8426 Tj
0 -446.188 Td
(1044 ) 21.8426 Tj
0 -455.681 Td
(1045 ) 21.8426 Tj
0 -465.175 Td
(1046 ) 21.8426 Tj
0 -474.668 Td
(1047 ) 21.8426 Tj
0 -484.161 Td
(1048 ) 21.8426 Tj
0 -493.655 Td
(1049 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/bootother.S  Page 2) 183.478 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.479 Tj
0 -47.4668 Td
(1052   # identical to their physical addresses, so that the) 257.742 Tj
0 -56.9602 Td
(1053   # effective memory map does not change during the switch\
.) 279.585 Tj
0 -66.4535 Td
(1054   lgdt    gdtdesc) 96.1073 Tj
0 -75.9469 Td
(1055   movl    %cr0, %eax) 109.213 Tj
0 -85.4403 Td
(1056   orl     $CR0_PE_ON, %eax) 135.424 Tj
0 -94.9336 Td
(1057   movl    %eax, %cr0) 109.213 Tj
0 -104.427 Td
(1058 ) 21.8426 Tj
0 -113.92 Td
(1059   # Jump to next instruction, but in 32-bit code segment.) 270.848 Tj
0 -123.414 Td
(1060   # Switches processor into 32-bit mode.) 196.583 Tj
0 -132.907 Td
(1061   ljmp    $PROT_MODE_CSEG, $protcseg) 179.109 Tj
0 -142.4 Td
(1062 ) 21.8426 Tj
0 -151.894 Td
(1063   .code32                     # Assemble for 32-bit mode) 266.479 Tj
0 -161.387 Td
(1064 protcseg:) 61.1592 Tj
0 -170.88 Td
(1065   # Set up the protected-mode data segment registers) 249.005 Tj
0 -180.374 Td
(1066   movw    $PROT_MODE_DSEG, %ax    # Our data segment selec\
tor) 288.322 Tj
0 -189.867 Td
(1067   movw    %ax, %ds                # -> DS: Data Segment) 262.111 Tj
0 -199.361 Td
(1068   movw    %ax, %es                # -> ES: Extra Segment) 266.479 Tj
0 -208.854 Td
(1069   movw    %ax, %fs                # -> FS) 200.952 Tj
0 -218.347 Td
(1070   movw    %ax, %gs                # -> GS) 200.952 Tj
0 -227.841 Td
(1071   movw    %ax, %ss                # -> SS: Stack Segment) 266.479 Tj
0 -237.334 Td
(1072 ) 21.8426 Tj
0 -246.827 Td
(1073   movl    start-4, %esp) 122.318 Tj
0 -256.321 Td
(1074   movl    start-8, %eax) 122.318 Tj
0 -265.814 Td
(1075   jmp     *%eax) 87.3703 Tj
0 -275.307 Td
(1076 ) 21.8426 Tj
0 -284.801 Td
(1077 # Bootstrap GDT) 87.3703 Tj
0 -294.294 Td
(1078 .p2align 2                                # force 4 byte a\
lignment) 310.165 Tj
0 -303.788 Td
(1079 gdt:) 39.3166 Tj
0 -313.281 Td
(1080   SEG_NULLASM                             # null seg) 249.005 Tj
0 -322.774 Td
(1081   SEG_ASM\(STA_X|STA_R, 0x0, 0xffffffff\)   # code seg) 249.005 Tj
0 -332.268 Td
(1082   SEG_ASM\(STA_W, 0x0, 0xffffffff\)         # data seg) 249.005 Tj
0 -341.761 Td
(1083 ) 21.8426 Tj
0 -351.254 Td
(1084 gdtdesc:) 56.7907 Tj
0 -360.748 Td
(1085   .word   0x17                            # sizeof\(gdt\) \
- 1) 279.585 Tj
0 -370.241 Td
(1086   .long   gdt                             # address gdt) 262.111 Tj
0 -379.734 Td
(1087 ) 21.8426 Tj
0 -389.228 Td
(1088 ) 21.8426 Tj
0 -398.721 Td
(1089 ) 21.8426 Tj
0 -408.214 Td
(1090 ) 21.8426 Tj
0 -417.708 Td
(1091 ) 21.8426 Tj
0 -427.201 Td
(1092 ) 21.8426 Tj
0 -436.695 Td
(1093 ) 21.8426 Tj
0 -446.188 Td
(1094 ) 21.8426 Tj
0 -455.681 Td
(1095 ) 21.8426 Tj
0 -465.175 Td
(1096 ) 21.8426 Tj
0 -474.668 Td
(1097 ) 21.8426 Tj
0 -484.161 Td
(1098 ) 21.8426 Tj
0 -493.655 Td
(1099 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/bootmain.c  Page 1) 179.109 Tj
0 -28.4801 Td
(1100 // Boot loader.) 87.3703 Tj
0 -37.9735 Td
(1101 //) 30.5796 Tj
0 -47.4668 Td
(1102 // The BIOS loads boot sector \(bootasm.S\) from sector 0 \
of the disk) 314.533 Tj
0 -56.9602 Td
(1103 // into memory and executes it.  The boot sector puts the \
processor) 314.533 Tj
0 -66.4535 Td
(1104 // in 32-bit mode and calls bootmain below, which loads an\
 ELF kernel) 323.27 Tj
0 -75.9469 Td
(1105 // image from the disk starting at sector 1 and then jumps\
 to the) 305.796 Tj
0 -85.4403 Td
(1106 // kernel entry routine.) 126.687 Tj
0 -94.9336 Td
(1107 ) 21.8426 Tj
0 -104.427 Td
(1108 #include "types.h") 100.476 Tj
0 -113.92 Td
(1109 #include "elf.h") 91.7388 Tj
0 -123.414 Td
(1110 #include "x86.h") 91.7388 Tj
0 -132.907 Td
(1111 ) 21.8426 Tj
0 -142.4 Td
(1112 #define SECTSIZE  512) 113.581 Tj
0 -151.894 Td
(1113 ) 21.8426 Tj
0 -161.387 Td
(1114 void readseg\(uint, uint, uint\);) 157.267 Tj
0 -170.88 Td
(1115 ) 21.8426 Tj
0 -180.374 Td
(1116 void) 39.3166 Tj
0 -189.867 Td
(1117 bootmain\(void\)) 83.0018 Tj
0 -199.361 Td
(1118 {) 26.2111 Tj
0 -208.854 Td
(1119   struct elfhdr *elf;) 113.581 Tj
0 -218.347 Td
(1120   struct proghdr *ph, *eph;) 139.792 Tj
0 -227.841 Td
(1121   void \(*entry\)\(void\);) 117.95 Tj
0 -237.334 Td
(1122 ) 21.8426 Tj
0 -246.827 Td
(1123   elf = \(struct elfhdr*\)0x10000;  // scratch space) 240.268 Tj
0 -256.321 Td
(1124 ) 21.8426 Tj
0 -265.814 Td
(1125   // Read 1st page off disk) 139.792 Tj
0 -275.307 Td
(1126   readseg\(\(uint\)elf, SECTSIZE*8, 0\);) 179.109 Tj
0 -284.801 Td
(1127 ) 21.8426 Tj
0 -294.294 Td
(1128   // Is this an ELF executable?) 157.267 Tj
0 -303.788 Td
(1129   if\(elf->magic != ELF_MAGIC\)) 148.529 Tj
0 -313.281 Td
(1130     goto bad;) 78.6333 Tj
0 -322.774 Td
(1131 ) 21.8426 Tj
0 -332.268 Td
(1132   // Load each program segment \(ignores ph flags\).) 240.268 Tj
0 -341.761 Td
(1133   ph = \(struct proghdr*\)\(\(uchar*\)elf + elf->phoff\);) 244.637 Tj
0 -351.254 Td
(1134   eph = ph + elf->phnum;) 126.687 Tj
0 -360.748 Td
(1135   for\(; ph < eph; ph++\)) 122.318 Tj
0 -370.241 Td
(1136     readseg\(ph->va, ph->memsz, ph->offset\);) 209.689 Tj
0 -379.734 Td
(1137 ) 21.8426 Tj
0 -389.228 Td
(1138   // Call the entry point from the ELF header.) 222.794 Tj
0 -398.721 Td
(1139   // Does not return!) 113.581 Tj
0 -408.214 Td
(1140   entry = \(void\(*\)\(void\)\)\(elf->entry & 0xFFFFFF\);) 235.9 Tj
0 -417.708 Td
(1141   entry\(\);) 65.5277 Tj
0 -427.201 Td
(1142 ) 21.8426 Tj
0 -436.695 Td
(1143 bad:) 39.3166 Tj
0 -446.188 Td
(1144   outw\(0x8A00, 0x8A00\);) 122.318 Tj
0 -455.681 Td
(1145   outw\(0x8A00, 0x8E00\);) 122.318 Tj
0 -465.175 Td
(1146   for\(;;\)) 61.1592 Tj
0 -474.668 Td
(1147     ;) 43.6851 Tj
0 -484.161 Td
(1148 }) 26.2111 Tj
0 -493.655 Td
(1149 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/bootmain.c  Page 2) 179.109 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.055 Tj
0 -66.4535 Td
(1154   while\(\(inb\(0x1F7\) & 0xC0\) != 0x40\)) 179.109 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.689 Tj
0 -113.92 Td
(1159 void) 39.3166 Tj
0 -123.414 Td
(1160 readsect\(void *dst, uint offset\)) 161.635 Tj
0 -132.907 Td
(1161 {) 26.2111 Tj
0 -142.4 Td
(1162   // Issue command.) 104.844 Tj
0 -151.894 Td
(1163   waitdisk\(\);) 78.6333 Tj
0 -161.387 Td
(1164   outb\(0x1F2, 1\);   // count = 1) 161.635 Tj
0 -170.88 Td
(1165   outb\(0x1F3, offset\);) 117.95 Tj
0 -180.374 Td
(1166   outb\(0x1F4, offset >> 8\);) 139.792 Tj
0 -189.867 Td
(1167   outb\(0x1F5, offset >> 16\);) 144.161 Tj
0 -199.361 Td
(1168   outb\(0x1F6, \(offset >> 24\) | 0xE0\);) 183.478 Tj
0 -208.854 Td
(1169   outb\(0x1F7, 0x20\);  // cmd 0x20 - read sectors) 231.531 Tj
0 -218.347 Td
(1170 ) 21.8426 Tj
0 -227.841 Td
(1171   // Read data.) 87.3703 Tj
0 -237.334 Td
(1172   waitdisk\(\);) 78.6333 Tj
0 -246.827 Td
(1173   insl\(0x1F0, dst, SECTSIZE/4\);) 157.267 Tj
0 -256.321 Td
(1174 }) 26.2111 Tj
0 -265.814 Td
(1175 ) 21.8426 Tj
0 -275.307 Td
(1176 // Read 'count' bytes at 'offset' from kernel into virtual\
 address 'va'.) 336.376 Tj
0 -284.801 Td
(1177 // Might copy more than asked.) 152.898 Tj
0 -294.294 Td
(1178 void) 39.3166 Tj
0 -303.788 Td
(1179 readseg\(uint va, uint count, uint offset\)) 200.952 Tj
0 -313.281 Td
(1180 {) 26.2111 Tj
0 -322.774 Td
(1181   uint eva;) 69.8962 Tj
0 -332.268 Td
(1182 ) 21.8426 Tj
0 -341.761 Td
(1183   va &= 0xFFFFFF;) 96.1073 Tj
0 -351.254 Td
(1184   eva = va + count;) 104.844 Tj
0 -360.748 Td
(1185 ) 21.8426 Tj
0 -370.241 Td
(1186   // Round down to sector boundary.) 174.741 Tj
0 -379.734 Td
(1187   va &= ~\(SECTSIZE - 1\);) 126.687 Tj
0 -389.228 Td
(1188 ) 21.8426 Tj
0 -398.721 Td
(1189   // Translate from bytes to sectors; kernel starts at sec\
tor 1.) 301.427 Tj
0 -408.214 Td
(1190   offset = \(offset / SECTSIZE\) + 1;) 174.741 Tj
0 -417.708 Td
(1191 ) 21.8426 Tj
0 -427.201 Td
(1192   // If this is too slow, we could read lots of sectors at\
 a time.) 310.165 Tj
0 -436.695 Td
(1193   // We'd write more to memory than asked, but it doesn't \
matter --) 314.533 Tj
0 -446.188 Td
(1194   // we load in increasing order.) 166.004 Tj
0 -455.681 Td
(1195   for\(; va < eva; va += SECTSIZE, offset++\)) 209.689 Tj
0 -465.175 Td
(1196     readsect\(\(uchar*\)va, offset\);) 166.004 Tj
0 -474.668 Td
(1197 }) 26.2111 Tj
0 -484.161 Td
(1198 ) 21.8426 Tj
0 -493.655 Td
(1199 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/main.c  Page 1) 161.635 Tj
0 -28.4801 Td
(1200 #include "types.h") 100.476 Tj
0 -37.9735 Td
(1201 #include "defs.h") 96.1073 Tj
0 -47.4668 Td
(1202 #include "param.h") 100.476 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.529 Tj
0 -104.427 Td
(1208 ) 21.8426 Tj
0 -113.92 Td
(1209 // Bootstrap processor starts running C code here.) 240.268 Tj
0 -123.414 Td
(1210 int) 34.9481 Tj
0 -132.907 Td
(1211 main\(void\)) 65.5277 Tj
0 -142.4 Td
(1212 {) 26.2111 Tj
0 -151.894 Td
(1213   int i;) 56.7907 Tj
0 -161.387 Td
(1214   static volatile int bcpu;  // cannot be on stack) 240.268 Tj
0 -170.88 Td
(1215   extern char edata[], end[];) 148.529 Tj
0 -180.374 Td
(1216 ) 21.8426 Tj
0 -189.867 Td
(1217   // clear BSS) 83.0018 Tj
0 -199.361 Td
(1218   memset\(edata, 0, end - edata\);) 161.635 Tj
0 -208.854 Td
(1219 ) 21.8426 Tj
0 -218.347 Td
(1220   // Prevent release\(\) from enabling interrupts.) 231.531 Tj
0 -227.841 Td
(1221   for\(i=0; i<NCPU; i++\)) 122.318 Tj
0 -237.334 Td
(1222     cpus[i].nlock = 1;) 117.95 Tj
0 -246.827 Td
(1223 ) 21.8426 Tj
0 -256.321 Td
(1224   mp_init\(\); // collect info about this machine) 227.163 Tj
0 -265.814 Td
(1225   bcpu = mp_bcpu\(\);) 104.844 Tj
0 -275.307 Td
(1226 ) 21.8426 Tj
0 -284.801 Td
(1227   // Switch to bootstrap processor's stack) 205.32 Tj
0 -294.294 Td
(1228   asm volatile\("movl %0, %%esp" : : "r" \(cpus[bcpu].mpst\
ack+MPSTACK-32\)\);) 340.744 Tj
0 -303.788 Td
(1229   asm volatile\("movl %0, %%ebp" : : "r" \(cpus[bcpu].mpst\
ack+MPSTACK\)\);) 327.639 Tj
0 -313.281 Td
(1230 ) 21.8426 Tj
0 -322.774 Td
(1231   lapic_init\(bcpu\);) 104.844 Tj
0 -332.268 Td
(1232   cprintf\("\\ncpu%d: starting xv6\\n\\n", cpu\(\)\);) 222.794 Tj
0 -341.761 Td
(1233 ) 21.8426 Tj
0 -351.254 Td
(1234   pinit\(\);         // process table) 174.741 Tj
0 -360.748 Td
(1235   binit\(\);         // buffer cache) 170.372 Tj
0 -370.241 Td
(1236   pic_init\(\);      // interrupt controller) 205.32 Tj
0 -379.734 Td
(1237   ioapic_init\(\);   // another interrupt controller) 240.268 Tj
0 -389.228 Td
(1238   kinit\(\);         // physical memory allocator) 227.163 Tj
0 -398.721 Td
(1239   tvinit\(\);        // trap vectors) 170.372 Tj
0 -408.214 Td
(1240   idtinit\(\);       // interrupt descriptor table) 231.531 Tj
0 -417.708 Td
(1241   fileinit\(\);      // file table) 161.635 Tj
0 -427.201 Td
(1242   iinit\(\);         // inode cache) 166.004 Tj
0 -436.695 Td
(1243   setupsegs\(0\);    // segments & TSS) 179.109 Tj
0 -446.188 Td
(1244   console_init\(\);  // I/O devices & their interrupts) 249.005 Tj
0 -455.681 Td
(1245   ide_init\(\);      // disk) 135.424 Tj
0 -465.175 Td
(1246   bootothers\(\);    // boot other CPUs) 183.478 Tj
0 -474.668 Td
(1247   if\(!ismp\)) 69.8962 Tj
0 -484.161 Td
(1248     timer_init\(\); // uniprocessor timer) 192.215 Tj
0 -493.655 Td
(1249   userinit\(\);      // first user process) 196.583 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/main.c  Page 2) 161.635 Tj
0 -28.4801 Td
(1250   // enable interrupts on this processor.) 200.952 Tj
0 -37.9735 Td
(1251   cpus[cpu\(\)].nlock--;) 117.95 Tj
0 -47.4668 Td
(1252   sti\(\);) 56.7907 Tj
0 -56.9602 Td
(1253 ) 21.8426 Tj
0 -66.4535 Td
(1254   scheduler\(\);) 83.0018 Tj
0 -75.9469 Td
(1255 }) 26.2111 Tj
0 -85.4403 Td
(1256 ) 21.8426 Tj
0 -94.9336 Td
(1257 // Additional processors start here.) 179.109 Tj
0 -104.427 Td
(1258 static void) 69.8962 Tj
0 -113.92 Td
(1259 mpmain\(void\)) 74.2647 Tj
0 -123.414 Td
(1260 {) 26.2111 Tj
0 -132.907 Td
(1261   cprintf\("cpu%d: starting\\n", cpu\(\)\);) 187.846 Tj
0 -142.4 Td
(1262   idtinit\(\);) 74.2647 Tj
0 -151.894 Td
(1263   lapic_init\(cpu\(\)\);) 109.213 Tj
0 -161.387 Td
(1264   setupsegs\(0\);) 87.3703 Tj
0 -170.88 Td
(1265   cpuid\(0, 0, 0, 0, 0\);  // memory barrier) 205.32 Tj
0 -180.374 Td
(1266   cpus[cpu\(\)].booted = 1;) 131.055 Tj
0 -189.867 Td
(1267 ) 21.8426 Tj
0 -199.361 Td
(1268   // Enable interrupts on this processor.) 200.952 Tj
0 -208.854 Td
(1269   cpus[cpu\(\)].nlock--;) 117.95 Tj
0 -218.347 Td
(1270   sti\(\);) 56.7907 Tj
0 -227.841 Td
(1271 ) 21.8426 Tj
0 -237.334 Td
(1272   scheduler\(\);) 83.0018 Tj
0 -246.827 Td
(1273 }) 26.2111 Tj
0 -256.321 Td
(1274 ) 21.8426 Tj
0 -265.814 Td
(1275 static void) 69.8962 Tj
0 -275.307 Td
(1276 bootothers\(void\)) 91.7388 Tj
0 -284.801 Td
(1277 {) 26.2111 Tj
0 -294.294 Td
(1278   extern uchar _binary_bootother_start[], _binary_bootothe\
r_size[];) 314.533 Tj
0 -303.788 Td
(1279   uchar *code;) 83.0018 Tj
0 -313.281 Td
(1280   struct cpu *c;) 91.7388 Tj
0 -322.774 Td
(1281 ) 21.8426 Tj
0 -332.268 Td
(1282   // Write bootstrap code to unused memory at 0x7000.) 253.374 Tj
0 -341.761 Td
(1283   code = \(uchar*\)0x7000;) 126.687 Tj
0 -351.254 Td
(1284   memmove\(code, _binary_bootother_start, \(uint\)_binary_\
bootother_size\);) 332.007 Tj
0 -360.748 Td
(1285 ) 21.8426 Tj
0 -370.241 Td
(1286   for\(c = cpus; c < cpus+ncpu; c++\){) 179.109 Tj
0 -379.734 Td
(1287     if\(c == cpus+cpu\(\)\)  // We've started already.) 240.268 Tj
0 -389.228 Td
(1288       continue;) 87.3703 Tj
0 -398.721 Td
(1289 ) 21.8426 Tj
0 -408.214 Td
(1290     // Fill in %esp, %eip and start code on cpu.) 231.531 Tj
0 -417.708 Td
(1291     *\(void**\)\(code-4\) = c->mpstack + MPSTACK;) 218.426 Tj
0 -427.201 Td
(1292     *\(void**\)\(code-8\) = mpmain;) 157.267 Tj
0 -436.695 Td
(1293     lapic_startap\(c->apicid, \(uint\)code\);) 200.952 Tj
0 -446.188 Td
(1294 ) 21.8426 Tj
0 -455.681 Td
(1295     // Wait for cpu to get through bootstrap.) 218.426 Tj
0 -465.175 Td
(1296     while\(c->booted == 0\)) 131.055 Tj
0 -474.668 Td
(1297       ;) 52.4222 Tj
0 -484.161 Td
(1298   }) 34.9481 Tj
0 -493.655 Td
(1299 }) 26.2111 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/spinlock.h  Page 1) 179.109 Tj
0 -28.4801 Td
(1300 // Mutual exclusion lock.) 131.055 Tj
0 -37.9735 Td
(1301 struct spinlock {) 96.1073 Tj
0 -47.4668 Td
(1302   uint locked;   // Is the lock held?) 183.478 Tj
0 -56.9602 Td
(1303 ) 21.8426 Tj
0 -66.4535 Td
(1304   // For debugging:) 104.844 Tj
0 -75.9469 Td
(1305   char *name;    // Name of lock.) 166.004 Tj
0 -85.4403 Td
(1306   int  cpu;      // The number of the cpu holding the lock\
.) 279.585 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.952 Tj
0 -113.92 Td
(1309 };) 30.5796 Tj
0 -123.414 Td
(1310 ) 21.8426 Tj
0 -132.907 Td
(1311 ) 21.8426 Tj
0 -142.4 Td
(1312 ) 21.8426 Tj
0 -151.894 Td
(1313 ) 21.8426 Tj
0 -161.387 Td
(1314 ) 21.8426 Tj
0 -170.88 Td
(1315 ) 21.8426 Tj
0 -180.374 Td
(1316 ) 21.8426 Tj
0 -189.867 Td
(1317 ) 21.8426 Tj
0 -199.361 Td
(1318 ) 21.8426 Tj
0 -208.854 Td
(1319 ) 21.8426 Tj
0 -218.347 Td
(1320 ) 21.8426 Tj
0 -227.841 Td
(1321 ) 21.8426 Tj
0 -237.334 Td
(1322 ) 21.8426 Tj
0 -246.827 Td
(1323 ) 21.8426 Tj
0 -256.321 Td
(1324 ) 21.8426 Tj
0 -265.814 Td
(1325 ) 21.8426 Tj
0 -275.307 Td
(1326 ) 21.8426 Tj
0 -284.801 Td
(1327 ) 21.8426 Tj
0 -294.294 Td
(1328 ) 21.8426 Tj
0 -303.788 Td
(1329 ) 21.8426 Tj
0 -313.281 Td
(1330 ) 21.8426 Tj
0 -322.774 Td
(1331 ) 21.8426 Tj
0 -332.268 Td
(1332 ) 21.8426 Tj
0 -341.761 Td
(1333 ) 21.8426 Tj
0 -351.254 Td
(1334 ) 21.8426 Tj
0 -360.748 Td
(1335 ) 21.8426 Tj
0 -370.241 Td
(1336 ) 21.8426 Tj
0 -379.734 Td
(1337 ) 21.8426 Tj
0 -389.228 Td
(1338 ) 21.8426 Tj
0 -398.721 Td
(1339 ) 21.8426 Tj
0 -408.214 Td
(1340 ) 21.8426 Tj
0 -417.708 Td
(1341 ) 21.8426 Tj
0 -427.201 Td
(1342 ) 21.8426 Tj
0 -436.695 Td
(1343 ) 21.8426 Tj
0 -446.188 Td
(1344 ) 21.8426 Tj
0 -455.681 Td
(1345 ) 21.8426 Tj
0 -465.175 Td
(1346 ) 21.8426 Tj
0 -474.668 Td
(1347 ) 21.8426 Tj
0 -484.161 Td
(1348 ) 21.8426 Tj
0 -493.655 Td
(1349 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/spinlock.h  Page 2) 179.109 Tj
0 -28.4801 Td
(1350 // Blank page.) 83.0018 Tj
0 -37.9735 Td
(1351 ) 21.8426 Tj
0 -47.4668 Td
(1352 ) 21.8426 Tj
0 -56.9602 Td
(1353 ) 21.8426 Tj
0 -66.4535 Td
(1354 ) 21.8426 Tj
0 -75.9469 Td
(1355 ) 21.8426 Tj
0 -85.4403 Td
(1356 ) 21.8426 Tj
0 -94.9336 Td
(1357 ) 21.8426 Tj
0 -104.427 Td
(1358 ) 21.8426 Tj
0 -113.92 Td
(1359 ) 21.8426 Tj
0 -123.414 Td
(1360 ) 21.8426 Tj
0 -132.907 Td
(1361 ) 21.8426 Tj
0 -142.4 Td
(1362 ) 21.8426 Tj
0 -151.894 Td
(1363 ) 21.8426 Tj
0 -161.387 Td
(1364 ) 21.8426 Tj
0 -170.88 Td
(1365 ) 21.8426 Tj
0 -180.374 Td
(1366 ) 21.8426 Tj
0 -189.867 Td
(1367 ) 21.8426 Tj
0 -199.361 Td
(1368 ) 21.8426 Tj
0 -208.854 Td
(1369 ) 21.8426 Tj
0 -218.347 Td
(1370 ) 21.8426 Tj
0 -227.841 Td
(1371 ) 21.8426 Tj
0 -237.334 Td
(1372 ) 21.8426 Tj
0 -246.827 Td
(1373 ) 21.8426 Tj
0 -256.321 Td
(1374 ) 21.8426 Tj
0 -265.814 Td
(1375 ) 21.8426 Tj
0 -275.307 Td
(1376 ) 21.8426 Tj
0 -284.801 Td
(1377 ) 21.8426 Tj
0 -294.294 Td
(1378 ) 21.8426 Tj
0 -303.788 Td
(1379 ) 21.8426 Tj
0 -313.281 Td
(1380 ) 21.8426 Tj
0 -322.774 Td
(1381 ) 21.8426 Tj
0 -332.268 Td
(1382 ) 21.8426 Tj
0 -341.761 Td
(1383 ) 21.8426 Tj
0 -351.254 Td
(1384 ) 21.8426 Tj
0 -360.748 Td
(1385 ) 21.8426 Tj
0 -370.241 Td
(1386 ) 21.8426 Tj
0 -379.734 Td
(1387 ) 21.8426 Tj
0 -389.228 Td
(1388 ) 21.8426 Tj
0 -398.721 Td
(1389 ) 21.8426 Tj
0 -408.214 Td
(1390 ) 21.8426 Tj
0 -417.708 Td
(1391 ) 21.8426 Tj
0 -427.201 Td
(1392 ) 21.8426 Tj
0 -436.695 Td
(1393 ) 21.8426 Tj
0 -446.188 Td
(1394 ) 21.8426 Tj
0 -455.681 Td
(1395 ) 21.8426 Tj
0 -465.175 Td
(1396 ) 21.8426 Tj
0 -474.668 Td
(1397 ) 21.8426 Tj
0 -484.161 Td
(1398 ) 21.8426 Tj
0 -493.655 Td
(1399 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/spinlock.c  Page 1) 179.109 Tj
0 -28.4801 Td
(1400 // Mutual exclusion spin locks.) 157.267 Tj
0 -37.9735 Td
(1401 ) 21.8426 Tj
0 -47.4668 Td
(1402 #include "types.h") 100.476 Tj
0 -56.9602 Td
(1403 #include "defs.h") 96.1073 Tj
0 -66.4535 Td
(1404 #include "param.h") 100.476 Tj
0 -75.9469 Td
(1405 #include "x86.h") 91.7388 Tj
0 -85.4403 Td
(1406 #include "mmu.h") 91.7388 Tj
0 -94.9336 Td
(1407 #include "proc.h") 96.1073 Tj
0 -104.427 Td
(1408 #include "spinlock.h") 113.581 Tj
0 -113.92 Td
(1409 ) 21.8426 Tj
0 -123.414 Td
(1410 extern int use_console_lock;) 144.161 Tj
0 -132.907 Td
(1411 ) 21.8426 Tj
0 -142.4 Td
(1412 void) 39.3166 Tj
0 -151.894 Td
(1413 initlock\(struct spinlock *lock, char *name\)) 209.689 Tj
0 -161.387 Td
(1414 {) 26.2111 Tj
0 -170.88 Td
(1415   lock->name = name;) 109.213 Tj
0 -180.374 Td
(1416   lock->locked = 0;) 104.844 Tj
0 -189.867 Td
(1417   lock->cpu = 0xffffffff;) 131.055 Tj
0 -199.361 Td
(1418 }) 26.2111 Tj
0 -208.854 Td
(1419 ) 21.8426 Tj
0 -218.347 Td
(1420 // Acquire the lock.) 109.213 Tj
0 -227.841 Td
(1421 // Loops \(spins\) until the lock is acquired.) 214.057 Tj
0 -237.334 Td
(1422 // \(Because contention is handled by spinning,) 222.794 Tj
0 -246.827 Td
(1423 // must not go to sleep holding any locks.\)) 209.689 Tj
0 -256.321 Td
(1424 void) 39.3166 Tj
0 -265.814 Td
(1425 acquire\(struct spinlock *lock\)) 152.898 Tj
0 -275.307 Td
(1426 {) 26.2111 Tj
0 -284.801 Td
(1427   if\(holding\(lock\)\)) 104.844 Tj
0 -294.294 Td
(1428     panic\("acquire"\);) 113.581 Tj
0 -303.788 Td
(1429 ) 21.8426 Tj
0 -313.281 Td
(1430   if\(cpus[cpu\(\)].nlock == 0\)) 144.161 Tj
0 -322.774 Td
(1431     cli\(\);) 65.5277 Tj
0 -332.268 Td
(1432   cpus[cpu\(\)].nlock++;) 117.95 Tj
0 -341.761 Td
(1433 ) 21.8426 Tj
0 -351.254 Td
(1434   while\(cmpxchg\(0, 1, &lock->locked\) == 1\)) 205.32 Tj
0 -360.748 Td
(1435     ;) 43.6851 Tj
0 -370.241 Td
(1436 ) 21.8426 Tj
0 -379.734 Td
(1437   // Serialize instructions: now that lock is acquired, ma\
ke sure) 305.796 Tj
0 -389.228 Td
(1438   // we wait for all pending writes from other processors.) 275.216 Tj
0 -398.721 Td
(1439   cpuid\(0, 0, 0, 0, 0\);  // memory barrier \(see Ch 7, I\
A-32 manual vol 3\)) 340.744 Tj
0 -408.214 Td
(1440 ) 21.8426 Tj
0 -417.708 Td
(1441   // Record info about lock acquisition for debugging.) 257.742 Tj
0 -427.201 Td
(1442   // The +10 is only so that we can tell the difference) 262.111 Tj
0 -436.695 Td
(1443   // between forgetting to initialize lock->cpu) 227.163 Tj
0 -446.188 Td
(1444   // and holding a lock on cpu 0.) 166.004 Tj
0 -455.681 Td
(1445   lock->cpu = cpu\(\) + 10;) 131.055 Tj
0 -465.175 Td
(1446   getcallerpcs\(&lock, lock->pcs\);) 166.004 Tj
0 -474.668 Td
(1447 }) 26.2111 Tj
0 -484.161 Td
(1448 ) 21.8426 Tj
0 -493.655 Td
(1449 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/spinlock.c  Page 2) 179.109 Tj
0 -28.4801 Td
(1450 // Release the lock.) 109.213 Tj
0 -37.9735 Td
(1451 void) 39.3166 Tj
0 -47.4668 Td
(1452 release\(struct spinlock *lock\)) 152.898 Tj
0 -56.9602 Td
(1453 {) 26.2111 Tj
0 -66.4535 Td
(1454   if\(!holding\(lock\)\)) 109.213 Tj
0 -75.9469 Td
(1455     panic\("release"\);) 113.581 Tj
0 -85.4403 Td
(1456 ) 21.8426 Tj
0 -94.9336 Td
(1457   lock->pcs[0] = 0;) 104.844 Tj
0 -104.427 Td
(1458   lock->cpu = 0xffffffff;) 131.055 Tj
0 -113.92 Td
(1459 ) 21.8426 Tj
0 -123.414 Td
(1460   // Serialize instructions: before unlocking the lock, ma\
ke sure) 305.796 Tj
0 -132.907 Td
(1461   // to flush any pending memory writes from this processo\
r.) 283.953 Tj
0 -142.4 Td
(1462   cpuid\(0, 0, 0, 0, 0\);  // memory barrier \(see Ch 7, I\
A-32 manual vol 3\)) 340.744 Tj
0 -151.894 Td
(1463 ) 21.8426 Tj
0 -161.387 Td
(1464   lock->locked = 0;) 104.844 Tj
0 -170.88 Td
(1465   if\(--cpus[cpu\(\)].nlock == 0\)) 152.898 Tj
0 -180.374 Td
(1466     sti\(\);) 65.5277 Tj
0 -189.867 Td
(1467 }) 26.2111 Tj
0 -199.361 Td
(1468 ) 21.8426 Tj
0 -208.854 Td
(1469 // Record the current call stack in pcs[] by following the\
 %ebp chain.) 327.639 Tj
0 -218.347 Td
(1470 void) 39.3166 Tj
0 -227.841 Td
(1471 getcallerpcs\(void *v, uint pcs[]\)) 166.004 Tj
0 -237.334 Td
(1472 {) 26.2111 Tj
0 -246.827 Td
(1473   uint *ebp;) 74.2647 Tj
0 -256.321 Td
(1474   int i;) 56.7907 Tj
0 -265.814 Td
(1475 ) 21.8426 Tj
0 -275.307 Td
(1476   ebp = \(uint*\)v - 2;) 113.581 Tj
0 -284.801 Td
(1477   for\(i = 0; i < 10; i++\){) 135.424 Tj
0 -294.294 Td
(1478     if\(ebp == 0 || ebp == \(uint*\)0xffffffff\)) 214.057 Tj
0 -303.788 Td
(1479       break;) 74.2647 Tj
0 -313.281 Td
(1480     pcs[i] = ebp[1];     // saved %eip) 187.846 Tj
0 -322.774 Td
(1481     ebp = \(uint*\)ebp[0]; // saved %ebp) 187.846 Tj
0 -332.268 Td
(1482   }) 34.9481 Tj
0 -341.761 Td
(1483   for\(; i < 10; i++\)) 109.213 Tj
0 -351.254 Td
(1484     pcs[i] = 0;) 87.3703 Tj
0 -360.748 Td
(1485 }) 26.2111 Tj
0 -370.241 Td
(1486 ) 21.8426 Tj
0 -379.734 Td
(1487 // Check whether this cpu is holding the lock.) 222.794 Tj
0 -389.228 Td
(1488 int) 34.9481 Tj
0 -398.721 Td
(1489 holding\(struct spinlock *lock\)) 152.898 Tj
0 -408.214 Td
(1490 {) 26.2111 Tj
0 -417.708 Td
(1491   return lock->locked && lock->cpu == cpu\(\) + 10;) 235.9 Tj
0 -427.201 Td
(1492 }) 26.2111 Tj
0 -436.695 Td
(1493 ) 21.8426 Tj
0 -446.188 Td
(1494 ) 21.8426 Tj
0 -455.681 Td
(1495 ) 21.8426 Tj
0 -465.175 Td
(1496 ) 21.8426 Tj
0 -474.668 Td
(1497 ) 21.8426 Tj
0 -484.161 Td
(1498 ) 21.8426 Tj
0 -493.655 Td
(1499 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.h  Page 1) 161.635 Tj
0 -28.4801 Td
(1500 // Segments in proc->gdt) 126.687 Tj
0 -37.9735 Td
(1501 #define SEG_KCODE 1  // kernel code) 174.741 Tj
0 -47.4668 Td
(1502 #define SEG_KDATA 2  // kernel data+stack) 200.952 Tj
0 -56.9602 Td
(1503 #define SEG_UCODE 3) 104.844 Tj
0 -66.4535 Td
(1504 #define SEG_UDATA 4) 104.844 Tj
0 -75.9469 Td
(1505 #define SEG_TSS   5  // this process's task state) 235.9 Tj
0 -85.4403 Td
(1506 #define NSEGS     6) 104.844 Tj
0 -94.9336 Td
(1507 ) 21.8426 Tj
0 -104.427 Td
(1508 // Saved registers for kernel context switches.) 227.163 Tj
0 -113.92 Td
(1509 // Don't need to save all the %fs etc. segment registers,) 270.848 Tj
0 -123.414 Td
(1510 // because they are constant across kernel contexts.) 249.005 Tj
0 -132.907 Td
(1511 // Save all the regular registers so we don't need to care) 275.216 Tj
0 -142.4 Td
(1512 // which are caller save, but not the return register %eax\
.) 279.585 Tj
0 -151.894 Td
(1513 // \(Not saving %eax just simplifies the switching code.\)) 266.479 Tj
0 -161.387 Td
(1514 // The layout of context must match code in swtch.S.) 249.005 Tj
0 -170.88 Td
(1515 struct context {) 91.7388 Tj
0 -180.374 Td
(1516   int eip;) 65.5277 Tj
0 -189.867 Td
(1517   int esp;) 65.5277 Tj
0 -199.361 Td
(1518   int ebx;) 65.5277 Tj
0 -208.854 Td
(1519   int ecx;) 65.5277 Tj
0 -218.347 Td
(1520   int edx;) 65.5277 Tj
0 -227.841 Td
(1521   int esi;) 65.5277 Tj
0 -237.334 Td
(1522   int edi;) 65.5277 Tj
0 -246.827 Td
(1523   int ebp;) 65.5277 Tj
0 -256.321 Td
(1524 };) 30.5796 Tj
0 -265.814 Td
(1525 ) 21.8426 Tj
0 -275.307 Td
(1526 enum proc_state { UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNN\
ING, ZOMBIE };) 336.376 Tj
0 -284.801 Td
(1527 ) 21.8426 Tj
0 -294.294 Td
(1528 // Per-process state) 109.213 Tj
0 -303.788 Td
(1529 struct proc {) 78.6333 Tj
0 -313.281 Td
(1530   char *mem;                // Start of process memory \(k\
ernel address\)) 332.007 Tj
0 -322.774 Td
(1531   uint sz;                  // Size of process memory \(by\
tes\)) 288.322 Tj
0 -332.268 Td
(1532   char *kstack;             // Bottom of kernel stack for \
this process) 327.639 Tj
0 -341.761 Td
(1533   enum proc_state state;    // Process state) 214.057 Tj
0 -351.254 Td
(1534   int pid;                  // Process ID) 200.952 Tj
0 -360.748 Td
(1535   struct proc *parent;      // Parent process) 218.426 Tj
0 -370.241 Td
(1536   void *chan;               // If non-zero, sleeping on ch\
an) 283.953 Tj
0 -379.734 Td
(1537   int killed;               // If non-zero, have been kill\
ed) 283.953 Tj
0 -389.228 Td
(1538   struct file *ofile[NOFILE];  // Open files) 214.057 Tj
0 -398.721 Td
(1539   struct inode *cwd;        // Current directory) 231.531 Tj
0 -408.214 Td
(1540   struct context context;   // Switch here to run process) 270.848 Tj
0 -417.708 Td
(1541   struct trapframe *tf;     // Trap frame for current inte\
rrupt) 297.059 Tj
0 -427.201 Td
(1542   char name[16];            // Process name \(debugging\)) 262.111 Tj
0 -436.695 Td
(1543 };) 30.5796 Tj
0 -446.188 Td
(1544 ) 21.8426 Tj
0 -455.681 Td
(1545 ) 21.8426 Tj
0 -465.175 Td
(1546 ) 21.8426 Tj
0 -474.668 Td
(1547 ) 21.8426 Tj
0 -484.161 Td
(1548 ) 21.8426 Tj
0 -493.655 Td
(1549 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.h  Page 2) 161.635 Tj
0 -28.4801 Td
(1550 // Process memory is laid out contiguously, low addresses \
first:) 301.427 Tj
0 -37.9735 Td
(1551 //   text) 61.1592 Tj
0 -47.4668 Td
(1552 //   original data and bss) 135.424 Tj
0 -56.9602 Td
(1553 //   fixed-size stack) 113.581 Tj
0 -66.4535 Td
(1554 //   expandable heap) 109.213 Tj
0 -75.9469 Td
(1555 ) 21.8426 Tj
0 -85.4403 Td
(1556 // Arrange that cp point to the struct proc that this) 253.374 Tj
0 -94.9336 Td
(1557 // CPU is currently running.  Such preprocessor) 227.163 Tj
0 -104.427 Td
(1558 // subterfuge can be confusing, but saves a lot of typing.) 275.216 Tj
0 -113.92 Td
(1559 extern struct proc *curproc[NCPU];  // Current \(running\)\
 process per CPU) 336.376 Tj
0 -123.414 Td
(1560 #define cp \(curproc[cpu\(\)]\)  // Current process on thi\
s CPU) 279.585 Tj
0 -132.907 Td
(1561 ) 21.8426 Tj
0 -142.4 Td
(1562 ) 21.8426 Tj
0 -151.894 Td
(1563 #define MPSTACK 512) 104.844 Tj
0 -161.387 Td
(1564 ) 21.8426 Tj
0 -170.88 Td
(1565 // Per-CPU state) 91.7388 Tj
0 -180.374 Td
(1566 struct cpu {) 74.2647 Tj
0 -189.867 Td
(1567   uchar apicid;               // Local APIC ID) 222.794 Tj
0 -199.361 Td
(1568   struct context context;     // Switch here to enter sche\
duler) 297.059 Tj
0 -208.854 Td
(1569   struct taskstate ts;        // Used by x86 to find stack\
 for interrupt) 336.376 Tj
0 -218.347 Td
(1570   struct segdesc gdt[NSEGS];  // x86 global descriptor tab\
le) 283.953 Tj
0 -227.841 Td
(1571   char mpstack[MPSTACK];      // Per-CPU startup stack) 257.742 Tj
0 -237.334 Td
(1572   volatile int booted;        // Has the CPU started?) 253.374 Tj
0 -246.827 Td
(1573   int nlock;                  // Number of locks currently\
 held) 297.059 Tj
0 -256.321 Td
(1574 };) 30.5796 Tj
0 -265.814 Td
(1575 ) 21.8426 Tj
0 -275.307 Td
(1576 extern struct cpu cpus[NCPU];) 148.529 Tj
0 -284.801 Td
(1577 extern int ncpu;) 91.7388 Tj
0 -294.294 Td
(1578 ) 21.8426 Tj
0 -303.788 Td
(1579 ) 21.8426 Tj
0 -313.281 Td
(1580 ) 21.8426 Tj
0 -322.774 Td
(1581 ) 21.8426 Tj
0 -332.268 Td
(1582 ) 21.8426 Tj
0 -341.761 Td
(1583 ) 21.8426 Tj
0 -351.254 Td
(1584 ) 21.8426 Tj
0 -360.748 Td
(1585 ) 21.8426 Tj
0 -370.241 Td
(1586 ) 21.8426 Tj
0 -379.734 Td
(1587 ) 21.8426 Tj
0 -389.228 Td
(1588 ) 21.8426 Tj
0 -398.721 Td
(1589 ) 21.8426 Tj
0 -408.214 Td
(1590 ) 21.8426 Tj
0 -417.708 Td
(1591 ) 21.8426 Tj
0 -427.201 Td
(1592 ) 21.8426 Tj
0 -436.695 Td
(1593 ) 21.8426 Tj
0 -446.188 Td
(1594 ) 21.8426 Tj
0 -455.681 Td
(1595 ) 21.8426 Tj
0 -465.175 Td
(1596 ) 21.8426 Tj
0 -474.668 Td
(1597 ) 21.8426 Tj
0 -484.161 Td
(1598 ) 21.8426 Tj
0 -493.655 Td
(1599 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.c  Page 1) 161.635 Tj
0 -28.4801 Td
(1600 #include "types.h") 100.476 Tj
0 -37.9735 Td
(1601 #include "defs.h") 96.1073 Tj
0 -47.4668 Td
(1602 #include "param.h") 100.476 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.581 Tj
0 -94.9336 Td
(1607 ) 21.8426 Tj
0 -104.427 Td
(1608 struct spinlock proc_table_lock;) 161.635 Tj
0 -113.92 Td
(1609 ) 21.8426 Tj
0 -123.414 Td
(1610 struct proc proc[NPROC];) 126.687 Tj
0 -132.907 Td
(1611 struct proc *curproc[NCPU];) 139.792 Tj
0 -142.4 Td
(1612 static struct proc *initproc;) 148.529 Tj
0 -151.894 Td
(1613 ) 21.8426 Tj
0 -161.387 Td
(1614 int nextpid = 1;) 91.7388 Tj
0 -170.88 Td
(1615 extern void forkret\(void\);) 135.424 Tj
0 -180.374 Td
(1616 extern void forkret1\(struct trapframe*\);) 196.583 Tj
0 -189.867 Td
(1617 ) 21.8426 Tj
0 -199.361 Td
(1618 void) 39.3166 Tj
0 -208.854 Td
(1619 pinit\(void\)) 69.8962 Tj
0 -218.347 Td
(1620 {) 26.2111 Tj
0 -227.841 Td
(1621   initlock\(&proc_table_lock, "proc_table"\);) 209.689 Tj
0 -237.334 Td
(1622 }) 26.2111 Tj
0 -246.827 Td
(1623 ) 21.8426 Tj
0 -256.321 Td
(1624 // Look in the process table for an UNUSED proc.) 231.531 Tj
0 -265.814 Td
(1625 // If found, change state to EMBRYO and return it.) 240.268 Tj
0 -275.307 Td
(1626 // Otherwise return 0.) 117.95 Tj
0 -284.801 Td
(1627 static struct proc*) 104.844 Tj
0 -294.294 Td
(1628 allocproc\(void\)) 87.3703 Tj
0 -303.788 Td
(1629 {) 26.2111 Tj
0 -313.281 Td
(1630   int i;) 56.7907 Tj
0 -322.774 Td
(1631   struct proc *p;) 96.1073 Tj
0 -332.268 Td
(1632 ) 21.8426 Tj
0 -341.761 Td
(1633   acquire\(&proc_table_lock\);) 144.161 Tj
0 -351.254 Td
(1634   for\(i = 0; i < NPROC; i++\){) 148.529 Tj
0 -360.748 Td
(1635     p = &proc[i];) 96.1073 Tj
0 -370.241 Td
(1636     if\(p->state == UNUSED\){) 139.792 Tj
0 -379.734 Td
(1637       p->state = EMBRYO;) 126.687 Tj
0 -389.228 Td
(1638       p->pid = nextpid++;) 131.055 Tj
0 -398.721 Td
(1639       release\(&proc_table_lock\);) 161.635 Tj
0 -408.214 Td
(1640       return p;) 87.3703 Tj
0 -417.708 Td
(1641     }) 43.6851 Tj
0 -427.201 Td
(1642   }) 34.9481 Tj
0 -436.695 Td
(1643   release\(&proc_table_lock\);) 144.161 Tj
0 -446.188 Td
(1644   return 0;) 69.8962 Tj
0 -455.681 Td
(1645 }) 26.2111 Tj
0 -465.175 Td
(1646 ) 21.8426 Tj
0 -474.668 Td
(1647 ) 21.8426 Tj
0 -484.161 Td
(1648 ) 21.8426 Tj
0 -493.655 Td
(1649 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.c  Page 2) 161.635 Tj
0 -28.4801 Td
(1650 // Grow current process's memory by n bytes.) 214.057 Tj
0 -37.9735 Td
(1651 // Return old size on success, -1 on failure.) 218.426 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, *oldmem;) 126.687 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.92 Td
(1659     return -1;) 83.0018 Tj
0 -123.414 Td
(1660   memmove\(newmem, cp->mem, cp->sz\);) 174.741 Tj
0 -132.907 Td
(1661   memset\(newmem + cp->sz, 0, n\);) 161.635 Tj
0 -142.4 Td
(1662   oldmem = cp->mem;) 104.844 Tj
0 -151.894 Td
(1663   cp->mem = newmem;) 104.844 Tj
0 -161.387 Td
(1664   kfree\(oldmem, cp->sz\);) 126.687 Tj
0 -170.88 Td
(1665   cp->sz += n;) 83.0018 Tj
0 -180.374 Td
(1666   return cp->sz - n;) 109.213 Tj
0 -189.867 Td
(1667 }) 26.2111 Tj
0 -199.361 Td
(1668 ) 21.8426 Tj
0 -208.854 Td
(1669 // Set up CPU's segment descriptors and task state for a g\
iven process.) 332.007 Tj
0 -218.347 Td
(1670 // If p==0, set up for "idle" state for when scheduler\(\)\
 is running.) 318.902 Tj
0 -227.841 Td
(1671 void) 39.3166 Tj
0 -237.334 Td
(1672 setupsegs\(struct proc *p\)) 131.055 Tj
0 -246.827 Td
(1673 {) 26.2111 Tj
0 -256.321 Td
(1674   struct cpu *c;) 91.7388 Tj
0 -265.814 Td
(1675 ) 21.8426 Tj
0 -275.307 Td
(1676   c = &cpus[cpu\(\)];) 104.844 Tj
0 -284.801 Td
(1677   c->ts.ss0 = SEG_KDATA << 3;) 148.529 Tj
0 -294.294 Td
(1678   if\(p\)) 52.4222 Tj
0 -303.788 Td
(1679     c->ts.esp0 = \(uint\)\(p->kstack + KSTACKSIZE\);) 231.531 Tj
0 -313.281 Td
(1680   else) 48.0537 Tj
0 -322.774 Td
(1681     c->ts.esp0 = 0xffffffff;) 144.161 Tj
0 -332.268 Td
(1682 ) 21.8426 Tj
0 -341.761 Td
(1683   c->gdt[0] = SEG_NULL;) 122.318 Tj
0 -351.254 Td
(1684   c->gdt[SEG_KCODE] = SEG\(STA_X|STA_R, 0, 0x100000 + 64*1\
024-1, 0\);) 314.533 Tj
0 -360.748 Td
(1685   c->gdt[SEG_KDATA] = SEG\(STA_W, 0, 0xffffffff, 0\);) 244.637 Tj
0 -370.241 Td
(1686   c->gdt[SEG_TSS] = SEG16\(STS_T32A, \(uint\)&c->ts, sizeo\
f\(c->ts\)-1, 0\);) 327.639 Tj
0 -379.734 Td
(1687   c->gdt[SEG_TSS].s = 0;) 126.687 Tj
0 -389.228 Td
(1688   if\(p\){) 56.7907 Tj
0 -398.721 Td
(1689     c->gdt[SEG_UCODE] = SEG\(STA_X|STA_R, \(uint\)p->mem, \
p->sz-1, DPL_USER\);) 345.113 Tj
0 -408.214 Td
(1690     c->gdt[SEG_UDATA] = SEG\(STA_W, \(uint\)p->mem, p->sz-\
1, DPL_USER\);) 318.902 Tj
0 -417.708 Td
(1691   } else {) 65.5277 Tj
0 -427.201 Td
(1692     c->gdt[SEG_UCODE] = SEG_NULL;) 166.004 Tj
0 -436.695 Td
(1693     c->gdt[SEG_UDATA] = SEG_NULL;) 166.004 Tj
0 -446.188 Td
(1694   }) 34.9481 Tj
0 -455.681 Td
(1695 ) 21.8426 Tj
0 -465.175 Td
(1696   lgdt\(c->gdt, sizeof\(c->gdt\)\);) 157.267 Tj
0 -474.668 Td
(1697   ltr\(SEG_TSS << 3\);) 109.213 Tj
0 -484.161 Td
(1698 }) 26.2111 Tj
0 -493.655 Td
(1699 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.c  Page 3) 161.635 Tj
0 -28.4801 Td
(1700 // Create a new process copying p as the parent.) 231.531 Tj
0 -37.9735 Td
(1701 // Sets up stack to return as if from system call.) 240.268 Tj
0 -47.4668 Td
(1702 // Caller must set state of returned proc to RUNNABLE.) 257.742 Tj
0 -56.9602 Td
(1703 struct proc*) 74.2647 Tj
0 -66.4535 Td
(1704 copyproc\(struct proc *p\)) 126.687 Tj
0 -75.9469 Td
(1705 {) 26.2111 Tj
0 -85.4403 Td
(1706   int i;) 56.7907 Tj
0 -94.9336 Td
(1707   struct proc *np;) 100.476 Tj
0 -104.427 Td
(1708 ) 21.8426 Tj
0 -113.92 Td
(1709   // Allocate process.) 117.95 Tj
0 -123.414 Td
(1710   if\(\(np = allocproc\(\)\) == 0\)) 148.529 Tj
0 -132.907 Td
(1711     return 0;) 78.6333 Tj
0 -142.4 Td
(1712 ) 21.8426 Tj
0 -151.894 Td
(1713   // Allocate kernel stack.) 139.792 Tj
0 -161.387 Td
(1714   if\(\(np->kstack = kalloc\(KSTACKSIZE\)\) == 0\){) 218.426 Tj
0 -170.88 Td
(1715     np->state = UNUSED;) 122.318 Tj
0 -180.374 Td
(1716     return 0;) 78.6333 Tj
0 -189.867 Td
(1717   }) 34.9481 Tj
0 -199.361 Td
(1718   np->tf = \(struct trapframe*\)\(np->kstack + KSTACKSIZE\)\
 - 1;) 283.953 Tj
0 -208.854 Td
(1719 ) 21.8426 Tj
0 -218.347 Td
(1720   if\(p\){  // Copy process state from p.) 192.215 Tj
0 -227.841 Td
(1721     np->parent = p;) 104.844 Tj
0 -237.334 Td
(1722     memmove\(np->tf, p->tf, sizeof\(*np->tf\)\);) 214.057 Tj
0 -246.827 Td
(1723 ) 21.8426 Tj
0 -256.321 Td
(1724     np->sz = p->sz;) 104.844 Tj
0 -265.814 Td
(1725     if\(\(np->mem = kalloc\(np->sz\)\) == 0\){) 196.583 Tj
0 -275.307 Td
(1726       kfree\(np->kstack, KSTACKSIZE\);) 179.109 Tj
0 -284.801 Td
(1727       np->kstack = 0;) 113.581 Tj
0 -294.294 Td
(1728       np->state = UNUSED;) 131.055 Tj
0 -303.788 Td
(1729       return 0;) 87.3703 Tj
0 -313.281 Td
(1730     }) 43.6851 Tj
0 -322.774 Td
(1731     memmove\(np->mem, p->mem, np->sz\);) 183.478 Tj
0 -332.268 Td
(1732 ) 21.8426 Tj
0 -341.761 Td
(1733     for\(i = 0; i < NOFILE; i++\)) 157.267 Tj
0 -351.254 Td
(1734       if\(p->ofile[i]\)) 113.581 Tj
0 -360.748 Td
(1735         np->ofile[i] = filedup\(p->ofile[i]\);) 214.057 Tj
0 -370.241 Td
(1736     np->cwd = idup\(p->cwd\);) 139.792 Tj
0 -379.734 Td
(1737   }) 34.9481 Tj
0 -389.228 Td
(1738 ) 21.8426 Tj
0 -398.721 Td
(1739   // Set up new context to start executing at forkret \(se\
e below\).) 310.165 Tj
0 -408.214 Td
(1740   memset\(&np->context, 0, sizeof\(np->context\)\);) 227.163 Tj
0 -417.708 Td
(1741   np->context.eip = \(uint\)forkret;) 170.372 Tj
0 -427.201 Td
(1742   np->context.esp = \(uint\)np->tf;) 166.004 Tj
0 -436.695 Td
(1743 ) 21.8426 Tj
0 -446.188 Td
(1744   // Clear %eax so that fork system call returns 0 in chil\
d.) 283.953 Tj
0 -455.681 Td
(1745   np->tf->eax = 0;) 100.476 Tj
0 -465.175 Td
(1746   return np;) 74.2647 Tj
0 -474.668 Td
(1747 }) 26.2111 Tj
0 -484.161 Td
(1748 ) 21.8426 Tj
0 -493.655 Td
(1749 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.c  Page 4) 161.635 Tj
0 -28.4801 Td
(1750 // Set up first user process.) 148.529 Tj
0 -37.9735 Td
(1751 void) 39.3166 Tj
0 -47.4668 Td
(1752 userinit\(void\)) 83.0018 Tj
0 -56.9602 Td
(1753 {) 26.2111 Tj
0 -66.4535 Td
(1754   struct proc *p;) 96.1073 Tj
0 -75.9469 Td
(1755   extern uchar _binary_initcode_start[], _binary_initcode_\
size[];) 305.796 Tj
0 -85.4403 Td
(1756 ) 21.8426 Tj
0 -94.9336 Td
(1757   p = copyproc\(0\);) 100.476 Tj
0 -104.427 Td
(1758   p->sz = PAGE;) 87.3703 Tj
0 -113.92 Td
(1759   p->mem = kalloc\(p->sz\);) 131.055 Tj
0 -123.414 Td
(1760   p->cwd = namei\("/"\);) 117.95 Tj
0 -132.907 Td
(1761   memset\(p->tf, 0, sizeof\(*p->tf\)\);) 174.741 Tj
0 -142.4 Td
(1762   p->tf->cs = \(SEG_UCODE << 3\) | DPL_USER;) 205.32 Tj
0 -151.894 Td
(1763   p->tf->ds = \(SEG_UDATA << 3\) | DPL_USER;) 205.32 Tj
0 -161.387 Td
(1764   p->tf->es = p->tf->ds;) 126.687 Tj
0 -170.88 Td
(1765   p->tf->ss = p->tf->ds;) 126.687 Tj
0 -180.374 Td
(1766   p->tf->eflags = FL_IF;) 126.687 Tj
0 -189.867 Td
(1767   p->tf->esp = p->sz;) 113.581 Tj
0 -199.361 Td
(1768 ) 21.8426 Tj
0 -208.854 Td
(1769   // Make return address readable; needed for some gcc.) 262.111 Tj
0 -218.347 Td
(1770   p->tf->esp -= 4;) 100.476 Tj
0 -227.841 Td
(1771   *\(uint*\)\(p->mem + p->tf->esp\) = 0xefefefef;) 218.426 Tj
0 -237.334 Td
(1772 ) 21.8426 Tj
0 -246.827 Td
(1773   // On entry to user space, start executing at beginning \
of initcode.S.) 336.376 Tj
0 -256.321 Td
(1774   p->tf->eip = 0;) 96.1073 Tj
0 -265.814 Td
(1775   memmove\(p->mem, _binary_initcode_start, \(int\)_binary_\
initcode_size\);) 327.639 Tj
0 -275.307 Td
(1776   safestrcpy\(p->name, "initcode", sizeof\(p->name\)\);) 244.637 Tj
0 -284.801 Td
(1777   p->state = RUNNABLE;) 117.95 Tj
0 -294.294 Td
(1778 ) 21.8426 Tj
0 -303.788 Td
(1779   initproc = p;) 87.3703 Tj
0 -313.281 Td
(1780 }) 26.2111 Tj
0 -322.774 Td
(1781 ) 21.8426 Tj
0 -332.268 Td
(1782 ) 21.8426 Tj
0 -341.761 Td
(1783 ) 21.8426 Tj
0 -351.254 Td
(1784 ) 21.8426 Tj
0 -360.748 Td
(1785 ) 21.8426 Tj
0 -370.241 Td
(1786 ) 21.8426 Tj
0 -379.734 Td
(1787 ) 21.8426 Tj
0 -389.228 Td
(1788 ) 21.8426 Tj
0 -398.721 Td
(1789 ) 21.8426 Tj
0 -408.214 Td
(1790 ) 21.8426 Tj
0 -417.708 Td
(1791 ) 21.8426 Tj
0 -427.201 Td
(1792 ) 21.8426 Tj
0 -436.695 Td
(1793 ) 21.8426 Tj
0 -446.188 Td
(1794 ) 21.8426 Tj
0 -455.681 Td
(1795 ) 21.8426 Tj
0 -465.175 Td
(1796 ) 21.8426 Tj
0 -474.668 Td
(1797 ) 21.8426 Tj
0 -484.161 Td
(1798 ) 21.8426 Tj
0 -493.655 Td
(1799 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.c  Page 5) 161.635 Tj
0 -28.4801 Td
(1800 // Per-CPU process scheduler.) 148.529 Tj
0 -37.9735 Td
(1801 // Each CPU calls scheduler\(\) after setting itself up.) 257.742 Tj
0 -47.4668 Td
(1802 // Scheduler never returns.  It loops, doing:) 218.426 Tj
0 -56.9602 Td
(1803 //  - choose a process to run) 148.529 Tj
0 -66.4535 Td
(1804 //  - longjmp to start running that process) 209.689 Tj
0 -75.9469 Td
(1805 //  - eventually that process transfers control back) 249.005 Tj
0 -85.4403 Td
(1806 //      via longjmp back to the scheduler.) 205.32 Tj
0 -94.9336 Td
(1807 void) 39.3166 Tj
0 -104.427 Td
(1808 scheduler\(void\)) 87.3703 Tj
0 -113.92 Td
(1809 {) 26.2111 Tj
0 -123.414 Td
(1810   struct proc *p;) 96.1073 Tj
0 -132.907 Td
(1811   int i;) 56.7907 Tj
0 -142.4 Td
(1812 ) 21.8426 Tj
0 -151.894 Td
(1813   for\(;;\){) 65.5277 Tj
0 -161.387 Td
(1814     // Loop over process table looking for process to run.) 275.216 Tj
0 -170.88 Td
(1815     acquire\(&proc_table_lock\);) 152.898 Tj
0 -180.374 Td
(1816 ) 21.8426 Tj
0 -189.867 Td
(1817     for\(i = 0; i < NPROC; i++\){) 157.267 Tj
0 -199.361 Td
(1818       p = &proc[i];) 104.844 Tj
0 -208.854 Td
(1819       if\(p->state != RUNNABLE\)) 152.898 Tj
0 -218.347 Td
(1820         continue;) 96.1073 Tj
0 -227.841 Td
(1821 ) 21.8426 Tj
0 -237.334 Td
(1822       // Switch to chosen process.  It is the process's jo\
b) 279.585 Tj
0 -246.827 Td
(1823       // to release proc_table_lock and then reacquire it) 270.848 Tj
0 -256.321 Td
(1824       // before jumping back to us.) 174.741 Tj
0 -265.814 Td
(1825       cp = p;) 78.6333 Tj
0 -275.307 Td
(1826       setupsegs\(p\);) 104.844 Tj
0 -284.801 Td
(1827       p->state = RUNNING;) 131.055 Tj
0 -294.294 Td
(1828       swtch\(&cpus[cpu\(\)].context, &p->context\);) 227.163 Tj
0 -303.788 Td
(1829 ) 21.8426 Tj
0 -313.281 Td
(1830       // Process is done running for now.) 200.952 Tj
0 -322.774 Td
(1831       // It should have changed its p->state before coming\
 back.) 301.427 Tj
0 -332.268 Td
(1832       cp = 0;) 78.6333 Tj
0 -341.761 Td
(1833       setupsegs\(0\);) 104.844 Tj
0 -351.254 Td
(1834     }) 43.6851 Tj
0 -360.748 Td
(1835 ) 21.8426 Tj
0 -370.241 Td
(1836     release\(&proc_table_lock\);) 152.898 Tj
0 -379.734 Td
(1837   }) 34.9481 Tj
0 -389.228 Td
(1838 }) 26.2111 Tj
0 -398.721 Td
(1839 ) 21.8426 Tj
0 -408.214 Td
(1840 ) 21.8426 Tj
0 -417.708 Td
(1841 ) 21.8426 Tj
0 -427.201 Td
(1842 ) 21.8426 Tj
0 -436.695 Td
(1843 ) 21.8426 Tj
0 -446.188 Td
(1844 ) 21.8426 Tj
0 -455.681 Td
(1845 ) 21.8426 Tj
0 -465.175 Td
(1846 ) 21.8426 Tj
0 -474.668 Td
(1847 ) 21.8426 Tj
0 -484.161 Td
(1848 ) 21.8426 Tj
0 -493.655 Td
(1849 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.c  Page 6) 161.635 Tj
0 -28.4801 Td
(1850 // Enter scheduler.  Must already hold proc_table_lock) 257.742 Tj
0 -37.9735 Td
(1851 // and have changed curproc[cpu\(\)]->state.) 205.32 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\(cp->state == RUNNING\)) 135.424 Tj
0 -85.4403 Td
(1856     panic\("sched running"\);) 139.792 Tj
0 -94.9336 Td
(1857   if\(!holding\(&proc_table_lock\)\)) 161.635 Tj
0 -104.427 Td
(1858     panic\("sched proc_table_lock"\);) 174.741 Tj
0 -113.92 Td
(1859   if\(cpus[cpu\(\)].nlock != 1\)) 144.161 Tj
0 -123.414 Td
(1860     panic\("sched locks"\);) 131.055 Tj
0 -132.907 Td
(1861 ) 21.8426 Tj
0 -142.4 Td
(1862   swtch\(&cp->context, &cpus[cpu\(\)].context\);) 214.057 Tj
0 -151.894 Td
(1863 }) 26.2111 Tj
0 -161.387 Td
(1864 ) 21.8426 Tj
0 -170.88 Td
(1865 // Give up the CPU for one scheduling round.) 214.057 Tj
0 -180.374 Td
(1866 void) 39.3166 Tj
0 -189.867 Td
(1867 yield\(void\)) 69.8962 Tj
0 -199.361 Td
(1868 {) 26.2111 Tj
0 -208.854 Td
(1869   acquire\(&proc_table_lock\);) 144.161 Tj
0 -218.347 Td
(1870   cp->state = RUNNABLE;) 122.318 Tj
0 -227.841 Td
(1871   sched\(\);) 65.5277 Tj
0 -237.334 Td
(1872   release\(&proc_table_lock\);) 144.161 Tj
0 -246.827 Td
(1873 }) 26.2111 Tj
0 -256.321 Td
(1874 ) 21.8426 Tj
0 -265.814 Td
(1875 // A fork child's very first scheduling by scheduler\(\)) 257.742 Tj
0 -275.307 Td
(1876 // will longjmp here.  "Return" to user space.) 222.794 Tj
0 -284.801 Td
(1877 void) 39.3166 Tj
0 -294.294 Td
(1878 forkret\(void\)) 78.6333 Tj
0 -303.788 Td
(1879 {) 26.2111 Tj
0 -313.281 Td
(1880   // Still holding proc_table_lock from scheduler.) 240.268 Tj
0 -322.774 Td
(1881   release\(&proc_table_lock\);) 144.161 Tj
0 -332.268 Td
(1882 ) 21.8426 Tj
0 -341.761 Td
(1883   // Jump into assembly, never to return.) 200.952 Tj
0 -351.254 Td
(1884   forkret1\(cp->tf\);) 104.844 Tj
0 -360.748 Td
(1885 }) 26.2111 Tj
0 -370.241 Td
(1886 ) 21.8426 Tj
0 -379.734 Td
(1887 ) 21.8426 Tj
0 -389.228 Td
(1888 ) 21.8426 Tj
0 -398.721 Td
(1889 ) 21.8426 Tj
0 -408.214 Td
(1890 ) 21.8426 Tj
0 -417.708 Td
(1891 ) 21.8426 Tj
0 -427.201 Td
(1892 ) 21.8426 Tj
0 -436.695 Td
(1893 ) 21.8426 Tj
0 -446.188 Td
(1894 ) 21.8426 Tj
0 -455.681 Td
(1895 ) 21.8426 Tj
0 -465.175 Td
(1896 ) 21.8426 Tj
0 -474.668 Td
(1897 ) 21.8426 Tj
0 -484.161 Td
(1898 ) 21.8426 Tj
0 -493.655 Td
(1899 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.c  Page 7) 161.635 Tj
0 -28.4801 Td
(1900 // Atomically release lock and sleep on chan.) 218.426 Tj
0 -37.9735 Td
(1901 // Reacquires lock when reawakened.) 174.741 Tj
0 -47.4668 Td
(1902 void) 39.3166 Tj
0 -56.9602 Td
(1903 sleep\(void *chan, struct spinlock *lk\)) 187.846 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.844 Tj
0 -94.9336 Td
(1907 ) 21.8426 Tj
0 -104.427 Td
(1908   if\(lk == 0\)) 78.6333 Tj
0 -113.92 Td
(1909     panic\("sleep without lk"\);) 152.898 Tj
0 -123.414 Td
(1910 ) 21.8426 Tj
0 -132.907 Td
(1911   // Must acquire proc_table_lock in order to) 218.426 Tj
0 -142.4 Td
(1912   // change p->state and then call sched.) 200.952 Tj
0 -151.894 Td
(1913   // Once we hold proc_table_lock, we can be) 214.057 Tj
0 -161.387 Td
(1914   // guaranteed that we won't miss any wakeup) 218.426 Tj
0 -170.88 Td
(1915   // \(wakeup runs with proc_table_lock locked\),) 227.163 Tj
0 -180.374 Td
(1916   // so it's okay to release lk.) 161.635 Tj
0 -189.867 Td
(1917   if\(lk != &proc_table_lock\){) 148.529 Tj
0 -199.361 Td
(1918     acquire\(&proc_table_lock\);) 152.898 Tj
0 -208.854 Td
(1919     release\(lk\);) 91.7388 Tj
0 -218.347 Td
(1920   }) 34.9481 Tj
0 -227.841 Td
(1921 ) 21.8426 Tj
0 -237.334 Td
(1922   // Go to sleep.) 96.1073 Tj
0 -246.827 Td
(1923   cp->chan = chan;) 100.476 Tj
0 -256.321 Td
(1924   cp->state = SLEEPING;) 122.318 Tj
0 -265.814 Td
(1925   sched\(\);) 65.5277 Tj
0 -275.307 Td
(1926 ) 21.8426 Tj
0 -284.801 Td
(1927   // Tidy up.) 78.6333 Tj
0 -294.294 Td
(1928   cp->chan = 0;) 87.3703 Tj
0 -303.788 Td
(1929 ) 21.8426 Tj
0 -313.281 Td
(1930   // Reacquire original lock.) 148.529 Tj
0 -322.774 Td
(1931   if\(lk != &proc_table_lock\){) 148.529 Tj
0 -332.268 Td
(1932     release\(&proc_table_lock\);) 152.898 Tj
0 -341.761 Td
(1933     acquire\(lk\);) 91.7388 Tj
0 -351.254 Td
(1934   }) 34.9481 Tj
0 -360.748 Td
(1935 }) 26.2111 Tj
0 -370.241 Td
(1936 ) 21.8426 Tj
0 -379.734 Td
(1937 ) 21.8426 Tj
0 -389.228 Td
(1938 ) 21.8426 Tj
0 -398.721 Td
(1939 ) 21.8426 Tj
0 -408.214 Td
(1940 ) 21.8426 Tj
0 -417.708 Td
(1941 ) 21.8426 Tj
0 -427.201 Td
(1942 ) 21.8426 Tj
0 -436.695 Td
(1943 ) 21.8426 Tj
0 -446.188 Td
(1944 ) 21.8426 Tj
0 -455.681 Td
(1945 ) 21.8426 Tj
0 -465.175 Td
(1946 ) 21.8426 Tj
0 -474.668 Td
(1947 ) 21.8426 Tj
0 -484.161 Td
(1948 ) 21.8426 Tj
0 -493.655 Td
(1949 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.c  Page 8) 161.635 Tj
0 -28.4801 Td
(1950 // Wake up all processes sleeping on chan.) 205.32 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.844 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.846 Tj
0 -104.427 Td
(1958     if\(p->state == SLEEPING && p->chan == chan\)) 227.163 Tj
0 -113.92 Td
(1959       p->state = RUNNABLE;) 135.424 Tj
0 -123.414 Td
(1960 }) 26.2111 Tj
0 -132.907 Td
(1961 ) 21.8426 Tj
0 -142.4 Td
(1962 // Wake up all processes sleeping on chan.) 205.32 Tj
0 -151.894 Td
(1963 // Proc_table_lock is acquired and released.) 214.057 Tj
0 -161.387 Td
(1964 void) 39.3166 Tj
0 -170.88 Td
(1965 wakeup\(void *chan\)) 100.476 Tj
0 -180.374 Td
(1966 {) 26.2111 Tj
0 -189.867 Td
(1967   acquire\(&proc_table_lock\);) 144.161 Tj
0 -199.361 Td
(1968   wakeup1\(chan\);) 91.7388 Tj
0 -208.854 Td
(1969   release\(&proc_table_lock\);) 144.161 Tj
0 -218.347 Td
(1970 }) 26.2111 Tj
0 -227.841 Td
(1971 ) 21.8426 Tj
0 -237.334 Td
(1972 // Kill the process with the given pid.) 192.215 Tj
0 -246.827 Td
(1973 // Process won't actually exit until it returns) 227.163 Tj
0 -256.321 Td
(1974 // to user space \(see trap in trap.c\).) 187.846 Tj
0 -265.814 Td
(1975 int) 34.9481 Tj
0 -275.307 Td
(1976 kill\(int pid\)) 78.6333 Tj
0 -284.801 Td
(1977 {) 26.2111 Tj
0 -294.294 Td
(1978   struct proc *p;) 96.1073 Tj
0 -303.788 Td
(1979 ) 21.8426 Tj
0 -313.281 Td
(1980   acquire\(&proc_table_lock\);) 144.161 Tj
0 -322.774 Td
(1981   for\(p = proc; p < &proc[NPROC]; p++\){) 192.215 Tj
0 -332.268 Td
(1982     if\(p->pid == pid\){) 117.95 Tj
0 -341.761 Td
(1983       p->killed = 1;) 109.213 Tj
0 -351.254 Td
(1984       // Wake process from sleep if necessary.) 222.794 Tj
0 -360.748 Td
(1985       if\(p->state == SLEEPING\)) 152.898 Tj
0 -370.241 Td
(1986         p->state = RUNNABLE;) 144.161 Tj
0 -379.734 Td
(1987       release\(&proc_table_lock\);) 161.635 Tj
0 -389.228 Td
(1988       return 0;) 87.3703 Tj
0 -398.721 Td
(1989     }) 43.6851 Tj
0 -408.214 Td
(1990   }) 34.9481 Tj
0 -417.708 Td
(1991   release\(&proc_table_lock\);) 144.161 Tj
0 -427.201 Td
(1992   return -1;) 74.2647 Tj
0 -436.695 Td
(1993 }) 26.2111 Tj
0 -446.188 Td
(1994 ) 21.8426 Tj
0 -455.681 Td
(1995 ) 21.8426 Tj
0 -465.175 Td
(1996 ) 21.8426 Tj
0 -474.668 Td
(1997 ) 21.8426 Tj
0 -484.161 Td
(1998 ) 21.8426 Tj
0 -493.655 Td
(1999 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.c  Page 9) 161.635 Tj
0 -28.4801 Td
(2000 // Exit the current process.  Does not return.) 222.794 Tj
0 -37.9735 Td
(2001 // Exited processes remain in the zombie state) 222.794 Tj
0 -47.4668 Td
(2002 // until their parent calls wait\(\) to find out they exit\
ed.) 279.585 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.92 Td
(2009   if\(cp == initproc\)) 109.213 Tj
0 -123.414 Td
(2010     panic\("init exiting"\);) 135.424 Tj
0 -132.907 Td
(2011 ) 21.8426 Tj
0 -142.4 Td
(2012   // Close all open files.) 135.424 Tj
0 -151.894 Td
(2013   for\(fd = 0; fd < NOFILE; fd++\){) 166.004 Tj
0 -161.387 Td
(2014     if\(cp->ofile[fd]\){) 117.95 Tj
0 -170.88 Td
(2015       fileclose\(cp->ofile[fd]\);) 157.267 Tj
0 -180.374 Td
(2016       cp->ofile[fd] = 0;) 126.687 Tj
0 -189.867 Td
(2017     }) 43.6851 Tj
0 -199.361 Td
(2018   }) 34.9481 Tj
0 -208.854 Td
(2019 ) 21.8426 Tj
0 -218.347 Td
(2020   iput\(cp->cwd\);) 91.7388 Tj
0 -227.841 Td
(2021   cp->cwd = 0;) 83.0018 Tj
0 -237.334 Td
(2022 ) 21.8426 Tj
0 -246.827 Td
(2023   acquire\(&proc_table_lock\);) 144.161 Tj
0 -256.321 Td
(2024 ) 21.8426 Tj
0 -265.814 Td
(2025   // Parent might be sleeping in proc_wait.) 209.689 Tj
0 -275.307 Td
(2026   wakeup1\(cp->parent\);) 117.95 Tj
0 -284.801 Td
(2027 ) 21.8426 Tj
0 -294.294 Td
(2028   // Pass abandoned children to init.) 183.478 Tj
0 -303.788 Td
(2029   for\(p = proc; p < &proc[NPROC]; p++\){) 192.215 Tj
0 -313.281 Td
(2030     if\(p->parent == cp\){) 126.687 Tj
0 -322.774 Td
(2031       p->parent = initproc;) 139.792 Tj
0 -332.268 Td
(2032       if\(p->state == ZOMBIE\)) 144.161 Tj
0 -341.761 Td
(2033         wakeup1\(initproc\);) 135.424 Tj
0 -351.254 Td
(2034     }) 43.6851 Tj
0 -360.748 Td
(2035   }) 34.9481 Tj
0 -370.241 Td
(2036 ) 21.8426 Tj
0 -379.734 Td
(2037   // Jump into the scheduler, never to return.) 222.794 Tj
0 -389.228 Td
(2038   cp->killed = 0;) 96.1073 Tj
0 -398.721 Td
(2039   cp->state = ZOMBIE;) 113.581 Tj
0 -408.214 Td
(2040   sched\(\);) 65.5277 Tj
0 -417.708 Td
(2041   panic\("zombie exit"\);) 122.318 Tj
0 -427.201 Td
(2042 }) 26.2111 Tj
0 -436.695 Td
(2043 ) 21.8426 Tj
0 -446.188 Td
(2044 ) 21.8426 Tj
0 -455.681 Td
(2045 ) 21.8426 Tj
0 -465.175 Td
(2046 ) 21.8426 Tj
0 -474.668 Td
(2047 ) 21.8426 Tj
0 -484.161 Td
(2048 ) 21.8426 Tj
0 -493.655 Td
(2049 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.c  Page 10) 166.004 Tj
0 -28.4801 Td
(2050 // Wait for a child process to exit and return its pid.) 262.111 Tj
0 -37.9735 Td
(2051 // Return -1 if this process has no children.) 218.426 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.318 Tj
0 -94.9336 Td
(2057 ) 21.8426 Tj
0 -104.427 Td
(2058   acquire\(&proc_table_lock\);) 144.161 Tj
0 -113.92 Td
(2059   for\(;;\){) 65.5277 Tj
0 -123.414 Td
(2060     // Scan through table looking for zombie children.) 257.742 Tj
0 -132.907 Td
(2061     havekids = 0;) 96.1073 Tj
0 -142.4 Td
(2062     for\(i = 0; i < NPROC; i++\){) 157.267 Tj
0 -151.894 Td
(2063       p = &proc[i];) 104.844 Tj
0 -161.387 Td
(2064       if\(p->state == UNUSED\)) 144.161 Tj
0 -170.88 Td
(2065         continue;) 96.1073 Tj
0 -180.374 Td
(2066       if\(p->parent == cp\){) 135.424 Tj
0 -189.867 Td
(2067         if\(p->state == ZOMBIE\){) 157.267 Tj
0 -199.361 Td
(2068           // Found one.) 122.318 Tj
0 -208.854 Td
(2069           kfree\(p->mem, p->sz\);) 157.267 Tj
0 -218.347 Td
(2070           kfree\(p->kstack, KSTACKSIZE\);) 192.215 Tj
0 -227.841 Td
(2071           pid = p->pid;) 122.318 Tj
0 -237.334 Td
(2072           p->state = UNUSED;) 144.161 Tj
0 -246.827 Td
(2073           p->pid = 0;) 113.581 Tj
0 -256.321 Td
(2074           p->parent = 0;) 126.687 Tj
0 -265.814 Td
(2075           p->name[0] = 0;) 131.055 Tj
0 -275.307 Td
(2076           release\(&proc_table_lock\);) 179.109 Tj
0 -284.801 Td
(2077           return pid;) 113.581 Tj
0 -294.294 Td
(2078         }) 61.1592 Tj
0 -303.788 Td
(2079         havekids = 1;) 113.581 Tj
0 -313.281 Td
(2080       }) 52.4222 Tj
0 -322.774 Td
(2081     }) 43.6851 Tj
0 -332.268 Td
(2082 ) 21.8426 Tj
0 -341.761 Td
(2083     // No point waiting if we don't have any children.) 257.742 Tj
0 -351.254 Td
(2084     if\(!havekids || cp->killed\){) 161.635 Tj
0 -360.748 Td
(2085       release\(&proc_table_lock\);) 161.635 Tj
0 -370.241 Td
(2086       return -1;) 91.7388 Tj
0 -379.734 Td
(2087     }) 43.6851 Tj
0 -389.228 Td
(2088 ) 21.8426 Tj
0 -398.721 Td
(2089     // Wait for children to exit.  \(See wakeup1 call in p\
roc_exit.\)) 314.533 Tj
0 -408.214 Td
(2090     sleep\(cp, &proc_table_lock\);) 161.635 Tj
0 -417.708 Td
(2091   }) 34.9481 Tj
0 -427.201 Td
(2092 }) 26.2111 Tj
0 -436.695 Td
(2093 ) 21.8426 Tj
0 -446.188 Td
(2094 ) 21.8426 Tj
0 -455.681 Td
(2095 ) 21.8426 Tj
0 -465.175 Td
(2096 ) 21.8426 Tj
0 -474.668 Td
(2097 ) 21.8426 Tj
0 -484.161 Td
(2098 ) 21.8426 Tj
0 -493.655 Td
(2099 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/proc.c  Page 11) 166.004 Tj
0 -28.4801 Td
(2100 // Print a process listing to console.  For debugging.) 257.742 Tj
0 -37.9735 Td
(2101 // Runs when user types ^P on console.) 187.846 Tj
0 -47.4668 Td
(2102 // No lock to avoid wedging a stuck machine further.) 249.005 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.792 Tj
0 -94.9336 Td
(2107   [UNUSED]    "unused",) 122.318 Tj
0 -104.427 Td
(2108   [EMBRYO]    "embryo",) 122.318 Tj
0 -113.92 Td
(2109   [SLEEPING]  "sleep ",) 122.318 Tj
0 -123.414 Td
(2110   [RUNNABLE]  "runble",) 122.318 Tj
0 -132.907 Td
(2111   [RUNNING]   "run   ",) 122.318 Tj
0 -142.4 Td
(2112   [ZOMBIE]    "zombie") 117.95 Tj
0 -151.894 Td
(2113   };) 39.3166 Tj
0 -161.387 Td
(2114   int i, j;) 69.8962 Tj
0 -170.88 Td
(2115   struct proc *p;) 96.1073 Tj
0 -180.374 Td
(2116   char *state;) 83.0018 Tj
0 -189.867 Td
(2117   uint pc[10];) 83.0018 Tj
0 -199.361 Td
(2118 ) 21.8426 Tj
0 -208.854 Td
(2119   for\(i = 0; i < NPROC; i++\){) 148.529 Tj
0 -218.347 Td
(2120     p = &proc[i];) 96.1073 Tj
0 -227.841 Td
(2121     if\(p->state == UNUSED\)) 135.424 Tj
0 -237.334 Td
(2122       continue;) 87.3703 Tj
0 -246.827 Td
(2123     if\(p->state >= 0 && p->state < NELEM\(states\) && sta\
tes[p->state]\)) 323.27 Tj
0 -256.321 Td
(2124       state = states[p->state];) 157.267 Tj
0 -265.814 Td
(2125     else) 56.7907 Tj
0 -275.307 Td
(2126       state = "???";) 109.213 Tj
0 -284.801 Td
(2127     cprintf\("%d %s %s", p->pid, state, p->name\);) 231.531 Tj
0 -294.294 Td
(2128     if\(p->state == SLEEPING\){) 148.529 Tj
0 -303.788 Td
(2129       getcallerpcs\(\(uint*\)p->context.ebp+2, pc\);) 231.531 Tj
0 -313.281 Td
(2130       for\(j=0; j<10 && pc[j] != 0; j++\)) 192.215 Tj
0 -322.774 Td
(2131         cprintf\(" %p", pc[j]\);) 152.898 Tj
0 -332.268 Td
(2132     }) 43.6851 Tj
0 -341.761 Td
(2133     cprintf\("\\n"\);) 100.476 Tj
0 -351.254 Td
(2134   }) 34.9481 Tj
0 -360.748 Td
(2135 }) 26.2111 Tj
0 -370.241 Td
(2136 ) 21.8426 Tj
0 -379.734 Td
(2137 ) 21.8426 Tj
0 -389.228 Td
(2138 ) 21.8426 Tj
0 -398.721 Td
(2139 ) 21.8426 Tj
0 -408.214 Td
(2140 ) 21.8426 Tj
0 -417.708 Td
(2141 ) 21.8426 Tj
0 -427.201 Td
(2142 ) 21.8426 Tj
0 -436.695 Td
(2143 ) 21.8426 Tj
0 -446.188 Td
(2144 ) 21.8426 Tj
0 -455.681 Td
(2145 ) 21.8426 Tj
0 -465.175 Td
(2146 ) 21.8426 Tj
0 -474.668 Td
(2147 ) 21.8426 Tj
0 -484.161 Td
(2148 ) 21.8426 Tj
0 -493.655 Td
(2149 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/swtch.S  Page 1) 166.004 Tj
0 -28.4801 Td
(2150 #   void swtch\(struct context *old, struct context *new\)\
;) 270.848 Tj
0 -37.9735 Td
(2151 #) 26.2111 Tj
0 -47.4668 Td
(2152 # Save current register context in old) 187.846 Tj
0 -56.9602 Td
(2153 # and then load register context from new.) 205.32 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.95 Tj
0 -104.427 Td
(2158   movl 4\(%esp\), %eax) 109.213 Tj
0 -113.92 Td
(2159 ) 21.8426 Tj
0 -123.414 Td
(2160   popl 0\(%eax\)  # %eip) 117.95 Tj
0 -132.907 Td
(2161   movl %esp, 4\(%eax\)) 109.213 Tj
0 -142.4 Td
(2162   movl %ebx, 8\(%eax\)) 109.213 Tj
0 -151.894 Td
(2163   movl %ecx, 12\(%eax\)) 113.581 Tj
0 -161.387 Td
(2164   movl %edx, 16\(%eax\)) 113.581 Tj
0 -170.88 Td
(2165   movl %esi, 20\(%eax\)) 113.581 Tj
0 -180.374 Td
(2166   movl %edi, 24\(%eax\)) 113.581 Tj
0 -189.867 Td
(2167   movl %ebp, 28\(%eax\)) 113.581 Tj
0 -199.361 Td
(2168 ) 21.8426 Tj
0 -208.854 Td
(2169   # Load new registers) 117.95 Tj
0 -218.347 Td
(2170   movl 4\(%esp\), %eax  # not 8\(%esp\) - popped return ad\
dress above) 305.796 Tj
0 -227.841 Td
(2171 ) 21.8426 Tj
0 -237.334 Td
(2172   movl 28\(%eax\), %ebp) 113.581 Tj
0 -246.827 Td
(2173   movl 24\(%eax\), %edi) 113.581 Tj
0 -256.321 Td
(2174   movl 20\(%eax\), %esi) 113.581 Tj
0 -265.814 Td
(2175   movl 16\(%eax\), %edx) 113.581 Tj
0 -275.307 Td
(2176   movl 12\(%eax\), %ecx) 113.581 Tj
0 -284.801 Td
(2177   movl 8\(%eax\), %ebx) 109.213 Tj
0 -294.294 Td
(2178   movl 4\(%eax\), %esp) 109.213 Tj
0 -303.788 Td
(2179   pushl 0\(%eax\)  # %eip) 122.318 Tj
0 -313.281 Td
(2180 ) 21.8426 Tj
0 -322.774 Td
(2181   ret) 43.6851 Tj
0 -332.268 Td
(2182 ) 21.8426 Tj
0 -341.761 Td
(2183 ) 21.8426 Tj
0 -351.254 Td
(2184 ) 21.8426 Tj
0 -360.748 Td
(2185 ) 21.8426 Tj
0 -370.241 Td
(2186 ) 21.8426 Tj
0 -379.734 Td
(2187 ) 21.8426 Tj
0 -389.228 Td
(2188 ) 21.8426 Tj
0 -398.721 Td
(2189 ) 21.8426 Tj
0 -408.214 Td
(2190 ) 21.8426 Tj
0 -417.708 Td
(2191 ) 21.8426 Tj
0 -427.201 Td
(2192 ) 21.8426 Tj
0 -436.695 Td
(2193 ) 21.8426 Tj
0 -446.188 Td
(2194 ) 21.8426 Tj
0 -455.681 Td
(2195 ) 21.8426 Tj
0 -465.175 Td
(2196 ) 21.8426 Tj
0 -474.668 Td
(2197 ) 21.8426 Tj
0 -484.161 Td
(2198 ) 21.8426 Tj
0 -493.655 Td
(2199 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/kalloc.c  Page 1) 170.372 Tj
0 -28.4801 Td
(2200 // Physical memory allocator, intended to allocate) 240.268 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.953 Tj
0 -56.9602 Td
(2203 // long runs, to make it easier to allocate big segments.) 270.848 Tj
0 -66.4535 Td
(2204 // One reason the page size is 4k is that the x86 segment \
size) 292.69 Tj
0 -75.9469 Td
(2205 // granularity is 4k.) 113.581 Tj
0 -85.4403 Td
(2206 ) 21.8426 Tj
0 -94.9336 Td
(2207 #include "types.h") 100.476 Tj
0 -104.427 Td
(2208 #include "defs.h") 96.1073 Tj
0 -113.92 Td
(2209 #include "param.h") 100.476 Tj
0 -123.414 Td
(2210 #include "spinlock.h") 113.581 Tj
0 -132.907 Td
(2211 ) 21.8426 Tj
0 -142.4 Td
(2212 struct spinlock kalloc_lock;) 144.161 Tj
0 -151.894 Td
(2213 ) 21.8426 Tj
0 -161.387 Td
(2214 struct run {) 74.2647 Tj
0 -170.88 Td
(2215   struct run *next;) 104.844 Tj
0 -180.374 Td
(2216   int len; // bytes) 104.844 Tj
0 -189.867 Td
(2217 };) 30.5796 Tj
0 -199.361 Td
(2218 struct run *freelist;) 113.581 Tj
0 -208.854 Td
(2219 ) 21.8426 Tj
0 -218.347 Td
(2220 // Initialize free list of physical pages.) 205.32 Tj
0 -227.841 Td
(2221 // This code cheats by just considering one megabyte of) 262.111 Tj
0 -237.334 Td
(2222 // pages after _end.  Real systems would determine the) 257.742 Tj
0 -246.827 Td
(2223 // amount of memory available in the system and use it all\
.) 279.585 Tj
0 -256.321 Td
(2224 void) 39.3166 Tj
0 -265.814 Td
(2225 kinit\(void\)) 69.8962 Tj
0 -275.307 Td
(2226 {) 26.2111 Tj
0 -284.801 Td
(2227   extern int end;) 96.1073 Tj
0 -294.294 Td
(2228   uint mem;) 69.8962 Tj
0 -303.788 Td
(2229   char *start;) 83.0018 Tj
0 -313.281 Td
(2230 ) 21.8426 Tj
0 -322.774 Td
(2231   initlock\(&kalloc_lock, "kalloc"\);) 174.741 Tj
0 -332.268 Td
(2232   start = \(char*\) &end;) 122.318 Tj
0 -341.761 Td
(2233   start = \(char*\) \(\(\(uint\)start + PAGE\) & ~\(PAGE-1\
\)\);) 253.374 Tj
0 -351.254 Td
(2234   mem = 256; // assume computer has 256 pages of RAM) 249.005 Tj
0 -360.748 Td
(2235   cprintf\("mem = %d\\n", mem * PAGE\);) 179.109 Tj
0 -370.241 Td
(2236   kfree\(start, mem * PAGE\);) 139.792 Tj
0 -379.734 Td
(2237 }) 26.2111 Tj
0 -389.228 Td
(2238 ) 21.8426 Tj
0 -398.721 Td
(2239 ) 21.8426 Tj
0 -408.214 Td
(2240 ) 21.8426 Tj
0 -417.708 Td
(2241 ) 21.8426 Tj
0 -427.201 Td
(2242 ) 21.8426 Tj
0 -436.695 Td
(2243 ) 21.8426 Tj
0 -446.188 Td
(2244 ) 21.8426 Tj
0 -455.681 Td
(2245 ) 21.8426 Tj
0 -465.175 Td
(2246 ) 21.8426 Tj
0 -474.668 Td
(2247 ) 21.8426 Tj
0 -484.161 Td
(2248 ) 21.8426 Tj
0 -493.655 Td
(2249 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/kalloc.c  Page 2) 170.372 Tj
0 -28.4801 Td
(2250 // Free the len bytes of memory pointed at by v,) 231.531 Tj
0 -37.9735 Td
(2251 // which normally should have been returned by a) 231.531 Tj
0 -47.4668 Td
(2252 // call to kalloc\(len\).  \(The exception is when) 227.163 Tj
0 -56.9602 Td
(2253 // initializing the allocator; see kinit above.\)) 231.531 Tj
0 -66.4535 Td
(2254 void) 39.3166 Tj
0 -75.9469 Td
(2255 kfree\(char *v, int len\)) 122.318 Tj
0 -85.4403 Td
(2256 {) 26.2111 Tj
0 -94.9336 Td
(2257   struct run *r, *rend, **rp, *p, *pend;) 196.583 Tj
0 -104.427 Td
(2258 ) 21.8426 Tj
0 -113.92 Td
(2259   if\(len <= 0 || len % PAGE\)) 144.161 Tj
0 -123.414 Td
(2260     panic\("kfree"\);) 104.844 Tj
0 -132.907 Td
(2261 ) 21.8426 Tj
0 -142.4 Td
(2262   // Fill with junk to catch dangling refs.) 209.689 Tj
0 -151.894 Td
(2263   memset\(v, 1, len\);) 109.213 Tj
0 -161.387 Td
(2264 ) 21.8426 Tj
0 -170.88 Td
(2265   acquire\(&kalloc_lock\);) 126.687 Tj
0 -180.374 Td
(2266   p = \(struct run*\)v;) 113.581 Tj
0 -189.867 Td
(2267   pend = \(struct run*\)\(v + len\);) 161.635 Tj
0 -199.361 Td
(2268   for\(rp=&freelist; \(r=*rp\) != 0 && r <= pend; rp=&r->n\
ext\){) 283.953 Tj
0 -208.854 Td
(2269     rend = \(struct run*\)\(\(char*\)r + r->len\);) 214.057 Tj
0 -218.347 Td
(2270     if\(r <= p && p < rend\)) 135.424 Tj
0 -227.841 Td
(2271       panic\("freeing free page"\);) 166.004 Tj
0 -237.334 Td
(2272     if\(pend == r\){  // p next to r: replace r with p) 249.005 Tj
0 -246.827 Td
(2273       p->len = len + r->len;) 144.161 Tj
0 -256.321 Td
(2274       p->next = r->next;) 126.687 Tj
0 -265.814 Td
(2275       *rp = p;) 83.0018 Tj
0 -275.307 Td
(2276       goto out;) 87.3703 Tj
0 -284.801 Td
(2277     }) 43.6851 Tj
0 -294.294 Td
(2278     if\(rend == p\){  // r next to p: replace p with r) 249.005 Tj
0 -303.788 Td
(2279       r->len += len;) 109.213 Tj
0 -313.281 Td
(2280       if\(r->next && r->next == pend\){  // r now next to \
r->next?) 301.427 Tj
0 -322.774 Td
(2281         r->len += r->next->len;) 157.267 Tj
0 -332.268 Td
(2282         r->next = r->next->next;) 161.635 Tj
0 -341.761 Td
(2283       }) 52.4222 Tj
0 -351.254 Td
(2284       goto out;) 87.3703 Tj
0 -360.748 Td
(2285     }) 43.6851 Tj
0 -370.241 Td
(2286   }) 34.9481 Tj
0 -379.734 Td
(2287   // Insert p before r in list.) 157.267 Tj
0 -389.228 Td
(2288   p->len = len;) 87.3703 Tj
0 -398.721 Td
(2289   p->next = r;) 83.0018 Tj
0 -408.214 Td
(2290   *rp = p;) 65.5277 Tj
0 -417.708 Td
(2291 ) 21.8426 Tj
0 -427.201 Td
(2292  out:) 43.6851 Tj
0 -436.695 Td
(2293   release\(&kalloc_lock\);) 126.687 Tj
0 -446.188 Td
(2294 }) 26.2111 Tj
0 -455.681 Td
(2295 ) 21.8426 Tj
0 -465.175 Td
(2296 ) 21.8426 Tj
0 -474.668 Td
(2297 ) 21.8426 Tj
0 -484.161 Td
(2298 ) 21.8426 Tj
0 -493.655 Td
(2299 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/kalloc.c  Page 3) 170.372 Tj
0 -28.4801 Td
(2300 // Allocate n bytes of physical memory.) 192.215 Tj
0 -37.9735 Td
(2301 // Returns a kernel-segment pointer.) 179.109 Tj
0 -47.4668 Td
(2302 // Returns 0 if the memory cannot be allocated.) 227.163 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.95 Tj
0 -104.427 Td
(2308 ) 21.8426 Tj
0 -113.92 Td
(2309   if\(n % PAGE || n <= 0\)) 126.687 Tj
0 -123.414 Td
(2310     panic\("kalloc"\);) 109.213 Tj
0 -132.907 Td
(2311 ) 21.8426 Tj
0 -142.4 Td
(2312   acquire\(&kalloc_lock\);) 126.687 Tj
0 -151.894 Td
(2313   for\(rp=&freelist; \(r=*rp\) != 0; rp=&r->next\){) 227.163 Tj
0 -161.387 Td
(2314     if\(r->len == n\){) 109.213 Tj
0 -170.88 Td
(2315       *rp = r->next;) 109.213 Tj
0 -180.374 Td
(2316       release\(&kalloc_lock\);) 144.161 Tj
0 -189.867 Td
(2317       return \(char*\)r;) 117.95 Tj
0 -199.361 Td
(2318     }) 43.6851 Tj
0 -208.854 Td
(2319     if\(r->len > n\){) 104.844 Tj
0 -218.347 Td
(2320       r->len -= n;) 100.476 Tj
0 -227.841 Td
(2321       p = \(char*\)r + r->len;) 144.161 Tj
0 -237.334 Td
(2322       release\(&kalloc_lock\);) 144.161 Tj
0 -246.827 Td
(2323       return p;) 87.3703 Tj
0 -256.321 Td
(2324     }) 43.6851 Tj
0 -265.814 Td
(2325   }) 34.9481 Tj
0 -275.307 Td
(2326   release\(&kalloc_lock\);) 126.687 Tj
0 -284.801 Td
(2327 ) 21.8426 Tj
0 -294.294 Td
(2328   cprintf\("kalloc: out of memory\\n"\);) 183.478 Tj
0 -303.788 Td
(2329   return 0;) 69.8962 Tj
0 -313.281 Td
(2330 }) 26.2111 Tj
0 -322.774 Td
(2331 ) 21.8426 Tj
0 -332.268 Td
(2332 ) 21.8426 Tj
0 -341.761 Td
(2333 ) 21.8426 Tj
0 -351.254 Td
(2334 ) 21.8426 Tj
0 -360.748 Td
(2335 ) 21.8426 Tj
0 -370.241 Td
(2336 ) 21.8426 Tj
0 -379.734 Td
(2337 ) 21.8426 Tj
0 -389.228 Td
(2338 ) 21.8426 Tj
0 -398.721 Td
(2339 ) 21.8426 Tj
0 -408.214 Td
(2340 ) 21.8426 Tj
0 -417.708 Td
(2341 ) 21.8426 Tj
0 -427.201 Td
(2342 ) 21.8426 Tj
0 -436.695 Td
(2343 ) 21.8426 Tj
0 -446.188 Td
(2344 ) 21.8426 Tj
0 -455.681 Td
(2345 ) 21.8426 Tj
0 -465.175 Td
(2346 ) 21.8426 Tj
0 -474.668 Td
(2347 ) 21.8426 Tj
0 -484.161 Td
(2348 ) 21.8426 Tj
0 -493.655 Td
(2349 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/traps.h  Page 1) 166.004 Tj
0 -28.4801 Td
(2350 // x86 trap and interrupt constants.) 179.109 Tj
0 -37.9735 Td
(2351 ) 21.8426 Tj
0 -47.4668 Td
(2352 // Processor-defined:) 113.581 Tj
0 -56.9602 Td
(2353 #define T_DIVIDE         0      // divide error) 227.163 Tj
0 -66.4535 Td
(2354 #define T_DEBUG          1      // debug exception) 240.268 Tj
0 -75.9469 Td
(2355 #define T_NMI            2      // non-maskable interrupt) 270.848 Tj
0 -85.4403 Td
(2356 #define T_BRKPT          3      // breakpoint) 218.426 Tj
0 -94.9336 Td
(2357 #define T_OFLOW          4      // overflow) 209.689 Tj
0 -104.427 Td
(2358 #define T_BOUND          5      // bounds check) 227.163 Tj
0 -113.92 Td
(2359 #define T_ILLOP          6      // illegal opcode) 235.9 Tj
0 -123.414 Td
(2360 #define T_DEVICE         7      // device not available) 262.111 Tj
0 -132.907 Td
(2361 #define T_DBLFLT         8      // double fault) 227.163 Tj
0 -142.4 Td
(2362 // #define T_COPROC      9      // reserved \(not used sin\
ce 486\)) 301.427 Tj
0 -151.894 Td
(2363 #define T_TSS           10      // invalid task switch seg\
ment) 292.69 Tj
0 -161.387 Td
(2364 #define T_SEGNP         11      // segment not present) 257.742 Tj
0 -170.88 Td
(2365 #define T_STACK         12      // stack exception) 240.268 Tj
0 -180.374 Td
(2366 #define T_GPFLT         13      // general protection faul\
t) 279.585 Tj
0 -189.867 Td
(2367 #define T_PGFLT         14      // page fault) 218.426 Tj
0 -199.361 Td
(2368 // #define T_RES        15      // reserved) 209.689 Tj
0 -208.854 Td
(2369 #define T_FPERR         16      // floating point error) 262.111 Tj
0 -218.347 Td
(2370 #define T_ALIGN         17      // aligment check) 235.9 Tj
0 -227.841 Td
(2371 #define T_MCHK          18      // machine check) 231.531 Tj
0 -237.334 Td
(2372 #define T_SIMDERR       19      // SIMD floating point err\
or) 283.953 Tj
0 -246.827 Td
(2373 ) 21.8426 Tj
0 -256.321 Td
(2374 // These are arbitrarily chosen, but with care not to over\
lap) 288.322 Tj
0 -265.814 Td
(2375 // processor defined exceptions or interrupt vectors.) 253.374 Tj
0 -275.307 Td
(2376 #define T_SYSCALL       48      // system call) 222.794 Tj
0 -284.801 Td
(2377 #define T_DEFAULT      500      // catchall) 209.689 Tj
0 -294.294 Td
(2378 ) 21.8426 Tj
0 -303.788 Td
(2379 #define IRQ_OFFSET      32      // IRQ 0 corresponds to in\
t IRQ_OFFSET) 327.639 Tj
0 -313.281 Td
(2380 ) 21.8426 Tj
0 -322.774 Td
(2381 #define IRQ_TIMER        0) 135.424 Tj
0 -332.268 Td
(2382 #define IRQ_KBD          1) 135.424 Tj
0 -341.761 Td
(2383 #define IRQ_IDE         14) 135.424 Tj
0 -351.254 Td
(2384 #define IRQ_ERROR       19) 135.424 Tj
0 -360.748 Td
(2385 #define IRQ_SPURIOUS    31) 135.424 Tj
0 -370.241 Td
(2386 ) 21.8426 Tj
0 -379.734 Td
(2387 ) 21.8426 Tj
0 -389.228 Td
(2388 ) 21.8426 Tj
0 -398.721 Td
(2389 ) 21.8426 Tj
0 -408.214 Td
(2390 ) 21.8426 Tj
0 -417.708 Td
(2391 ) 21.8426 Tj
0 -427.201 Td
(2392 ) 21.8426 Tj
0 -436.695 Td
(2393 ) 21.8426 Tj
0 -446.188 Td
(2394 ) 21.8426 Tj
0 -455.681 Td
(2395 ) 21.8426 Tj
0 -465.175 Td
(2396 ) 21.8426 Tj
0 -474.668 Td
(2397 ) 21.8426 Tj
0 -484.161 Td
(2398 ) 21.8426 Tj
0 -493.655 Td
(2399 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/vectors.pl  Page 1) 179.109 Tj
0 -28.4801 Td
(2400 #!/usr/bin/perl -w) 100.476 Tj
0 -37.9735 Td
(2401 ) 21.8426 Tj
0 -47.4668 Td
(2402 # Generate vectors.S, the trap/interrupt entry points.) 257.742 Tj
0 -56.9602 Td
(2403 # There has to be one entry point per interrupt number) 257.742 Tj
0 -66.4535 Td
(2404 # since otherwise there's no way for trap\(\) to discover) 262.111 Tj
0 -75.9469 Td
(2405 # the interrupt number.) 122.318 Tj
0 -85.4403 Td
(2406 ) 21.8426 Tj
0 -94.9336 Td
(2407 print "# generated by vectors.pl - do not edit\\n";) 240.268 Tj
0 -104.427 Td
(2408 print "# handlers\\n";) 113.581 Tj
0 -113.92 Td
(2409 print ".text\\n";) 91.7388 Tj
0 -123.414 Td
(2410 print ".globl alltraps\\n";) 135.424 Tj
0 -132.907 Td
(2411 for\(my $i = 0; $i < 256; $i++\){) 157.267 Tj
0 -142.4 Td
(2412     print ".globl vector$i\\n";) 152.898 Tj
0 -151.894 Td
(2413     print "vector$i:\\n";) 126.687 Tj
0 -161.387 Td
(2414     if\(\($i < 8 || $i > 14\) && $i != 17\){) 196.583 Tj
0 -170.88 Td
(2415         print "  pushl \\$0\\n";) 152.898 Tj
0 -180.374 Td
(2416     }) 43.6851 Tj
0 -189.867 Td
(2417     print "  pushl \\$$i\\n";) 139.792 Tj
0 -199.361 Td
(2418     print "  jmp alltraps\\n";) 148.529 Tj
0 -208.854 Td
(2419 }) 26.2111 Tj
0 -218.347 Td
(2420 ) 21.8426 Tj
0 -227.841 Td
(2421 print "\\n# vector table\\n";) 139.792 Tj
0 -237.334 Td
(2422 print ".data\\n";) 91.7388 Tj
0 -246.827 Td
(2423 print ".globl vectors\\n";) 131.055 Tj
0 -256.321 Td
(2424 print "vectors:\\n";) 104.844 Tj
0 -265.814 Td
(2425 for\(my $i = 0; $i < 256; $i++\){) 157.267 Tj
0 -275.307 Td
(2426     print "  .long vector$i\\n";) 157.267 Tj
0 -284.801 Td
(2427 }) 26.2111 Tj
0 -294.294 Td
(2428 ) 21.8426 Tj
0 -303.788 Td
(2429 # sample output:) 91.7388 Tj
0 -313.281 Td
(2430 #   # handlers) 83.0018 Tj
0 -322.774 Td
(2431 #   .text) 61.1592 Tj
0 -332.268 Td
(2432 #   .globl alltraps) 104.844 Tj
0 -341.761 Td
(2433 #   .globl vector0) 100.476 Tj
0 -351.254 Td
(2434 #   vector0:) 74.2647 Tj
0 -360.748 Td
(2435 #     pushl $0) 83.0018 Tj
0 -370.241 Td
(2436 #     pushl $0) 83.0018 Tj
0 -379.734 Td
(2437 #     jmp alltraps) 100.476 Tj
0 -389.228 Td
(2438 #   ...) 52.4222 Tj
0 -398.721 Td
(2439 #) 26.2111 Tj
0 -408.214 Td
(2440 #   # vector table) 100.476 Tj
0 -417.708 Td
(2441 #   .data) 61.1592 Tj
0 -427.201 Td
(2442 #   .globl vectors) 100.476 Tj
0 -436.695 Td
(2443 #   vectors:) 74.2647 Tj
0 -446.188 Td
(2444 #     .long vector0) 104.844 Tj
0 -455.681 Td
(2445 #     .long vector1) 104.844 Tj
0 -465.175 Td
(2446 #     .long vector2) 104.844 Tj
0 -474.668 Td
(2447 #   ...) 52.4222 Tj
0 -484.161 Td
(2448 ) 21.8426 Tj
0 -493.655 Td
(2449 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/trapasm.S  Page 1) 174.741 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.637 Tj
0 -56.9602 Td
(2453 ) 21.8426 Tj
0 -66.4535 Td
(2454   # vectors.S sends all traps here.) 174.741 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.581 Tj
0 -104.427 Td
(2458   pushl %ds) 69.8962 Tj
0 -113.92 Td
(2459   pushl %es) 69.8962 Tj
0 -123.414 Td
(2460   pushal) 56.7907 Tj
0 -132.907 Td
(2461 ) 21.8426 Tj
0 -142.4 Td
(2462   # Set up data segments.) 131.055 Tj
0 -151.894 Td
(2463   movl $SEG_KDATA_SEL, %eax) 139.792 Tj
0 -161.387 Td
(2464   movw %ax,%ds) 83.0018 Tj
0 -170.88 Td
(2465   movw %ax,%es) 83.0018 Tj
0 -180.374 Td
(2466 ) 21.8426 Tj
0 -189.867 Td
(2467   # Call trap\(tf\), where tf=%esp) 161.635 Tj
0 -199.361 Td
(2468   pushl %esp) 74.2647 Tj
0 -208.854 Td
(2469   call trap) 69.8962 Tj
0 -218.347 Td
(2470   addl $4, %esp) 87.3703 Tj
0 -227.841 Td
(2471 ) 21.8426 Tj
0 -237.334 Td
(2472   # Return falls through to trapret...) 187.846 Tj
0 -246.827 Td
(2473 .globl trapret) 83.0018 Tj
0 -256.321 Td
(2474 trapret:) 56.7907 Tj
0 -265.814 Td
(2475   popal) 52.4222 Tj
0 -275.307 Td
(2476   popl %es) 65.5277 Tj
0 -284.801 Td
(2477   popl %ds) 65.5277 Tj
0 -294.294 Td
(2478   addl $0x8, %esp  # trapno and errcode) 192.215 Tj
0 -303.788 Td
(2479   iret) 48.0537 Tj
0 -313.281 Td
(2480 ) 21.8426 Tj
0 -322.774 Td
(2481   # A forked process switches to user mode by calling) 253.374 Tj
0 -332.268 Td
(2482   # forkret1\(tf\), where tf is the trap frame to use.) 249.005 Tj
0 -341.761 Td
(2483 .globl forkret1) 87.3703 Tj
0 -351.254 Td
(2484 forkret1:) 61.1592 Tj
0 -360.748 Td
(2485   movl 4\(%esp\), %esp) 109.213 Tj
0 -370.241 Td
(2486   jmp trapret) 78.6333 Tj
0 -379.734 Td
(2487 ) 21.8426 Tj
0 -389.228 Td
(2488 ) 21.8426 Tj
0 -398.721 Td
(2489 ) 21.8426 Tj
0 -408.214 Td
(2490 ) 21.8426 Tj
0 -417.708 Td
(2491 ) 21.8426 Tj
0 -427.201 Td
(2492 ) 21.8426 Tj
0 -436.695 Td
(2493 ) 21.8426 Tj
0 -446.188 Td
(2494 ) 21.8426 Tj
0 -455.681 Td
(2495 ) 21.8426 Tj
0 -465.175 Td
(2496 ) 21.8426 Tj
0 -474.668 Td
(2497 ) 21.8426 Tj
0 -484.161 Td
(2498 ) 21.8426 Tj
0 -493.655 Td
(2499 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/trap.c  Page 1) 161.635 Tj
0 -28.4801 Td
(2500 #include "types.h") 100.476 Tj
0 -37.9735 Td
(2501 #include "defs.h") 96.1073 Tj
0 -47.4668 Td
(2502 #include "param.h") 100.476 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.476 Tj
0 -94.9336 Td
(2507 #include "spinlock.h") 113.581 Tj
0 -104.427 Td
(2508 ) 21.8426 Tj
0 -113.92 Td
(2509 // Interrupt descriptor table \(shared by all CPUs\).) 244.637 Tj
0 -123.414 Td
(2510 struct gatedesc idt[256];) 131.055 Tj
0 -132.907 Td
(2511 extern uint vectors[];  // in vectors.S: array of 256 entr\
y pointers) 318.902 Tj
0 -142.4 Td
(2512 struct spinlock tickslock;) 135.424 Tj
0 -151.894 Td
(2513 int ticks;) 65.5277 Tj
0 -161.387 Td
(2514 ) 21.8426 Tj
0 -170.88 Td
(2515 void) 39.3166 Tj
0 -180.374 Td
(2516 tvinit\(void\)) 74.2647 Tj
0 -189.867 Td
(2517 {) 26.2111 Tj
0 -199.361 Td
(2518   int i;) 56.7907 Tj
0 -208.854 Td
(2519 ) 21.8426 Tj
0 -218.347 Td
(2520   for\(i = 0; i < 256; i++\)) 135.424 Tj
0 -227.841 Td
(2521     SETGATE\(idt[i], 0, SEG_KCODE<<3, vectors[i], 0\);) 249.005 Tj
0 -237.334 Td
(2522   SETGATE\(idt[T_SYSCALL], 0, SEG_KCODE<<3, vectors[T_SYSC\
ALL], DPL_USER\);) 340.744 Tj
0 -246.827 Td
(2523 ) 21.8426 Tj
0 -256.321 Td
(2524   initlock\(&tickslock, "time"\);) 157.267 Tj
0 -265.814 Td
(2525 }) 26.2111 Tj
0 -275.307 Td
(2526 ) 21.8426 Tj
0 -284.801 Td
(2527 void) 39.3166 Tj
0 -294.294 Td
(2528 idtinit\(void\)) 78.6333 Tj
0 -303.788 Td
(2529 {) 26.2111 Tj
0 -313.281 Td
(2530   lidt\(idt, sizeof\(idt\)\);) 131.055 Tj
0 -322.774 Td
(2531 }) 26.2111 Tj
0 -332.268 Td
(2532 ) 21.8426 Tj
0 -341.761 Td
(2533 void) 39.3166 Tj
0 -351.254 Td
(2534 trap\(struct trapframe *tf\)) 135.424 Tj
0 -360.748 Td
(2535 {) 26.2111 Tj
0 -370.241 Td
(2536   if\(tf->trapno == T_SYSCALL\){) 152.898 Tj
0 -379.734 Td
(2537     if\(cp->killed\)) 100.476 Tj
0 -389.228 Td
(2538       exit\(\);) 78.6333 Tj
0 -398.721 Td
(2539     cp->tf = tf;) 91.7388 Tj
0 -408.214 Td
(2540     syscall\(\);) 83.0018 Tj
0 -417.708 Td
(2541     if\(cp->killed\)) 100.476 Tj
0 -427.201 Td
(2542       exit\(\);) 78.6333 Tj
0 -436.695 Td
(2543     return;) 69.8962 Tj
0 -446.188 Td
(2544   }) 34.9481 Tj
0 -455.681 Td
(2545 ) 21.8426 Tj
0 -465.175 Td
(2546   // Increment nlock to make sure interrupts stay off) 253.374 Tj
0 -474.668 Td
(2547   // during interrupt handler.  Decrement before returning\
.) 279.585 Tj
0 -484.161 Td
(2548   cpus[cpu\(\)].nlock++;) 117.95 Tj
0 -493.655 Td
(2549 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/trap.c  Page 2) 161.635 Tj
0 -28.4801 Td
(2550   switch\(tf->trapno\){) 113.581 Tj
0 -37.9735 Td
(2551   case IRQ_OFFSET + IRQ_TIMER:) 152.898 Tj
0 -47.4668 Td
(2552     if\(cpu\(\) == 0\){) 104.844 Tj
0 -56.9602 Td
(2553       acquire\(&tickslock\);) 135.424 Tj
0 -66.4535 Td
(2554       ticks++;) 83.0018 Tj
0 -75.9469 Td
(2555       wakeup\(&ticks\);) 113.581 Tj
0 -85.4403 Td
(2556       release\(&tickslock\);) 135.424 Tj
0 -94.9336 Td
(2557     }) 43.6851 Tj
0 -104.427 Td
(2558     lapic_eoi\(\);) 91.7388 Tj
0 -113.92 Td
(2559     break;) 65.5277 Tj
0 -123.414 Td
(2560   case IRQ_OFFSET + IRQ_IDE:) 144.161 Tj
0 -132.907 Td
(2561     ide_intr\(\);) 87.3703 Tj
0 -142.4 Td
(2562     lapic_eoi\(\);) 91.7388 Tj
0 -151.894 Td
(2563     break;) 65.5277 Tj
0 -161.387 Td
(2564   case IRQ_OFFSET + IRQ_KBD:) 144.161 Tj
0 -170.88 Td
(2565     kbd_intr\(\);) 87.3703 Tj
0 -180.374 Td
(2566     lapic_eoi\(\);) 91.7388 Tj
0 -189.867 Td
(2567     break;) 65.5277 Tj
0 -199.361 Td
(2568   case IRQ_OFFSET + IRQ_SPURIOUS:) 166.004 Tj
0 -208.854 Td
(2569     cprintf\("spurious interrupt from cpu %d eip %x\\n", c\
pu\(\), tf->eip\);) 332.007 Tj
0 -218.347 Td
(2570     lapic_eoi\(\);) 91.7388 Tj
0 -227.841 Td
(2571     break;) 65.5277 Tj
0 -237.334 Td
(2572 ) 21.8426 Tj
0 -246.827 Td
(2573   default:) 65.5277 Tj
0 -256.321 Td
(2574     if\(cp == 0\){) 91.7388 Tj
0 -265.814 Td
(2575       // Otherwise it's our mistake.) 179.109 Tj
0 -275.307 Td
(2576       cprintf\("unexpected trap %d from cpu %d eip %x\\n",) 266.479 Tj
0 -284.801 Td
(2577               tf->trapno, cpu\(\), tf->eip\);) 205.32 Tj
0 -294.294 Td
(2578       panic\("trap"\);) 109.213 Tj
0 -303.788 Td
(2579     }) 43.6851 Tj
0 -313.281 Td
(2580     // Assume process divided by zero or dereferenced null\
, etc.) 301.427 Tj
0 -322.774 Td
(2581     cprintf\("pid %d %s: trap %d err %d on cpu %d eip %x -\
- kill proc\\n",) 336.376 Tj
0 -332.268 Td
(2582             cp->pid, cp->name, tf->trapno, tf->err, cpu\(\)\
, tf->eip\);) 318.902 Tj
0 -341.761 Td
(2583     cp->killed = 1;) 104.844 Tj
0 -351.254 Td
(2584   }) 34.9481 Tj
0 -360.748 Td
(2585   cpus[cpu\(\)].nlock--;) 117.95 Tj
0 -370.241 Td
(2586 ) 21.8426 Tj
0 -379.734 Td
(2587   // Force process exit if it has been killed and is in us\
er space.) 314.533 Tj
0 -389.228 Td
(2588   // \(If it is still executing in the kernel, let it keep\
 running) 305.796 Tj
0 -398.721 Td
(2589   // until it gets to the regular system call return.\)) 257.742 Tj
0 -408.214 Td
(2590   if\(cp && cp->killed && \(tf->cs&3\) == DPL_USER\)) 231.531 Tj
0 -417.708 Td
(2591     exit\(\);) 69.8962 Tj
0 -427.201 Td
(2592 ) 21.8426 Tj
0 -436.695 Td
(2593   // Force process to give up CPU on clock tick.) 231.531 Tj
0 -446.188 Td
(2594   // If interrupts were on while locks held, would need to\
 check nlock.) 332.007 Tj
0 -455.681 Td
(2595   if\(cp && cp->state == RUNNING && tf->trapno == IRQ_OFFS\
ET+IRQ_TIMER\)) 327.639 Tj
0 -465.175 Td
(2596     yield\(\);) 74.2647 Tj
0 -474.668 Td
(2597 }) 26.2111 Tj
0 -484.161 Td
(2598 ) 21.8426 Tj
0 -493.655 Td
(2599 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/syscall.h  Page 1) 174.741 Tj
0 -28.4801 Td
(2600 // System call numbers) 117.95 Tj
0 -37.9735 Td
(2601 #define SYS_fork    1) 113.581 Tj
0 -47.4668 Td
(2602 #define SYS_exit    2) 113.581 Tj
0 -56.9602 Td
(2603 #define SYS_wait    3) 113.581 Tj
0 -66.4535 Td
(2604 #define SYS_pipe    4) 113.581 Tj
0 -75.9469 Td
(2605 #define SYS_write   5) 113.581 Tj
0 -85.4403 Td
(2606 #define SYS_read    6) 113.581 Tj
0 -94.9336 Td
(2607 #define SYS_close   7) 113.581 Tj
0 -104.427 Td
(2608 #define SYS_kill    8) 113.581 Tj
0 -113.92 Td
(2609 #define SYS_exec    9) 113.581 Tj
0 -123.414 Td
(2610 #define SYS_open   10) 113.581 Tj
0 -132.907 Td
(2611 #define SYS_mknod  11) 113.581 Tj
0 -142.4 Td
(2612 #define SYS_unlink 12) 113.581 Tj
0 -151.894 Td
(2613 #define SYS_fstat  13) 113.581 Tj
0 -161.387 Td
(2614 #define SYS_link   14) 113.581 Tj
0 -170.88 Td
(2615 #define SYS_mkdir  15) 113.581 Tj
0 -180.374 Td
(2616 #define SYS_chdir  16) 113.581 Tj
0 -189.867 Td
(2617 #define SYS_dup    17) 113.581 Tj
0 -199.361 Td
(2618 #define SYS_getpid 18) 113.581 Tj
0 -208.854 Td
(2619 #define SYS_sbrk   19) 113.581 Tj
0 -218.347 Td
(2620 #define SYS_sleep  20) 113.581 Tj
0 -227.841 Td
(2621 ) 21.8426 Tj
0 -237.334 Td
(2622 ) 21.8426 Tj
0 -246.827 Td
(2623 ) 21.8426 Tj
0 -256.321 Td
(2624 ) 21.8426 Tj
0 -265.814 Td
(2625 ) 21.8426 Tj
0 -275.307 Td
(2626 ) 21.8426 Tj
0 -284.801 Td
(2627 ) 21.8426 Tj
0 -294.294 Td
(2628 ) 21.8426 Tj
0 -303.788 Td
(2629 ) 21.8426 Tj
0 -313.281 Td
(2630 ) 21.8426 Tj
0 -322.774 Td
(2631 ) 21.8426 Tj
0 -332.268 Td
(2632 ) 21.8426 Tj
0 -341.761 Td
(2633 ) 21.8426 Tj
0 -351.254 Td
(2634 ) 21.8426 Tj
0 -360.748 Td
(2635 ) 21.8426 Tj
0 -370.241 Td
(2636 ) 21.8426 Tj
0 -379.734 Td
(2637 ) 21.8426 Tj
0 -389.228 Td
(2638 ) 21.8426 Tj
0 -398.721 Td
(2639 ) 21.8426 Tj
0 -408.214 Td
(2640 ) 21.8426 Tj
0 -417.708 Td
(2641 ) 21.8426 Tj
0 -427.201 Td
(2642 ) 21.8426 Tj
0 -436.695 Td
(2643 ) 21.8426 Tj
0 -446.188 Td
(2644 ) 21.8426 Tj
0 -455.681 Td
(2645 ) 21.8426 Tj
0 -465.175 Td
(2646 ) 21.8426 Tj
0 -474.668 Td
(2647 ) 21.8426 Tj
0 -484.161 Td
(2648 ) 21.8426 Tj
0 -493.655 Td
(2649 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/syscall.c  Page 1) 174.741 Tj
0 -28.4801 Td
(2650 #include "types.h") 100.476 Tj
0 -37.9735 Td
(2651 #include "defs.h") 96.1073 Tj
0 -47.4668 Td
(2652 #include "param.h") 100.476 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.213 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.005 Tj
0 -113.92 Td
(2659 // System call number in %eax.) 152.898 Tj
0 -123.414 Td
(2660 // Arguments on the stack, from the user call to the C) 257.742 Tj
0 -132.907 Td
(2661 // library system call function. The saved user %esp point\
s) 279.585 Tj
0 -142.4 Td
(2662 // to a saved program counter, and then the first argument\
.) 279.585 Tj
0 -151.894 Td
(2663 ) 21.8426 Tj
0 -161.387 Td
(2664 // Fetch the int at addr from process p.) 196.583 Tj
0 -170.88 Td
(2665 int) 34.9481 Tj
0 -180.374 Td
(2666 fetchint\(struct proc *p, uint addr, int *ip\)) 214.057 Tj
0 -189.867 Td
(2667 {) 26.2111 Tj
0 -199.361 Td
(2668   if\(addr >= p->sz || addr+4 > p->sz\)) 183.478 Tj
0 -208.854 Td
(2669     return -1;) 83.0018 Tj
0 -218.347 Td
(2670   *ip = *\(int*\)\(p->mem + addr\);) 157.267 Tj
0 -227.841 Td
(2671   return 0;) 69.8962 Tj
0 -237.334 Td
(2672 }) 26.2111 Tj
0 -246.827 Td
(2673 ) 21.8426 Tj
0 -256.321 Td
(2674 // Fetch the nul-terminated string at addr from process p.) 275.216 Tj
0 -265.814 Td
(2675 // Doesn't actually copy the string - just sets *pp to poi\
nt at it.) 314.533 Tj
0 -275.307 Td
(2676 // Returns length of string, not including nul.) 227.163 Tj
0 -284.801 Td
(2677 int) 34.9481 Tj
0 -294.294 Td
(2678 fetchstr\(struct proc *p, uint addr, char **pp\)) 222.794 Tj
0 -303.788 Td
(2679 {) 26.2111 Tj
0 -313.281 Td
(2680   char *s, *ep;) 87.3703 Tj
0 -322.774 Td
(2681 ) 21.8426 Tj
0 -332.268 Td
(2682   if\(addr >= p->sz\)) 104.844 Tj
0 -341.761 Td
(2683     return -1;) 83.0018 Tj
0 -351.254 Td
(2684   *pp = p->mem + addr;) 117.95 Tj
0 -360.748 Td
(2685   ep = p->mem + p->sz;) 117.95 Tj
0 -370.241 Td
(2686   for\(s = *pp; s < ep; s++\)) 139.792 Tj
0 -379.734 Td
(2687     if\(*s == 0\)) 87.3703 Tj
0 -389.228 Td
(2688       return s - *pp;) 113.581 Tj
0 -398.721 Td
(2689   return -1;) 74.2647 Tj
0 -408.214 Td
(2690 }) 26.2111 Tj
0 -417.708 Td
(2691 ) 21.8426 Tj
0 -427.201 Td
(2692 // Fetch the nth 32-bit system call argument.) 218.426 Tj
0 -436.695 Td
(2693 int) 34.9481 Tj
0 -446.188 Td
(2694 argint\(int n, int *ip\)) 117.95 Tj
0 -455.681 Td
(2695 {) 26.2111 Tj
0 -465.175 Td
(2696   return fetchint\(cp, cp->tf->esp + 4 + 4*n, ip\);) 235.9 Tj
0 -474.668 Td
(2697 }) 26.2111 Tj
0 -484.161 Td
(2698 ) 21.8426 Tj
0 -493.655 Td
(2699 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/syscall.c  Page 2) 174.741 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.427 Tj
0 -47.4668 Td
(2702 // lies within the process address space.) 200.952 Tj
0 -56.9602 Td
(2703 int) 34.9481 Tj
0 -66.4535 Td
(2704 argptr\(int n, char **pp, int size\)) 170.372 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.318 Tj
0 -113.92 Td
(2709     return -1;) 83.0018 Tj
0 -123.414 Td
(2710   if\(\(uint\)i >= cp->sz || \(uint\)i+size >= cp->sz\)) 235.9 Tj
0 -132.907 Td
(2711     return -1;) 83.0018 Tj
0 -142.4 Td
(2712   *pp = cp->mem + i;) 109.213 Tj
0 -151.894 Td
(2713   return 0;) 69.8962 Tj
0 -161.387 Td
(2714 }) 26.2111 Tj
0 -170.88 Td
(2715 ) 21.8426 Tj
0 -180.374 Td
(2716 // Fetch the nth word-sized system call argument as a stri\
ng pointer.) 323.27 Tj
0 -189.867 Td
(2717 // Check that the pointer is valid and the string is nul-t\
erminated.) 318.902 Tj
0 -199.361 Td
(2718 // \(There is no shared writable memory, so the string can\
't change) 310.165 Tj
0 -208.854 Td
(2719 // between this check and being used by the kernel.\)) 249.005 Tj
0 -218.347 Td
(2720 int) 34.9481 Tj
0 -227.841 Td
(2721 argstr\(int n, char **pp\)) 126.687 Tj
0 -237.334 Td
(2722 {) 26.2111 Tj
0 -246.827 Td
(2723   int addr;) 69.8962 Tj
0 -256.321 Td
(2724   if\(argint\(n, &addr\) < 0\)) 135.424 Tj
0 -265.814 Td
(2725     return -1;) 83.0018 Tj
0 -275.307 Td
(2726   return fetchstr\(cp, addr, pp\);) 161.635 Tj
0 -284.801 Td
(2727 }) 26.2111 Tj
0 -294.294 Td
(2728 ) 21.8426 Tj
0 -303.788 Td
(2729 extern int sys_chdir\(void\);) 139.792 Tj
0 -313.281 Td
(2730 extern int sys_close\(void\);) 139.792 Tj
0 -322.774 Td
(2731 extern int sys_dup\(void\);) 131.055 Tj
0 -332.268 Td
(2732 extern int sys_exec\(void\);) 135.424 Tj
0 -341.761 Td
(2733 extern int sys_exit\(void\);) 135.424 Tj
0 -351.254 Td
(2734 extern int sys_fork\(void\);) 135.424 Tj
0 -360.748 Td
(2735 extern int sys_fstat\(void\);) 139.792 Tj
0 -370.241 Td
(2736 extern int sys_getpid\(void\);) 144.161 Tj
0 -379.734 Td
(2737 extern int sys_kill\(void\);) 135.424 Tj
0 -389.228 Td
(2738 extern int sys_link\(void\);) 135.424 Tj
0 -398.721 Td
(2739 extern int sys_mkdir\(void\);) 139.792 Tj
0 -408.214 Td
(2740 extern int sys_mknod\(void\);) 139.792 Tj
0 -417.708 Td
(2741 extern int sys_open\(void\);) 135.424 Tj
0 -427.201 Td
(2742 extern int sys_pipe\(void\);) 135.424 Tj
0 -436.695 Td
(2743 extern int sys_read\(void\);) 135.424 Tj
0 -446.188 Td
(2744 extern int sys_sbrk\(void\);) 135.424 Tj
0 -455.681 Td
(2745 extern int sys_sleep\(void\);) 139.792 Tj
0 -465.175 Td
(2746 extern int sys_unlink\(void\);) 144.161 Tj
0 -474.668 Td
(2747 extern int sys_wait\(void\);) 135.424 Tj
0 -484.161 Td
(2748 extern int sys_write\(void\);) 139.792 Tj
0 -493.655 Td
(2749 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/syscall.c  Page 3) 174.741 Tj
0 -28.4801 Td
(2750 static int \(*syscalls[]\)\(void\) = {) 170.372 Tj
0 -37.9735 Td
(2751 [SYS_chdir]   sys_chdir,) 126.687 Tj
0 -47.4668 Td
(2752 [SYS_close]   sys_close,) 126.687 Tj
0 -56.9602 Td
(2753 [SYS_dup]     sys_dup,) 117.95 Tj
0 -66.4535 Td
(2754 [SYS_exec]    sys_exec,) 122.318 Tj
0 -75.9469 Td
(2755 [SYS_exit]    sys_exit,) 122.318 Tj
0 -85.4403 Td
(2756 [SYS_fork]    sys_fork,) 122.318 Tj
0 -94.9336 Td
(2757 [SYS_fstat]   sys_fstat,) 126.687 Tj
0 -104.427 Td
(2758 [SYS_getpid]  sys_getpid,) 131.055 Tj
0 -113.92 Td
(2759 [SYS_kill]    sys_kill,) 122.318 Tj
0 -123.414 Td
(2760 [SYS_link]    sys_link,) 122.318 Tj
0 -132.907 Td
(2761 [SYS_mkdir]   sys_mkdir,) 126.687 Tj
0 -142.4 Td
(2762 [SYS_mknod]   sys_mknod,) 126.687 Tj
0 -151.894 Td
(2763 [SYS_open]    sys_open,) 122.318 Tj
0 -161.387 Td
(2764 [SYS_pipe]    sys_pipe,) 122.318 Tj
0 -170.88 Td
(2765 [SYS_read]    sys_read,) 122.318 Tj
0 -180.374 Td
(2766 [SYS_sbrk]    sys_sbrk,) 122.318 Tj
0 -189.867 Td
(2767 [SYS_sleep]   sys_sleep,) 126.687 Tj
0 -199.361 Td
(2768 [SYS_unlink]  sys_unlink,) 131.055 Tj
0 -208.854 Td
(2769 [SYS_wait]    sys_wait,) 122.318 Tj
0 -218.347 Td
(2770 [SYS_write]   sys_write,) 126.687 Tj
0 -227.841 Td
(2771 };) 30.5796 Tj
0 -237.334 Td
(2772 ) 21.8426 Tj
0 -246.827 Td
(2773 void) 39.3166 Tj
0 -256.321 Td
(2774 syscall\(void\)) 78.6333 Tj
0 -265.814 Td
(2775 {) 26.2111 Tj
0 -275.307 Td
(2776   int num;) 65.5277 Tj
0 -284.801 Td
(2777 ) 21.8426 Tj
0 -294.294 Td
(2778   num = cp->tf->eax;) 109.213 Tj
0 -303.788 Td
(2779   if\(num >= 0 && num < NELEM\(syscalls\) && syscalls[num]\
\)) 266.479 Tj
0 -313.281 Td
(2780     cp->tf->eax = syscalls[num]\(\);) 170.372 Tj
0 -322.774 Td
(2781   else {) 56.7907 Tj
0 -332.268 Td
(2782     cprintf\("%d %s: unknown sys call %d\\n",) 209.689 Tj
0 -341.761 Td
(2783             cp->pid, cp->name, num\);) 179.109 Tj
0 -351.254 Td
(2784     cp->tf->eax = -1;) 113.581 Tj
0 -360.748 Td
(2785   }) 34.9481 Tj
0 -370.241 Td
(2786 }) 26.2111 Tj
0 -379.734 Td
(2787 ) 21.8426 Tj
0 -389.228 Td
(2788 ) 21.8426 Tj
0 -398.721 Td
(2789 ) 21.8426 Tj
0 -408.214 Td
(2790 ) 21.8426 Tj
0 -417.708 Td
(2791 ) 21.8426 Tj
0 -427.201 Td
(2792 ) 21.8426 Tj
0 -436.695 Td
(2793 ) 21.8426 Tj
0 -446.188 Td
(2794 ) 21.8426 Tj
0 -455.681 Td
(2795 ) 21.8426 Tj
0 -465.175 Td
(2796 ) 21.8426 Tj
0 -474.668 Td
(2797 ) 21.8426 Tj
0 -484.161 Td
(2798 ) 21.8426 Tj
0 -493.655 Td
(2799 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sysproc.c  Page 1) 174.741 Tj
0 -28.4801 Td
(2800 #include "types.h") 100.476 Tj
0 -37.9735 Td
(2801 #include "defs.h") 96.1073 Tj
0 -47.4668 Td
(2802 #include "param.h") 100.476 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.92 Td
(2809   struct proc *np;) 100.476 Tj
0 -123.414 Td
(2810 ) 21.8426 Tj
0 -132.907 Td
(2811   if\(\(np = copyproc\(cp\)\) == 0\)) 152.898 Tj
0 -142.4 Td
(2812     return -1;) 83.0018 Tj
0 -151.894 Td
(2813   np->state = RUNNABLE;) 122.318 Tj
0 -161.387 Td
(2814   return np->pid;) 96.1073 Tj
0 -170.88 Td
(2815 }) 26.2111 Tj
0 -180.374 Td
(2816 ) 21.8426 Tj
0 -189.867 Td
(2817 int) 34.9481 Tj
0 -199.361 Td
(2818 sys_exit\(void\)) 83.0018 Tj
0 -208.854 Td
(2819 {) 26.2111 Tj
0 -218.347 Td
(2820   exit\(\);) 61.1592 Tj
0 -227.841 Td
(2821   return 0;  // not reached) 139.792 Tj
0 -237.334 Td
(2822 }) 26.2111 Tj
0 -246.827 Td
(2823 ) 21.8426 Tj
0 -256.321 Td
(2824 int) 34.9481 Tj
0 -265.814 Td
(2825 sys_wait\(void\)) 83.0018 Tj
0 -275.307 Td
(2826 {) 26.2111 Tj
0 -284.801 Td
(2827   return wait\(\);) 91.7388 Tj
0 -294.294 Td
(2828 }) 26.2111 Tj
0 -303.788 Td
(2829 ) 21.8426 Tj
0 -313.281 Td
(2830 int) 34.9481 Tj
0 -322.774 Td
(2831 sys_kill\(void\)) 83.0018 Tj
0 -332.268 Td
(2832 {) 26.2111 Tj
0 -341.761 Td
(2833   int pid;) 65.5277 Tj
0 -351.254 Td
(2834 ) 21.8426 Tj
0 -360.748 Td
(2835   if\(argint\(0, &pid\) < 0\)) 131.055 Tj
0 -370.241 Td
(2836     return -1;) 83.0018 Tj
0 -379.734 Td
(2837   return kill\(pid\);) 104.844 Tj
0 -389.228 Td
(2838 }) 26.2111 Tj
0 -398.721 Td
(2839 ) 21.8426 Tj
0 -408.214 Td
(2840 int) 34.9481 Tj
0 -417.708 Td
(2841 sys_getpid\(void\)) 91.7388 Tj
0 -427.201 Td
(2842 {) 26.2111 Tj
0 -436.695 Td
(2843   return cp->pid;) 96.1073 Tj
0 -446.188 Td
(2844 }) 26.2111 Tj
0 -455.681 Td
(2845 ) 21.8426 Tj
0 -465.175 Td
(2846 ) 21.8426 Tj
0 -474.668 Td
(2847 ) 21.8426 Tj
0 -484.161 Td
(2848 ) 21.8426 Tj
0 -493.655 Td
(2849 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sysproc.c  Page 2) 174.741 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.318 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.92 Td
(2859     return -1;) 83.0018 Tj
0 -123.414 Td
(2860   setupsegs\(cp\);) 91.7388 Tj
0 -132.907 Td
(2861   return addr;) 83.0018 Tj
0 -142.4 Td
(2862 }) 26.2111 Tj
0 -151.894 Td
(2863 ) 21.8426 Tj
0 -161.387 Td
(2864 int) 34.9481 Tj
0 -170.88 Td
(2865 sys_sleep\(void\)) 87.3703 Tj
0 -180.374 Td
(2866 {) 26.2111 Tj
0 -189.867 Td
(2867   int n, ticks0;) 91.7388 Tj
0 -199.361 Td
(2868 ) 21.8426 Tj
0 -208.854 Td
(2869   if\(argint\(0, &n\) < 0\)) 122.318 Tj
0 -218.347 Td
(2870     return -1;) 83.0018 Tj
0 -227.841 Td
(2871   acquire\(&tickslock\);) 117.95 Tj
0 -237.334 Td
(2872   ticks0 = ticks;) 96.1073 Tj
0 -246.827 Td
(2873   while\(ticks - ticks0 < n\){) 144.161 Tj
0 -256.321 Td
(2874     if\(cp->killed\){) 104.844 Tj
0 -265.814 Td
(2875       release\(&tickslock\);) 135.424 Tj
0 -275.307 Td
(2876       return -1;) 91.7388 Tj
0 -284.801 Td
(2877     }) 43.6851 Tj
0 -294.294 Td
(2878     sleep\(&ticks, &tickslock\);) 152.898 Tj
0 -303.788 Td
(2879   }) 34.9481 Tj
0 -313.281 Td
(2880   release\(&tickslock\);) 117.95 Tj
0 -322.774 Td
(2881   return 0;) 69.8962 Tj
0 -332.268 Td
(2882 }) 26.2111 Tj
0 -341.761 Td
(2883 ) 21.8426 Tj
0 -351.254 Td
(2884 ) 21.8426 Tj
0 -360.748 Td
(2885 ) 21.8426 Tj
0 -370.241 Td
(2886 ) 21.8426 Tj
0 -379.734 Td
(2887 ) 21.8426 Tj
0 -389.228 Td
(2888 ) 21.8426 Tj
0 -398.721 Td
(2889 ) 21.8426 Tj
0 -408.214 Td
(2890 ) 21.8426 Tj
0 -417.708 Td
(2891 ) 21.8426 Tj
0 -427.201 Td
(2892 ) 21.8426 Tj
0 -436.695 Td
(2893 ) 21.8426 Tj
0 -446.188 Td
(2894 ) 21.8426 Tj
0 -455.681 Td
(2895 ) 21.8426 Tj
0 -465.175 Td
(2896 ) 21.8426 Tj
0 -474.668 Td
(2897 ) 21.8426 Tj
0 -484.161 Td
(2898 ) 21.8426 Tj
0 -493.655 Td
(2899 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/buf.h  Page 1) 157.267 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.478 Tj
0 -75.9469 Td
(2905   struct buf *next;) 104.844 Tj
0 -85.4403 Td
(2906   struct buf *qnext; // disk queue) 170.372 Tj
0 -94.9336 Td
(2907   uchar data[512];) 100.476 Tj
0 -104.427 Td
(2908 };) 30.5796 Tj
0 -113.92 Td
(2909 #define B_BUSY  0x1  // buffer is locked by some process) 266.479 Tj
0 -123.414 Td
(2910 #define B_VALID 0x2  // buffer has been read from disk) 257.742 Tj
0 -132.907 Td
(2911 #define B_DIRTY 0x4  // buffer needs to be written to disk) 275.216 Tj
0 -142.4 Td
(2912 ) 21.8426 Tj
0 -151.894 Td
(2913 ) 21.8426 Tj
0 -161.387 Td
(2914 ) 21.8426 Tj
0 -170.88 Td
(2915 ) 21.8426 Tj
0 -180.374 Td
(2916 ) 21.8426 Tj
0 -189.867 Td
(2917 ) 21.8426 Tj
0 -199.361 Td
(2918 ) 21.8426 Tj
0 -208.854 Td
(2919 ) 21.8426 Tj
0 -218.347 Td
(2920 ) 21.8426 Tj
0 -227.841 Td
(2921 ) 21.8426 Tj
0 -237.334 Td
(2922 ) 21.8426 Tj
0 -246.827 Td
(2923 ) 21.8426 Tj
0 -256.321 Td
(2924 ) 21.8426 Tj
0 -265.814 Td
(2925 ) 21.8426 Tj
0 -275.307 Td
(2926 ) 21.8426 Tj
0 -284.801 Td
(2927 ) 21.8426 Tj
0 -294.294 Td
(2928 ) 21.8426 Tj
0 -303.788 Td
(2929 ) 21.8426 Tj
0 -313.281 Td
(2930 ) 21.8426 Tj
0 -322.774 Td
(2931 ) 21.8426 Tj
0 -332.268 Td
(2932 ) 21.8426 Tj
0 -341.761 Td
(2933 ) 21.8426 Tj
0 -351.254 Td
(2934 ) 21.8426 Tj
0 -360.748 Td
(2935 ) 21.8426 Tj
0 -370.241 Td
(2936 ) 21.8426 Tj
0 -379.734 Td
(2937 ) 21.8426 Tj
0 -389.228 Td
(2938 ) 21.8426 Tj
0 -398.721 Td
(2939 ) 21.8426 Tj
0 -408.214 Td
(2940 ) 21.8426 Tj
0 -417.708 Td
(2941 ) 21.8426 Tj
0 -427.201 Td
(2942 ) 21.8426 Tj
0 -436.695 Td
(2943 ) 21.8426 Tj
0 -446.188 Td
(2944 ) 21.8426 Tj
0 -455.681 Td
(2945 ) 21.8426 Tj
0 -465.175 Td
(2946 ) 21.8426 Tj
0 -474.668 Td
(2947 ) 21.8426 Tj
0 -484.161 Td
(2948 ) 21.8426 Tj
0 -493.655 Td
(2949 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/dev.h  Page 1) 157.267 Tj
0 -28.4801 Td
(2950 struct devsw {) 83.0018 Tj
0 -37.9735 Td
(2951   int \(*read\)\(struct inode*, char*, int\);) 200.952 Tj
0 -47.4668 Td
(2952   int \(*write\)\(struct inode*, char*, int\);) 205.32 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.92 Td
(2959 ) 21.8426 Tj
0 -123.414 Td
(2960 ) 21.8426 Tj
0 -132.907 Td
(2961 ) 21.8426 Tj
0 -142.4 Td
(2962 ) 21.8426 Tj
0 -151.894 Td
(2963 ) 21.8426 Tj
0 -161.387 Td
(2964 ) 21.8426 Tj
0 -170.88 Td
(2965 ) 21.8426 Tj
0 -180.374 Td
(2966 ) 21.8426 Tj
0 -189.867 Td
(2967 ) 21.8426 Tj
0 -199.361 Td
(2968 ) 21.8426 Tj
0 -208.854 Td
(2969 ) 21.8426 Tj
0 -218.347 Td
(2970 ) 21.8426 Tj
0 -227.841 Td
(2971 ) 21.8426 Tj
0 -237.334 Td
(2972 ) 21.8426 Tj
0 -246.827 Td
(2973 ) 21.8426 Tj
0 -256.321 Td
(2974 ) 21.8426 Tj
0 -265.814 Td
(2975 ) 21.8426 Tj
0 -275.307 Td
(2976 ) 21.8426 Tj
0 -284.801 Td
(2977 ) 21.8426 Tj
0 -294.294 Td
(2978 ) 21.8426 Tj
0 -303.788 Td
(2979 ) 21.8426 Tj
0 -313.281 Td
(2980 ) 21.8426 Tj
0 -322.774 Td
(2981 ) 21.8426 Tj
0 -332.268 Td
(2982 ) 21.8426 Tj
0 -341.761 Td
(2983 ) 21.8426 Tj
0 -351.254 Td
(2984 ) 21.8426 Tj
0 -360.748 Td
(2985 ) 21.8426 Tj
0 -370.241 Td
(2986 ) 21.8426 Tj
0 -379.734 Td
(2987 ) 21.8426 Tj
0 -389.228 Td
(2988 ) 21.8426 Tj
0 -398.721 Td
(2989 ) 21.8426 Tj
0 -408.214 Td
(2990 ) 21.8426 Tj
0 -417.708 Td
(2991 ) 21.8426 Tj
0 -427.201 Td
(2992 ) 21.8426 Tj
0 -436.695 Td
(2993 ) 21.8426 Tj
0 -446.188 Td
(2994 ) 21.8426 Tj
0 -455.681 Td
(2995 ) 21.8426 Tj
0 -465.175 Td
(2996 ) 21.8426 Tj
0 -474.668 Td
(2997 ) 21.8426 Tj
0 -484.161 Td
(2998 ) 21.8426 Tj
0 -493.655 Td
(2999 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fcntl.h  Page 1) 166.004 Tj
0 -28.4801 Td
(3000 #define O_RDONLY  0x000) 122.318 Tj
0 -37.9735 Td
(3001 #define O_WRONLY  0x001) 122.318 Tj
0 -47.4668 Td
(3002 #define O_RDWR    0x002) 122.318 Tj
0 -56.9602 Td
(3003 #define O_CREATE  0x200) 122.318 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.92 Td
(3009 ) 21.8426 Tj
0 -123.414 Td
(3010 ) 21.8426 Tj
0 -132.907 Td
(3011 ) 21.8426 Tj
0 -142.4 Td
(3012 ) 21.8426 Tj
0 -151.894 Td
(3013 ) 21.8426 Tj
0 -161.387 Td
(3014 ) 21.8426 Tj
0 -170.88 Td
(3015 ) 21.8426 Tj
0 -180.374 Td
(3016 ) 21.8426 Tj
0 -189.867 Td
(3017 ) 21.8426 Tj
0 -199.361 Td
(3018 ) 21.8426 Tj
0 -208.854 Td
(3019 ) 21.8426 Tj
0 -218.347 Td
(3020 ) 21.8426 Tj
0 -227.841 Td
(3021 ) 21.8426 Tj
0 -237.334 Td
(3022 ) 21.8426 Tj
0 -246.827 Td
(3023 ) 21.8426 Tj
0 -256.321 Td
(3024 ) 21.8426 Tj
0 -265.814 Td
(3025 ) 21.8426 Tj
0 -275.307 Td
(3026 ) 21.8426 Tj
0 -284.801 Td
(3027 ) 21.8426 Tj
0 -294.294 Td
(3028 ) 21.8426 Tj
0 -303.788 Td
(3029 ) 21.8426 Tj
0 -313.281 Td
(3030 ) 21.8426 Tj
0 -322.774 Td
(3031 ) 21.8426 Tj
0 -332.268 Td
(3032 ) 21.8426 Tj
0 -341.761 Td
(3033 ) 21.8426 Tj
0 -351.254 Td
(3034 ) 21.8426 Tj
0 -360.748 Td
(3035 ) 21.8426 Tj
0 -370.241 Td
(3036 ) 21.8426 Tj
0 -379.734 Td
(3037 ) 21.8426 Tj
0 -389.228 Td
(3038 ) 21.8426 Tj
0 -398.721 Td
(3039 ) 21.8426 Tj
0 -408.214 Td
(3040 ) 21.8426 Tj
0 -417.708 Td
(3041 ) 21.8426 Tj
0 -427.201 Td
(3042 ) 21.8426 Tj
0 -436.695 Td
(3043 ) 21.8426 Tj
0 -446.188 Td
(3044 ) 21.8426 Tj
0 -455.681 Td
(3045 ) 21.8426 Tj
0 -465.175 Td
(3046 ) 21.8426 Tj
0 -474.668 Td
(3047 ) 21.8426 Tj
0 -484.161 Td
(3048 ) 21.8426 Tj
0 -493.655 Td
(3049 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.267 Tj
0 -47.4668 Td
(3052   uint ino;    // Inode number on device) 196.583 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.952 Tj
0 -75.9469 Td
(3055   uint size;   // Size of file in bytes) 192.215 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.92 Td
(3059 ) 21.8426 Tj
0 -123.414 Td
(3060 ) 21.8426 Tj
0 -132.907 Td
(3061 ) 21.8426 Tj
0 -142.4 Td
(3062 ) 21.8426 Tj
0 -151.894 Td
(3063 ) 21.8426 Tj
0 -161.387 Td
(3064 ) 21.8426 Tj
0 -170.88 Td
(3065 ) 21.8426 Tj
0 -180.374 Td
(3066 ) 21.8426 Tj
0 -189.867 Td
(3067 ) 21.8426 Tj
0 -199.361 Td
(3068 ) 21.8426 Tj
0 -208.854 Td
(3069 ) 21.8426 Tj
0 -218.347 Td
(3070 ) 21.8426 Tj
0 -227.841 Td
(3071 ) 21.8426 Tj
0 -237.334 Td
(3072 ) 21.8426 Tj
0 -246.827 Td
(3073 ) 21.8426 Tj
0 -256.321 Td
(3074 ) 21.8426 Tj
0 -265.814 Td
(3075 ) 21.8426 Tj
0 -275.307 Td
(3076 ) 21.8426 Tj
0 -284.801 Td
(3077 ) 21.8426 Tj
0 -294.294 Td
(3078 ) 21.8426 Tj
0 -303.788 Td
(3079 ) 21.8426 Tj
0 -313.281 Td
(3080 ) 21.8426 Tj
0 -322.774 Td
(3081 ) 21.8426 Tj
0 -332.268 Td
(3082 ) 21.8426 Tj
0 -341.761 Td
(3083 ) 21.8426 Tj
0 -351.254 Td
(3084 ) 21.8426 Tj
0 -360.748 Td
(3085 ) 21.8426 Tj
0 -370.241 Td
(3086 ) 21.8426 Tj
0 -379.734 Td
(3087 ) 21.8426 Tj
0 -389.228 Td
(3088 ) 21.8426 Tj
0 -398.721 Td
(3089 ) 21.8426 Tj
0 -408.214 Td
(3090 ) 21.8426 Tj
0 -417.708 Td
(3091 ) 21.8426 Tj
0 -427.201 Td
(3092 ) 21.8426 Tj
0 -436.695 Td
(3093 ) 21.8426 Tj
0 -446.188 Td
(3094 ) 21.8426 Tj
0 -455.681 Td
(3095 ) 21.8426 Tj
0 -465.175 Td
(3096 ) 21.8426 Tj
0 -474.668 Td
(3097 ) 21.8426 Tj
0 -484.161 Td
(3098 ) 21.8426 Tj
0 -493.655 Td
(3099 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.742 Tj
0 -47.4668 Td
(3102   int ref; // reference count) 148.529 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.213 Tj
0 -85.4403 Td
(3106   struct inode *ip;) 104.844 Tj
0 -94.9336 Td
(3107   uint off;) 69.8962 Tj
0 -104.427 Td
(3108 };) 30.5796 Tj
0 -113.92 Td
(3109 ) 21.8426 Tj
0 -123.414 Td
(3110 ) 21.8426 Tj
0 -132.907 Td
(3111 ) 21.8426 Tj
0 -142.4 Td
(3112 ) 21.8426 Tj
0 -151.894 Td
(3113 ) 21.8426 Tj
0 -161.387 Td
(3114 ) 21.8426 Tj
0 -170.88 Td
(3115 ) 21.8426 Tj
0 -180.374 Td
(3116 ) 21.8426 Tj
0 -189.867 Td
(3117 ) 21.8426 Tj
0 -199.361 Td
(3118 ) 21.8426 Tj
0 -208.854 Td
(3119 ) 21.8426 Tj
0 -218.347 Td
(3120 ) 21.8426 Tj
0 -227.841 Td
(3121 ) 21.8426 Tj
0 -237.334 Td
(3122 ) 21.8426 Tj
0 -246.827 Td
(3123 ) 21.8426 Tj
0 -256.321 Td
(3124 ) 21.8426 Tj
0 -265.814 Td
(3125 ) 21.8426 Tj
0 -275.307 Td
(3126 ) 21.8426 Tj
0 -284.801 Td
(3127 ) 21.8426 Tj
0 -294.294 Td
(3128 ) 21.8426 Tj
0 -303.788 Td
(3129 ) 21.8426 Tj
0 -313.281 Td
(3130 ) 21.8426 Tj
0 -322.774 Td
(3131 ) 21.8426 Tj
0 -332.268 Td
(3132 ) 21.8426 Tj
0 -341.761 Td
(3133 ) 21.8426 Tj
0 -351.254 Td
(3134 ) 21.8426 Tj
0 -360.748 Td
(3135 ) 21.8426 Tj
0 -370.241 Td
(3136 ) 21.8426 Tj
0 -379.734 Td
(3137 ) 21.8426 Tj
0 -389.228 Td
(3138 ) 21.8426 Tj
0 -398.721 Td
(3139 ) 21.8426 Tj
0 -408.214 Td
(3140 ) 21.8426 Tj
0 -417.708 Td
(3141 ) 21.8426 Tj
0 -427.201 Td
(3142 ) 21.8426 Tj
0 -436.695 Td
(3143 ) 21.8426 Tj
0 -446.188 Td
(3144 ) 21.8426 Tj
0 -455.681 Td
(3145 ) 21.8426 Tj
0 -465.175 Td
(3146 ) 21.8426 Tj
0 -474.668 Td
(3147 ) 21.8426 Tj
0 -484.161 Td
(3148 ) 21.8426 Tj
0 -493.655 Td
(3149 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.216 Tj
0 -47.4668 Td
(3152 ) 21.8426 Tj
0 -56.9602 Td
(3153 // Block 0 is unused.) 113.581 Tj
0 -66.4535 Td
(3154 // Block 1 is super block.) 135.424 Tj
0 -75.9469 Td
(3155 // Inodes start at block 2.) 139.792 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.92 Td
(3159 // File system super block) 135.424 Tj
0 -123.414 Td
(3160 struct superblock {) 104.844 Tj
0 -132.907 Td
(3161   uint size;         // Size of file system image \(blocks\
\)) 275.216 Tj
0 -142.4 Td
(3162   uint nblocks;      // Number of data blocks) 218.426 Tj
0 -151.894 Td
(3163   uint ninodes;      // Number of inodes.) 200.952 Tj
0 -161.387 Td
(3164 };) 30.5796 Tj
0 -170.88 Td
(3165 ) 21.8426 Tj
0 -180.374 Td
(3166 #define NADDRS \(NDIRECT+1\)) 135.424 Tj
0 -189.867 Td
(3167 #define NDIRECT 12) 100.476 Tj
0 -199.361 Td
(3168 #define INDIRECT 12) 104.844 Tj
0 -208.854 Td
(3169 #define NINDIRECT \(BSIZE / sizeof\(uint\)\)) 196.583 Tj
0 -218.347 Td
(3170 #define MAXFILE \(NDIRECT  + NINDIRECT\)) 187.846 Tj
0 -227.841 Td
(3171 ) 21.8426 Tj
0 -237.334 Td
(3172 // On-disk inode structure) 135.424 Tj
0 -246.827 Td
(3173 struct dinode {) 87.3703 Tj
0 -256.321 Td
(3174   short type;           // File type) 179.109 Tj
0 -265.814 Td
(3175   short major;          // Major device number \(T_DEV onl\
y\)) 279.585 Tj
0 -275.307 Td
(3176   short minor;          // Minor device number \(T_DEV onl\
y\)) 279.585 Tj
0 -284.801 Td
(3177   short nlink;          // Number of links to inode in fil\
e system) 310.165 Tj
0 -294.294 Td
(3178   uint size;            // Size of file \(bytes\)) 227.163 Tj
0 -303.788 Td
(3179   uint addrs[NADDRS];   // Data block addresses) 227.163 Tj
0 -313.281 Td
(3180 };) 30.5796 Tj
0 -322.774 Td
(3181 ) 21.8426 Tj
0 -332.268 Td
(3182 #define T_DIR  1   // Directory) 157.267 Tj
0 -341.761 Td
(3183 #define T_FILE 2   // File) 135.424 Tj
0 -351.254 Td
(3184 #define T_DEV  3   // Special device) 179.109 Tj
0 -360.748 Td
(3185 ) 21.8426 Tj
0 -370.241 Td
(3186 // Inodes per block.) 109.213 Tj
0 -379.734 Td
(3187 #define IPB           \(BSIZE / sizeof\(struct dinode\)\)) 253.374 Tj
0 -389.228 Td
(3188 ) 21.8426 Tj
0 -398.721 Td
(3189 // Block containing inode i) 139.792 Tj
0 -408.214 Td
(3190 #define IBLOCK\(i\)     \(\(i\) / IPB + 2\)) 183.478 Tj
0 -417.708 Td
(3191 ) 21.8426 Tj
0 -427.201 Td
(3192 // Bitmap bits per block) 126.687 Tj
0 -436.695 Td
(3193 #define BPB           \(BSIZE*8\)) 157.267 Tj
0 -446.188 Td
(3194 ) 21.8426 Tj
0 -455.681 Td
(3195 // Block containing bit for block b) 174.741 Tj
0 -465.175 Td
(3196 #define BBLOCK\(b, ninodes\) \(b/BPB + \(ninodes\)/IPB + 3\
\)) 257.742 Tj
0 -474.668 Td
(3197 ) 21.8426 Tj
0 -484.161 Td
(3198 ) 21.8426 Tj
0 -493.655 Td
(3199 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.165 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.213 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.92 Td
(3209 ) 21.8426 Tj
0 -123.414 Td
(3210 ) 21.8426 Tj
0 -132.907 Td
(3211 ) 21.8426 Tj
0 -142.4 Td
(3212 ) 21.8426 Tj
0 -151.894 Td
(3213 ) 21.8426 Tj
0 -161.387 Td
(3214 ) 21.8426 Tj
0 -170.88 Td
(3215 ) 21.8426 Tj
0 -180.374 Td
(3216 ) 21.8426 Tj
0 -189.867 Td
(3217 ) 21.8426 Tj
0 -199.361 Td
(3218 ) 21.8426 Tj
0 -208.854 Td
(3219 ) 21.8426 Tj
0 -218.347 Td
(3220 ) 21.8426 Tj
0 -227.841 Td
(3221 ) 21.8426 Tj
0 -237.334 Td
(3222 ) 21.8426 Tj
0 -246.827 Td
(3223 ) 21.8426 Tj
0 -256.321 Td
(3224 ) 21.8426 Tj
0 -265.814 Td
(3225 ) 21.8426 Tj
0 -275.307 Td
(3226 ) 21.8426 Tj
0 -284.801 Td
(3227 ) 21.8426 Tj
0 -294.294 Td
(3228 ) 21.8426 Tj
0 -303.788 Td
(3229 ) 21.8426 Tj
0 -313.281 Td
(3230 ) 21.8426 Tj
0 -322.774 Td
(3231 ) 21.8426 Tj
0 -332.268 Td
(3232 ) 21.8426 Tj
0 -341.761 Td
(3233 ) 21.8426 Tj
0 -351.254 Td
(3234 ) 21.8426 Tj
0 -360.748 Td
(3235 ) 21.8426 Tj
0 -370.241 Td
(3236 ) 21.8426 Tj
0 -379.734 Td
(3237 ) 21.8426 Tj
0 -389.228 Td
(3238 ) 21.8426 Tj
0 -398.721 Td
(3239 ) 21.8426 Tj
0 -408.214 Td
(3240 ) 21.8426 Tj
0 -417.708 Td
(3241 ) 21.8426 Tj
0 -427.201 Td
(3242 ) 21.8426 Tj
0 -436.695 Td
(3243 ) 21.8426 Tj
0 -446.188 Td
(3244 ) 21.8426 Tj
0 -455.681 Td
(3245 ) 21.8426 Tj
0 -465.175 Td
(3246 ) 21.8426 Tj
0 -474.668 Td
(3247 ) 21.8426 Tj
0 -484.161 Td
(3248 ) 21.8426 Tj
0 -493.655 Td
(3249 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fsvar.h  Page 1) 166.004 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.846 Tj
0 -66.4535 Td
(3254   uint inum;          // Inode number) 183.478 Tj
0 -75.9469 Td
(3255   int ref;            // Reference count) 196.583 Tj
0 -85.4403 Td
(3256   int flags;          // I_BUSY, I_VALID) 196.583 Tj
0 -94.9336 Td
(3257 ) 21.8426 Tj
0 -104.427 Td
(3258   short type;         // copy of disk inode) 209.689 Tj
0 -113.92 Td
(3259   short major;) 83.0018 Tj
0 -123.414 Td
(3260   short minor;) 83.0018 Tj
0 -132.907 Td
(3261   short nlink;) 83.0018 Tj
0 -142.4 Td
(3262   uint size;) 74.2647 Tj
0 -151.894 Td
(3263   uint addrs[NADDRS];) 113.581 Tj
0 -161.387 Td
(3264 };) 30.5796 Tj
0 -170.88 Td
(3265 ) 21.8426 Tj
0 -180.374 Td
(3266 #define I_BUSY 0x1) 100.476 Tj
0 -189.867 Td
(3267 #define I_VALID 0x2) 104.844 Tj
0 -199.361 Td
(3268 ) 21.8426 Tj
0 -208.854 Td
(3269 ) 21.8426 Tj
0 -218.347 Td
(3270 ) 21.8426 Tj
0 -227.841 Td
(3271 ) 21.8426 Tj
0 -237.334 Td
(3272 ) 21.8426 Tj
0 -246.827 Td
(3273 ) 21.8426 Tj
0 -256.321 Td
(3274 ) 21.8426 Tj
0 -265.814 Td
(3275 ) 21.8426 Tj
0 -275.307 Td
(3276 ) 21.8426 Tj
0 -284.801 Td
(3277 ) 21.8426 Tj
0 -294.294 Td
(3278 ) 21.8426 Tj
0 -303.788 Td
(3279 ) 21.8426 Tj
0 -313.281 Td
(3280 ) 21.8426 Tj
0 -322.774 Td
(3281 ) 21.8426 Tj
0 -332.268 Td
(3282 ) 21.8426 Tj
0 -341.761 Td
(3283 ) 21.8426 Tj
0 -351.254 Td
(3284 ) 21.8426 Tj
0 -360.748 Td
(3285 ) 21.8426 Tj
0 -370.241 Td
(3286 ) 21.8426 Tj
0 -379.734 Td
(3287 ) 21.8426 Tj
0 -389.228 Td
(3288 ) 21.8426 Tj
0 -398.721 Td
(3289 ) 21.8426 Tj
0 -408.214 Td
(3290 ) 21.8426 Tj
0 -417.708 Td
(3291 ) 21.8426 Tj
0 -427.201 Td
(3292 ) 21.8426 Tj
0 -436.695 Td
(3293 ) 21.8426 Tj
0 -446.188 Td
(3294 ) 21.8426 Tj
0 -455.681 Td
(3295 ) 21.8426 Tj
0 -465.175 Td
(3296 ) 21.8426 Tj
0 -474.668 Td
(3297 ) 21.8426 Tj
0 -484.161 Td
(3298 ) 21.8426 Tj
0 -493.655 Td
(3299 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/ide.c  Page 1) 157.267 Tj
0 -28.4801 Td
(3300 // Simple PIO-based \(non-DMA\) IDE driver code.) 222.794 Tj
0 -37.9735 Td
(3301 ) 21.8426 Tj
0 -47.4668 Td
(3302 #include "types.h") 100.476 Tj
0 -56.9602 Td
(3303 #include "defs.h") 96.1073 Tj
0 -66.4535 Td
(3304 #include "param.h") 100.476 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.476 Tj
0 -113.92 Td
(3309 #include "spinlock.h") 113.581 Tj
0 -123.414 Td
(3310 #include "buf.h") 91.7388 Tj
0 -132.907 Td
(3311 ) 21.8426 Tj
0 -142.4 Td
(3312 #define IDE_BSY       0x80) 135.424 Tj
0 -151.894 Td
(3313 #define IDE_DRDY      0x40) 135.424 Tj
0 -161.387 Td
(3314 #define IDE_DF        0x20) 135.424 Tj
0 -170.88 Td
(3315 #define IDE_ERR       0x01) 135.424 Tj
0 -180.374 Td
(3316 ) 21.8426 Tj
0 -189.867 Td
(3317 #define IDE_CMD_READ  0x20) 135.424 Tj
0 -199.361 Td
(3318 #define IDE_CMD_WRITE 0x30) 135.424 Tj
0 -208.854 Td
(3319 ) 21.8426 Tj
0 -218.347 Td
(3320 // ide_queue points to the buf now being read/written to t\
he disk.) 310.165 Tj
0 -227.841 Td
(3321 // ide_queue->qnext points to the next buf to be processed\
.) 279.585 Tj
0 -237.334 Td
(3322 // You must hold ide_lock while manipulating queue.) 244.637 Tj
0 -246.827 Td
(3323 ) 21.8426 Tj
0 -256.321 Td
(3324 static struct spinlock ide_lock;) 161.635 Tj
0 -265.814 Td
(3325 static struct buf *ide_queue;) 148.529 Tj
0 -275.307 Td
(3326 ) 21.8426 Tj
0 -284.801 Td
(3327 static int disk_1_present;) 135.424 Tj
0 -294.294 Td
(3328 static void ide_start_request\(\);) 161.635 Tj
0 -303.788 Td
(3329 ) 21.8426 Tj
0 -313.281 Td
(3330 // Wait for IDE disk to become ready.) 183.478 Tj
0 -322.774 Td
(3331 static int) 65.5277 Tj
0 -332.268 Td
(3332 ide_wait_ready\(int check_error\)) 157.267 Tj
0 -341.761 Td
(3333 {) 26.2111 Tj
0 -351.254 Td
(3334   int r;) 56.7907 Tj
0 -360.748 Td
(3335 ) 21.8426 Tj
0 -370.241 Td
(3336   while\(\(\(r = inb\(0x1f7\)\) & IDE_BSY\) || !\(r & IDE_\
DRDY\)\)) 266.479 Tj
0 -379.734 Td
(3337     ;) 43.6851 Tj
0 -389.228 Td
(3338   if\(check_error && \(r & \(IDE_DF|IDE_ERR\)\) != 0\)) 231.531 Tj
0 -398.721 Td
(3339     return -1;) 83.0018 Tj
0 -408.214 Td
(3340   return 0;) 69.8962 Tj
0 -417.708 Td
(3341 }) 26.2111 Tj
0 -427.201 Td
(3342 ) 21.8426 Tj
0 -436.695 Td
(3343 ) 21.8426 Tj
0 -446.188 Td
(3344 ) 21.8426 Tj
0 -455.681 Td
(3345 ) 21.8426 Tj
0 -465.175 Td
(3346 ) 21.8426 Tj
0 -474.668 Td
(3347 ) 21.8426 Tj
0 -484.161 Td
(3348 ) 21.8426 Tj
0 -493.655 Td
(3349 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/ide.c  Page 2) 157.267 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.529 Tj
0 -85.4403 Td
(3356   pic_enable\(IRQ_IDE\);) 117.95 Tj
0 -94.9336 Td
(3357   ioapic_enable\(IRQ_IDE, ncpu - 1\);) 174.741 Tj
0 -104.427 Td
(3358   ide_wait_ready\(0\);) 109.213 Tj
0 -113.92 Td
(3359 ) 21.8426 Tj
0 -123.414 Td
(3360   // Check if disk 1 is present) 157.267 Tj
0 -132.907 Td
(3361   outb\(0x1f6, 0xe0 | \(1<<4\)\);) 148.529 Tj
0 -142.4 Td
(3362   for\(i=0; i<1000; i++\){) 126.687 Tj
0 -151.894 Td
(3363     if\(inb\(0x1f7\) != 0\){) 126.687 Tj
0 -161.387 Td
(3364       disk_1_present = 1;) 131.055 Tj
0 -170.88 Td
(3365       break;) 74.2647 Tj
0 -180.374 Td
(3366     }) 43.6851 Tj
0 -189.867 Td
(3367   }) 34.9481 Tj
0 -199.361 Td
(3368 ) 21.8426 Tj
0 -208.854 Td
(3369   // Switch back to disk 0.) 139.792 Tj
0 -218.347 Td
(3370   outb\(0x1f6, 0xe0 | \(0<<4\)\);) 148.529 Tj
0 -227.841 Td
(3371 }) 26.2111 Tj
0 -237.334 Td
(3372 ) 21.8426 Tj
0 -246.827 Td
(3373 // Start the request for b.  Caller must hold ide_lock.) 262.111 Tj
0 -256.321 Td
(3374 static void) 69.8962 Tj
0 -265.814 Td
(3375 ide_start_request\(struct buf *b\)) 161.635 Tj
0 -275.307 Td
(3376 {) 26.2111 Tj
0 -284.801 Td
(3377   if\(b == 0\)) 74.2647 Tj
0 -294.294 Td
(3378     panic\("ide_start_request"\);) 157.267 Tj
0 -303.788 Td
(3379 ) 21.8426 Tj
0 -313.281 Td
(3380   ide_wait_ready\(0\);) 109.213 Tj
0 -322.774 Td
(3381   outb\(0x3f6, 0\);  // generate interrupt) 196.583 Tj
0 -332.268 Td
(3382   outb\(0x1f2, 1\);  // number of sectors) 192.215 Tj
0 -341.761 Td
(3383   outb\(0x1f3, b->sector & 0xff\);) 161.635 Tj
0 -351.254 Td
(3384   outb\(0x1f4, \(b->sector >> 8\) & 0xff\);) 192.215 Tj
0 -360.748 Td
(3385   outb\(0x1f5, \(b->sector >> 16\) & 0xff\);) 196.583 Tj
0 -370.241 Td
(3386   outb\(0x1f6, 0xe0 | \(\(b->dev&1\)<<4\) | \(\(b->sector>\
>24\)&0x0f\)\);) 297.059 Tj
0 -379.734 Td
(3387   if\(b->flags & B_DIRTY\){) 131.055 Tj
0 -389.228 Td
(3388     outb\(0x1f7, IDE_CMD_WRITE\);) 157.267 Tj
0 -398.721 Td
(3389     outsl\(0x1f0, b->data, 512/4\);) 166.004 Tj
0 -408.214 Td
(3390   } else {) 65.5277 Tj
0 -417.708 Td
(3391     outb\(0x1f7, IDE_CMD_READ\);) 152.898 Tj
0 -427.201 Td
(3392   }) 34.9481 Tj
0 -436.695 Td
(3393 }) 26.2111 Tj
0 -446.188 Td
(3394 ) 21.8426 Tj
0 -455.681 Td
(3395 ) 21.8426 Tj
0 -465.175 Td
(3396 ) 21.8426 Tj
0 -474.668 Td
(3397 ) 21.8426 Tj
0 -484.161 Td
(3398 ) 21.8426 Tj
0 -493.655 Td
(3399 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/ide.c  Page 3) 157.267 Tj
0 -28.4801 Td
(3400 // Interrupt handler.) 113.581 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.581 Tj
0 -94.9336 Td
(3407   if\(\(b = ide_queue\) == 0\){) 139.792 Tj
0 -104.427 Td
(3408     cprintf\("stray ide interrupt\\n"\);) 183.478 Tj
0 -113.92 Td
(3409     release\(&ide_lock\);) 122.318 Tj
0 -123.414 Td
(3410     return;) 69.8962 Tj
0 -132.907 Td
(3411   }) 34.9481 Tj
0 -142.4 Td
(3412 ) 21.8426 Tj
0 -151.894 Td
(3413   // Read data if needed.) 131.055 Tj
0 -161.387 Td
(3414   if\(!\(b->flags & B_DIRTY\) && ide_wait_ready\(1\) >= 0\)) 253.374 Tj
0 -170.88 Td
(3415     insl\(0x1f0, b->data, 512/4\);) 161.635 Tj
0 -180.374 Td
(3416 ) 21.8426 Tj
0 -189.867 Td
(3417   // Wake process waiting for this buf.) 192.215 Tj
0 -199.361 Td
(3418   b->flags |= B_VALID;) 117.95 Tj
0 -208.854 Td
(3419   b->flags &= ~B_DIRTY;) 122.318 Tj
0 -218.347 Td
(3420   wakeup\(b\);) 74.2647 Tj
0 -227.841 Td
(3421 ) 21.8426 Tj
0 -237.334 Td
(3422   // Start disk on next buf in queue.) 183.478 Tj
0 -246.827 Td
(3423   if\(\(ide_queue = b->qnext\) != 0\)) 166.004 Tj
0 -256.321 Td
(3424     ide_start_request\(ide_queue\);) 166.004 Tj
0 -265.814 Td
(3425 ) 21.8426 Tj
0 -275.307 Td
(3426   release\(&ide_lock\);) 113.581 Tj
0 -284.801 Td
(3427 }) 26.2111 Tj
0 -294.294 Td
(3428 ) 21.8426 Tj
0 -303.788 Td
(3429 ) 21.8426 Tj
0 -313.281 Td
(3430 ) 21.8426 Tj
0 -322.774 Td
(3431 ) 21.8426 Tj
0 -332.268 Td
(3432 ) 21.8426 Tj
0 -341.761 Td
(3433 ) 21.8426 Tj
0 -351.254 Td
(3434 ) 21.8426 Tj
0 -360.748 Td
(3435 ) 21.8426 Tj
0 -370.241 Td
(3436 ) 21.8426 Tj
0 -379.734 Td
(3437 ) 21.8426 Tj
0 -389.228 Td
(3438 ) 21.8426 Tj
0 -398.721 Td
(3439 ) 21.8426 Tj
0 -408.214 Td
(3440 ) 21.8426 Tj
0 -417.708 Td
(3441 ) 21.8426 Tj
0 -427.201 Td
(3442 ) 21.8426 Tj
0 -436.695 Td
(3443 ) 21.8426 Tj
0 -446.188 Td
(3444 ) 21.8426 Tj
0 -455.681 Td
(3445 ) 21.8426 Tj
0 -465.175 Td
(3446 ) 21.8426 Tj
0 -474.668 Td
(3447 ) 21.8426 Tj
0 -484.161 Td
(3448 ) 21.8426 Tj
0 -493.655 Td
(3449 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/ide.c  Page 4) 157.267 Tj
0 -28.4801 Td
(3450 // Sync buf with disk.) 117.95 Tj
0 -37.9735 Td
(3451 // If B_DIRTY is set, write buf to disk, clear B_DIRTY, se\
t B_VALID.) 318.902 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.581 Tj
0 -75.9469 Td
(3455 {) 26.2111 Tj
0 -85.4403 Td
(3456   struct buf **pp;) 100.476 Tj
0 -94.9336 Td
(3457 ) 21.8426 Tj
0 -104.427 Td
(3458   if\(!\(b->flags & B_BUSY\)\)) 135.424 Tj
0 -113.92 Td
(3459     panic\("ide_rw: buf not busy"\);) 170.372 Tj
0 -123.414 Td
(3460   if\(\(b->flags & \(B_VALID|B_DIRTY\)\) == B_VALID\)) 227.163 Tj
0 -132.907 Td
(3461     panic\("ide_rw: nothing to do"\);) 174.741 Tj
0 -142.4 Td
(3462   if\(b->dev != 0 && !disk_1_present\)) 179.109 Tj
0 -151.894 Td
(3463     panic\("ide disk 1 not present"\);) 179.109 Tj
0 -161.387 Td
(3464 ) 21.8426 Tj
0 -170.88 Td
(3465   acquire\(&ide_lock\);) 113.581 Tj
0 -180.374 Td
(3466 ) 21.8426 Tj
0 -189.867 Td
(3467   // Append b to ide_queue.) 139.792 Tj
0 -199.361 Td
(3468   b->qnext = 0;) 87.3703 Tj
0 -208.854 Td
(3469   for\(pp=&ide_queue; *pp; pp=&\(*pp\)->qnext\)) 209.689 Tj
0 -218.347 Td
(3470     ;) 43.6851 Tj
0 -227.841 Td
(3471   *pp = b;) 65.5277 Tj
0 -237.334 Td
(3472 ) 21.8426 Tj
0 -246.827 Td
(3473   // Start disk if necessary.) 148.529 Tj
0 -256.321 Td
(3474   if\(ide_queue == b\)) 109.213 Tj
0 -265.814 Td
(3475     ide_start_request\(b\);) 131.055 Tj
0 -275.307 Td
(3476 ) 21.8426 Tj
0 -284.801 Td
(3477   // Wait for request to finish.) 161.635 Tj
0 -294.294 Td
(3478   // Assuming will not sleep too long: ignore cp->killed.) 270.848 Tj
0 -303.788 Td
(3479   while\(\(b->flags & \(B_VALID|B_DIRTY\)\) != B_VALID\)) 240.268 Tj
0 -313.281 Td
(3480     sleep\(b, &ide_lock\);) 126.687 Tj
0 -322.774 Td
(3481 ) 21.8426 Tj
0 -332.268 Td
(3482   release\(&ide_lock\);) 113.581 Tj
0 -341.761 Td
(3483 }) 26.2111 Tj
0 -351.254 Td
(3484 ) 21.8426 Tj
0 -360.748 Td
(3485 ) 21.8426 Tj
0 -370.241 Td
(3486 ) 21.8426 Tj
0 -379.734 Td
(3487 ) 21.8426 Tj
0 -389.228 Td
(3488 ) 21.8426 Tj
0 -398.721 Td
(3489 ) 21.8426 Tj
0 -408.214 Td
(3490 ) 21.8426 Tj
0 -417.708 Td
(3491 ) 21.8426 Tj
0 -427.201 Td
(3492 ) 21.8426 Tj
0 -436.695 Td
(3493 ) 21.8426 Tj
0 -446.188 Td
(3494 ) 21.8426 Tj
0 -455.681 Td
(3495 ) 21.8426 Tj
0 -465.175 Td
(3496 ) 21.8426 Tj
0 -474.668 Td
(3497 ) 21.8426 Tj
0 -484.161 Td
(3498 ) 21.8426 Tj
0 -493.655 Td
(3499 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/bio.c  Page 1) 157.267 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.69 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.639 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.92 Td
(3509 // * After changing buffer data, call bwrite to flush it t\
o disk.) 305.796 Tj
0 -123.414 Td
(3510 // * When done with the buffer, call brelse.) 214.057 Tj
0 -132.907 Td
(3511 // * Do not use the buffer after calling brelse.) 231.531 Tj
0 -142.4 Td
(3512 // * Only one process at a time can use a buffer,) 235.9 Tj
0 -151.894 Td
(3513 //     so do not keep them longer than necessary.) 235.9 Tj
0 -161.387 Td
(3514 //) 30.5796 Tj
0 -170.88 Td
(3515 // The implementation uses three state flags internally:) 266.479 Tj
0 -180.374 Td
(3516 // * B_BUSY: the block has been returned from bread) 244.637 Tj
0 -189.867 Td
(3517 //     and has not been passed back to brelse.) 222.794 Tj
0 -199.361 Td
(3518 // * B_VALID: the buffer data has been initialized) 240.268 Tj
0 -208.854 Td
(3519 //     with the associated disk block contents.) 227.163 Tj
0 -218.347 Td
(3520 // * B_DIRTY: the buffer data has been modified) 227.163 Tj
0 -227.841 Td
(3521 //     and needs to be written to disk.) 192.215 Tj
0 -237.334 Td
(3522 ) 21.8426 Tj
0 -246.827 Td
(3523 #include "types.h") 100.476 Tj
0 -256.321 Td
(3524 #include "defs.h") 96.1073 Tj
0 -265.814 Td
(3525 #include "param.h") 100.476 Tj
0 -275.307 Td
(3526 #include "spinlock.h") 113.581 Tj
0 -284.801 Td
(3527 #include "buf.h") 91.7388 Tj
0 -294.294 Td
(3528 ) 21.8426 Tj
0 -303.788 Td
(3529 struct buf buf[NBUF];) 113.581 Tj
0 -313.281 Td
(3530 struct spinlock buf_table_lock;) 157.267 Tj
0 -322.774 Td
(3531 ) 21.8426 Tj
0 -332.268 Td
(3532 // Linked list of all buffers, through prev/next.) 235.9 Tj
0 -341.761 Td
(3533 // bufhead->next is most recently used.) 192.215 Tj
0 -351.254 Td
(3534 // bufhead->tail is least recently used.) 196.583 Tj
0 -360.748 Td
(3535 struct buf bufhead;) 104.844 Tj
0 -370.241 Td
(3536 ) 21.8426 Tj
0 -379.734 Td
(3537 void) 39.3166 Tj
0 -389.228 Td
(3538 binit\(void\)) 69.8962 Tj
0 -398.721 Td
(3539 {) 26.2111 Tj
0 -408.214 Td
(3540   struct buf *b;) 91.7388 Tj
0 -417.708 Td
(3541 ) 21.8426 Tj
0 -427.201 Td
(3542   initlock\(&buf_table_lock, "buf_table"\);) 200.952 Tj
0 -436.695 Td
(3543 ) 21.8426 Tj
0 -446.188 Td
(3544 ) 21.8426 Tj
0 -455.681 Td
(3545 ) 21.8426 Tj
0 -465.175 Td
(3546 ) 21.8426 Tj
0 -474.668 Td
(3547 ) 21.8426 Tj
0 -484.161 Td
(3548 ) 21.8426 Tj
0 -493.655 Td
(3549 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/bio.c  Page 2) 157.267 Tj
0 -28.4801 Td
(3550   // Create linked list of buffers) 170.372 Tj
0 -37.9735 Td
(3551   bufhead.prev = &bufhead;) 135.424 Tj
0 -47.4668 Td
(3552   bufhead.next = &bufhead;) 135.424 Tj
0 -56.9602 Td
(3553   for\(b = buf; b < buf+NBUF; b++\){) 170.372 Tj
0 -66.4535 Td
(3554     b->next = bufhead.next;) 139.792 Tj
0 -75.9469 Td
(3555     b->prev = &bufhead;) 122.318 Tj
0 -85.4403 Td
(3556     bufhead.next->prev = b;) 139.792 Tj
0 -94.9336 Td
(3557     bufhead.next = b;) 113.581 Tj
0 -104.427 Td
(3558   }) 34.9481 Tj
0 -113.92 Td
(3559 }) 26.2111 Tj
0 -123.414 Td
(3560 ) 21.8426 Tj
0 -132.907 Td
(3561 // Look through buffer cache for sector on device dev.) 257.742 Tj
0 -142.4 Td
(3562 // If not found, allocate fresh block.) 187.846 Tj
0 -151.894 Td
(3563 // In either case, return locked buffer.) 196.583 Tj
0 -161.387 Td
(3564 static struct buf*) 100.476 Tj
0 -170.88 Td
(3565 bget\(uint dev, uint sector\)) 139.792 Tj
0 -180.374 Td
(3566 {) 26.2111 Tj
0 -189.867 Td
(3567   struct buf *b;) 91.7388 Tj
0 -199.361 Td
(3568 ) 21.8426 Tj
0 -208.854 Td
(3569   acquire\(&buf_table_lock\);) 139.792 Tj
0 -218.347 Td
(3570 ) 21.8426 Tj
0 -227.841 Td
(3571  loop:) 48.0537 Tj
0 -237.334 Td
(3572   // Try for cached block.) 135.424 Tj
0 -246.827 Td
(3573   for\(b = bufhead.next; b != &bufhead; b = b->next\){) 249.005 Tj
0 -256.321 Td
(3574     if\(\(b->flags & \(B_BUSY|B_VALID\)\) &&) 192.215 Tj
0 -265.814 Td
(3575        b->dev == dev && b->sector == sector\){) 218.426 Tj
0 -275.307 Td
(3576       if\(b->flags & B_BUSY\){) 144.161 Tj
0 -284.801 Td
(3577         sleep\(buf, &buf_table_lock\);) 179.109 Tj
0 -294.294 Td
(3578         goto loop;) 100.476 Tj
0 -303.788 Td
(3579       }) 52.4222 Tj
0 -313.281 Td
(3580       b->flags |= B_BUSY;) 131.055 Tj
0 -322.774 Td
(3581       release\(&buf_table_lock\);) 157.267 Tj
0 -332.268 Td
(3582       return b;) 87.3703 Tj
0 -341.761 Td
(3583     }) 43.6851 Tj
0 -351.254 Td
(3584   }) 34.9481 Tj
0 -360.748 Td
(3585 ) 21.8426 Tj
0 -370.241 Td
(3586   // Allocate fresh block.) 135.424 Tj
0 -379.734 Td
(3587   for\(b = bufhead.prev; b != &bufhead; b = b->prev\){) 249.005 Tj
0 -389.228 Td
(3588     if\(\(b->flags & B_BUSY\) == 0\){) 166.004 Tj
0 -398.721 Td
(3589       b->flags = B_BUSY;) 126.687 Tj
0 -408.214 Td
(3590       b->dev = dev;) 104.844 Tj
0 -417.708 Td
(3591       b->sector = sector;) 131.055 Tj
0 -427.201 Td
(3592       release\(&buf_table_lock\);) 157.267 Tj
0 -436.695 Td
(3593       return b;) 87.3703 Tj
0 -446.188 Td
(3594     }) 43.6851 Tj
0 -455.681 Td
(3595   }) 34.9481 Tj
0 -465.175 Td
(3596   panic\("bget: no buffers"\);) 144.161 Tj
0 -474.668 Td
(3597 }) 26.2111 Tj
0 -484.161 Td
(3598 ) 21.8426 Tj
0 -493.655 Td
(3599 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/bio.c  Page 3) 157.267 Tj
0 -28.4801 Td
(3600 // Return a B_BUSY buf with the contents of the indicated \
disk sector.) 327.639 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.687 Tj
0 -94.9336 Td
(3607   if\(!\(b->flags & B_VALID\)\)) 139.792 Tj
0 -104.427 Td
(3608     ide_rw\(b\);) 83.0018 Tj
0 -113.92 Td
(3609   return b;) 69.8962 Tj
0 -123.414 Td
(3610 }) 26.2111 Tj
0 -132.907 Td
(3611 ) 21.8426 Tj
0 -142.4 Td
(3612 // Write buf's contents to disk.  Must be locked.) 235.9 Tj
0 -151.894 Td
(3613 void) 39.3166 Tj
0 -161.387 Td
(3614 bwrite\(struct buf *b\)) 113.581 Tj
0 -170.88 Td
(3615 {) 26.2111 Tj
0 -180.374 Td
(3616   if\(\(b->flags & B_BUSY\) == 0\)) 152.898 Tj
0 -189.867 Td
(3617     panic\("bwrite"\);) 109.213 Tj
0 -199.361 Td
(3618   b->flags |= B_DIRTY;) 117.95 Tj
0 -208.854 Td
(3619   ide_rw\(b\);) 74.2647 Tj
0 -218.347 Td
(3620 }) 26.2111 Tj
0 -227.841 Td
(3621 ) 21.8426 Tj
0 -237.334 Td
(3622 // Release the buffer buf.) 135.424 Tj
0 -246.827 Td
(3623 void) 39.3166 Tj
0 -256.321 Td
(3624 brelse\(struct buf *b\)) 113.581 Tj
0 -265.814 Td
(3625 {) 26.2111 Tj
0 -275.307 Td
(3626   if\(\(b->flags & B_BUSY\) == 0\)) 152.898 Tj
0 -284.801 Td
(3627     panic\("brelse"\);) 109.213 Tj
0 -294.294 Td
(3628 ) 21.8426 Tj
0 -303.788 Td
(3629   acquire\(&buf_table_lock\);) 139.792 Tj
0 -313.281 Td
(3630 ) 21.8426 Tj
0 -322.774 Td
(3631   b->next->prev = b->prev;) 135.424 Tj
0 -332.268 Td
(3632   b->prev->next = b->next;) 135.424 Tj
0 -341.761 Td
(3633   b->next = bufhead.next;) 131.055 Tj
0 -351.254 Td
(3634   b->prev = &bufhead;) 113.581 Tj
0 -360.748 Td
(3635   bufhead.next->prev = b;) 131.055 Tj
0 -370.241 Td
(3636   bufhead.next = b;) 104.844 Tj
0 -379.734 Td
(3637 ) 21.8426 Tj
0 -389.228 Td
(3638   b->flags &= ~B_BUSY;) 117.95 Tj
0 -398.721 Td
(3639   wakeup\(buf\);) 83.0018 Tj
0 -408.214 Td
(3640 ) 21.8426 Tj
0 -417.708 Td
(3641   release\(&buf_table_lock\);) 139.792 Tj
0 -427.201 Td
(3642 }) 26.2111 Tj
0 -436.695 Td
(3643 ) 21.8426 Tj
0 -446.188 Td
(3644 ) 21.8426 Tj
0 -455.681 Td
(3645 ) 21.8426 Tj
0 -465.175 Td
(3646 ) 21.8426 Tj
0 -474.668 Td
(3647 ) 21.8426 Tj
0 -484.161 Td
(3648 ) 21.8426 Tj
0 -493.655 Td
(3649 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fs.c  Page 1) 152.898 Tj
0 -28.4801 Td
(3650 // File system implementation.  Four layers:) 214.057 Tj
0 -37.9735 Td
(3651 //   + Blocks: allocator for raw disk blocks.) 218.426 Tj
0 -47.4668 Td
(3652 //   + Files: inode allocator, reading, writing, metadata.) 275.216 Tj
0 -56.9602 Td
(3653 //   + Directories: inode with special contents \(list of \
other inodes!\)) 332.007 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.376 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.953 Tj
0 -113.92 Td
(3659 // routines.  The \(higher-level\) system call implementat\
ions) 283.953 Tj
0 -123.414 Td
(3660 // are in sysfile.c.) 109.213 Tj
0 -132.907 Td
(3661 ) 21.8426 Tj
0 -142.4 Td
(3662 #include "types.h") 100.476 Tj
0 -151.894 Td
(3663 #include "defs.h") 96.1073 Tj
0 -161.387 Td
(3664 #include "param.h") 100.476 Tj
0 -170.88 Td
(3665 #include "stat.h") 96.1073 Tj
0 -180.374 Td
(3666 #include "mmu.h") 91.7388 Tj
0 -189.867 Td
(3667 #include "proc.h") 96.1073 Tj
0 -199.361 Td
(3668 #include "spinlock.h") 113.581 Tj
0 -208.854 Td
(3669 #include "buf.h") 91.7388 Tj
0 -218.347 Td
(3670 #include "fs.h") 87.3703 Tj
0 -227.841 Td
(3671 #include "fsvar.h") 100.476 Tj
0 -237.334 Td
(3672 #include "dev.h") 91.7388 Tj
0 -246.827 Td
(3673 ) 21.8426 Tj
0 -256.321 Td
(3674 #define min\(a, b\) \(\(a\) < \(b\) ? \(a\) : \(b\)\)) 200.952 Tj
0 -265.814 Td
(3675 static void itrunc\(struct inode*\);) 170.372 Tj
0 -275.307 Td
(3676 ) 21.8426 Tj
0 -284.801 Td
(3677 // Read the super block.) 126.687 Tj
0 -294.294 Td
(3678 static void) 69.8962 Tj
0 -303.788 Td
(3679 readsb\(int dev, struct superblock *sb\)) 187.846 Tj
0 -313.281 Td
(3680 {) 26.2111 Tj
0 -322.774 Td
(3681   struct buf *bp;) 96.1073 Tj
0 -332.268 Td
(3682 ) 21.8426 Tj
0 -341.761 Td
(3683   bp = bread\(dev, 1\);) 113.581 Tj
0 -351.254 Td
(3684   memmove\(sb, bp->data, sizeof\(*sb\)\);) 183.478 Tj
0 -360.748 Td
(3685   brelse\(bp\);) 78.6333 Tj
0 -370.241 Td
(3686 }) 26.2111 Tj
0 -379.734 Td
(3687 ) 21.8426 Tj
0 -389.228 Td
(3688 // Zero a block.) 91.7388 Tj
0 -398.721 Td
(3689 static void) 69.8962 Tj
0 -408.214 Td
(3690 bzero\(int dev, int bno\)) 122.318 Tj
0 -417.708 Td
(3691 {) 26.2111 Tj
0 -427.201 Td
(3692   struct buf *bp;) 96.1073 Tj
0 -436.695 Td
(3693 ) 21.8426 Tj
0 -446.188 Td
(3694   bp = bread\(dev, bno\);) 122.318 Tj
0 -455.681 Td
(3695   memset\(bp->data, 0, BSIZE\);) 148.529 Tj
0 -465.175 Td
(3696   bwrite\(bp\);) 78.6333 Tj
0 -474.668 Td
(3697   brelse\(bp\);) 78.6333 Tj
0 -484.161 Td
(3698 }) 26.2111 Tj
0 -493.655 Td
(3699 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.055 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.318 Tj
0 -113.92 Td
(3709 ) 21.8426 Tj
0 -123.414 Td
(3710   bp = 0;) 61.1592 Tj
0 -132.907 Td
(3711   readsb\(dev, &sb\);) 104.844 Tj
0 -142.4 Td
(3712   for\(b = 0; b < sb.size; b += BPB\){) 179.109 Tj
0 -151.894 Td
(3713     bp = bread\(dev, BBLOCK\(b, sb.ninodes\)\);) 209.689 Tj
0 -161.387 Td
(3714     for\(bi = 0; bi < BPB; bi++\){) 161.635 Tj
0 -170.88 Td
(3715       m = 1 << \(bi % 8\);) 126.687 Tj
0 -180.374 Td
(3716       if\(\(bp->data[bi/8] & m\) == 0\){  // Is block free\
?) 262.111 Tj
0 -189.867 Td
(3717         bp->data[bi/8] |= m;  // Mark block in use on disk\
.) 279.585 Tj
0 -199.361 Td
(3718         bwrite\(bp\);) 104.844 Tj
0 -208.854 Td
(3719         brelse\(bp\);) 104.844 Tj
0 -218.347 Td
(3720         return b + bi;) 117.95 Tj
0 -227.841 Td
(3721       }) 52.4222 Tj
0 -237.334 Td
(3722     }) 43.6851 Tj
0 -246.827 Td
(3723     brelse\(bp\);) 87.3703 Tj
0 -256.321 Td
(3724   }) 34.9481 Tj
0 -265.814 Td
(3725   panic\("balloc: out of blocks"\);) 166.004 Tj
0 -275.307 Td
(3726 }) 26.2111 Tj
0 -284.801 Td
(3727 ) 21.8426 Tj
0 -294.294 Td
(3728 // Free a disk block.) 113.581 Tj
0 -303.788 Td
(3729 static void) 69.8962 Tj
0 -313.281 Td
(3730 bfree\(int dev, uint b\)) 117.95 Tj
0 -322.774 Td
(3731 {) 26.2111 Tj
0 -332.268 Td
(3732   struct buf *bp;) 96.1073 Tj
0 -341.761 Td
(3733   struct superblock sb;) 122.318 Tj
0 -351.254 Td
(3734   int bi, m;) 74.2647 Tj
0 -360.748 Td
(3735 ) 21.8426 Tj
0 -370.241 Td
(3736   bzero\(dev, b\);) 91.7388 Tj
0 -379.734 Td
(3737 ) 21.8426 Tj
0 -389.228 Td
(3738   readsb\(dev, &sb\);) 104.844 Tj
0 -398.721 Td
(3739   bp = bread\(dev, BBLOCK\(b, sb.ninodes\)\);) 200.952 Tj
0 -408.214 Td
(3740   bi = b % BPB;) 87.3703 Tj
0 -417.708 Td
(3741   m = 1 << \(bi % 8\);) 109.213 Tj
0 -427.201 Td
(3742   if\(\(bp->data[bi/8] & m\) == 0\)) 157.267 Tj
0 -436.695 Td
(3743     panic\("freeing free block"\);) 161.635 Tj
0 -446.188 Td
(3744   bp->data[bi/8] &= ~m;  // Mark block free on disk.) 249.005 Tj
0 -455.681 Td
(3745   bwrite\(bp\);) 78.6333 Tj
0 -465.175 Td
(3746   brelse\(bp\);) 78.6333 Tj
0 -474.668 Td
(3747 }) 26.2111 Tj
0 -484.161 Td
(3748 ) 21.8426 Tj
0 -493.655 Td
(3749 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.848 Tj
0 -56.9602 Td
(3753 // The inode disk structure holds metadata \(the type, dev\
ice numbers,) 323.27 Tj
0 -66.4535 Td
(3754 // and data size\) along with a list of blocks where the a\
ssociated) 310.165 Tj
0 -75.9469 Td
(3755 // data can be found.) 113.581 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.216 Tj
0 -113.92 Td
(3759 // on-disk structures to provide a place for synchronizing\
 access) 305.796 Tj
0 -123.414 Td
(3760 // to inodes shared between multiple processes.) 227.163 Tj
0 -132.907 Td
(3761 //) 30.5796 Tj
0 -142.4 Td
(3762 // ip->ref counts the number of pointer references to this\
 cached) 305.796 Tj
0 -151.894 Td
(3763 // inode; references are typically kept in struct file and\
 in cp->cwd.) 327.639 Tj
0 -161.387 Td
(3764 // When ip->ref falls to zero, the inode is no longer cach\
ed.) 288.322 Tj
0 -170.88 Td
(3765 // It is an error to use an inode without holding a refere\
nce to it.) 318.902 Tj
0 -180.374 Td
(3766 //) 30.5796 Tj
0 -189.867 Td
(3767 // Processes are only allowed to read and write inode) 253.374 Tj
0 -199.361 Td
(3768 // metadata and contents when holding the inode's lock,) 262.111 Tj
0 -208.854 Td
(3769 // represented by the I_BUSY flag in the in-memory copy.) 266.479 Tj
0 -218.347 Td
(3770 // Because inode locks are held during disk accesses,) 253.374 Tj
0 -227.841 Td
(3771 // they are implemented using a flag rather than with) 253.374 Tj
0 -237.334 Td
(3772 // spin locks.  Callers are responsible for locking) 244.637 Tj
0 -246.827 Td
(3773 // inodes before passing them to routines in this file; le\
aving) 297.059 Tj
0 -256.321 Td
(3774 // this responsibility with the caller makes it possible f\
or them) 305.796 Tj
0 -265.814 Td
(3775 // to create arbitrarily-sized atomic operations.) 235.9 Tj
0 -275.307 Td
(3776 //) 30.5796 Tj
0 -284.801 Td
(3777 // To give maximum control over locking to the callers,) 262.111 Tj
0 -294.294 Td
(3778 // the routines in this file that return inode pointers) 262.111 Tj
0 -303.788 Td
(3779 // return pointers to *unlocked* inodes.  It is the caller\
s') 283.953 Tj
0 -313.281 Td
(3780 // responsibility to lock them before using them.  A non-z\
ero) 288.322 Tj
0 -322.774 Td
(3781 // ip->ref keeps these unlocked inodes in the cache.) 249.005 Tj
0 -332.268 Td
(3782 ) 21.8426 Tj
0 -341.761 Td
(3783 struct {) 56.7907 Tj
0 -351.254 Td
(3784   struct spinlock lock;) 122.318 Tj
0 -360.748 Td
(3785   struct inode inode[NINODE];) 148.529 Tj
0 -370.241 Td
(3786 } icache;) 61.1592 Tj
0 -379.734 Td
(3787 ) 21.8426 Tj
0 -389.228 Td
(3788 void) 39.3166 Tj
0 -398.721 Td
(3789 iinit\(void\)) 69.8962 Tj
0 -408.214 Td
(3790 {) 26.2111 Tj
0 -417.708 Td
(3791   initlock\(&icache.lock, "icache.lock"\);) 196.583 Tj
0 -427.201 Td
(3792 }) 26.2111 Tj
0 -436.695 Td
(3793 ) 21.8426 Tj
0 -446.188 Td
(3794 ) 21.8426 Tj
0 -455.681 Td
(3795 ) 21.8426 Tj
0 -465.175 Td
(3796 ) 21.8426 Tj
0 -474.668 Td
(3797 ) 21.8426 Tj
0 -484.161 Td
(3798 ) 21.8426 Tj
0 -493.655 Td
(3799 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fs.c  Page 4) 152.898 Tj
0 -28.4801 Td
(3800 // Find the inode with number inum on device dev) 231.531 Tj
0 -37.9735 Td
(3801 // and return the in-memory copy.) 166.004 Tj
0 -47.4668 Td
(3802 static struct inode*) 109.213 Tj
0 -56.9602 Td
(3803 iget\(uint dev, uint inum\)) 131.055 Tj
0 -66.4535 Td
(3804 {) 26.2111 Tj
0 -75.9469 Td
(3805   struct inode *ip, *empty;) 139.792 Tj
0 -85.4403 Td
(3806 ) 21.8426 Tj
0 -94.9336 Td
(3807   acquire\(&icache.lock\);) 126.687 Tj
0 -104.427 Td
(3808 ) 21.8426 Tj
0 -113.92 Td
(3809   // Try for cached inode.) 135.424 Tj
0 -123.414 Td
(3810   empty = 0;) 74.2647 Tj
0 -132.907 Td
(3811   for\(ip = &icache.inode[0]; ip < &icache.inode[NINODE]; \
ip++\){) 297.059 Tj
0 -142.4 Td
(3812     if\(ip->ref > 0 && ip->dev == dev && ip->inum == inum\)\
{) 275.216 Tj
0 -151.894 Td
(3813       ip->ref++;) 91.7388 Tj
0 -161.387 Td
(3814       release\(&icache.lock\);) 144.161 Tj
0 -170.88 Td
(3815       return ip;) 91.7388 Tj
0 -180.374 Td
(3816     }) 43.6851 Tj
0 -189.867 Td
(3817     if\(empty == 0 && ip->ref == 0\)    // Remember empty \
slot.) 288.322 Tj
0 -199.361 Td
(3818       empty = ip;) 96.1073 Tj
0 -208.854 Td
(3819   }) 34.9481 Tj
0 -218.347 Td
(3820 ) 21.8426 Tj
0 -227.841 Td
(3821   // Allocate fresh inode.) 135.424 Tj
0 -237.334 Td
(3822   if\(empty == 0\)) 91.7388 Tj
0 -246.827 Td
(3823     panic\("iget: no inodes"\);) 148.529 Tj
0 -256.321 Td
(3824 ) 21.8426 Tj
0 -265.814 Td
(3825   ip = empty;) 78.6333 Tj
0 -275.307 Td
(3826   ip->dev = dev;) 91.7388 Tj
0 -284.801 Td
(3827   ip->inum = inum;) 100.476 Tj
0 -294.294 Td
(3828   ip->ref = 1;) 83.0018 Tj
0 -303.788 Td
(3829   ip->flags = 0;) 91.7388 Tj
0 -313.281 Td
(3830   release\(&icache.lock\);) 126.687 Tj
0 -322.774 Td
(3831 ) 21.8426 Tj
0 -332.268 Td
(3832   return ip;) 74.2647 Tj
0 -341.761 Td
(3833 }) 26.2111 Tj
0 -351.254 Td
(3834 ) 21.8426 Tj
0 -360.748 Td
(3835 // Increment reference count for ip.) 179.109 Tj
0 -370.241 Td
(3836 // Returns ip to enable ip = idup\(ip1\) idiom.) 218.426 Tj
0 -379.734 Td
(3837 struct inode*) 78.6333 Tj
0 -389.228 Td
(3838 idup\(struct inode *ip\)) 117.95 Tj
0 -398.721 Td
(3839 {) 26.2111 Tj
0 -408.214 Td
(3840   acquire\(&icache.lock\);) 126.687 Tj
0 -417.708 Td
(3841   ip->ref++;) 74.2647 Tj
0 -427.201 Td
(3842   release\(&icache.lock\);) 126.687 Tj
0 -436.695 Td
(3843   return ip;) 74.2647 Tj
0 -446.188 Td
(3844 }) 26.2111 Tj
0 -455.681 Td
(3845 ) 21.8426 Tj
0 -465.175 Td
(3846 ) 21.8426 Tj
0 -474.668 Td
(3847 ) 21.8426 Tj
0 -484.161 Td
(3848 ) 21.8426 Tj
0 -493.655 Td
(3849 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fs.c  Page 5) 152.898 Tj
0 -28.4801 Td
(3850 // Lock the given inode.) 126.687 Tj
0 -37.9735 Td
(3851 void) 39.3166 Tj
0 -47.4668 Td
(3852 ilock\(struct inode *ip\)) 122.318 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.581 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.844 Tj
0 -113.92 Td
(3859 ) 21.8426 Tj
0 -123.414 Td
(3860   acquire\(&icache.lock\);) 126.687 Tj
0 -132.907 Td
(3861   while\(ip->flags & I_BUSY\)) 139.792 Tj
0 -142.4 Td
(3862     sleep\(ip, &icache.lock\);) 144.161 Tj
0 -151.894 Td
(3863   ip->flags |= I_BUSY;) 117.95 Tj
0 -161.387 Td
(3864   release\(&icache.lock\);) 126.687 Tj
0 -170.88 Td
(3865 ) 21.8426 Tj
0 -180.374 Td
(3866   if\(!\(ip->flags & I_VALID\)\){) 148.529 Tj
0 -189.867 Td
(3867     bp = bread\(ip->dev, IBLOCK\(ip->inum\)\);) 205.32 Tj
0 -199.361 Td
(3868     dip = \(struct dinode*\)bp->data + ip->inum%IPB;) 240.268 Tj
0 -208.854 Td
(3869     ip->type = dip->type;) 131.055 Tj
0 -218.347 Td
(3870     ip->major = dip->major;) 139.792 Tj
0 -227.841 Td
(3871     ip->minor = dip->minor;) 139.792 Tj
0 -237.334 Td
(3872     ip->nlink = dip->nlink;) 139.792 Tj
0 -246.827 Td
(3873     ip->size = dip->size;) 131.055 Tj
0 -256.321 Td
(3874     memmove\(ip->addrs, dip->addrs, sizeof\(ip->addrs\)\);) 257.742 Tj
0 -265.814 Td
(3875     brelse\(bp\);) 87.3703 Tj
0 -275.307 Td
(3876     ip->flags |= I_VALID;) 131.055 Tj
0 -284.801 Td
(3877     if\(ip->type == 0\)) 113.581 Tj
0 -294.294 Td
(3878       panic\("ilock: no type"\);) 152.898 Tj
0 -303.788 Td
(3879   }) 34.9481 Tj
0 -313.281 Td
(3880 }) 26.2111 Tj
0 -322.774 Td
(3881 ) 21.8426 Tj
0 -332.268 Td
(3882 // Unlock the given inode.) 135.424 Tj
0 -341.761 Td
(3883 void) 39.3166 Tj
0 -351.254 Td
(3884 iunlock\(struct inode *ip\)) 131.055 Tj
0 -360.748 Td
(3885 {) 26.2111 Tj
0 -370.241 Td
(3886   if\(ip == 0 || !\(ip->flags & I_BUSY\) || ip->ref < 1\)) 253.374 Tj
0 -379.734 Td
(3887     panic\("iunlock"\);) 113.581 Tj
0 -389.228 Td
(3888 ) 21.8426 Tj
0 -398.721 Td
(3889   acquire\(&icache.lock\);) 126.687 Tj
0 -408.214 Td
(3890   ip->flags &= ~I_BUSY;) 122.318 Tj
0 -417.708 Td
(3891   wakeup\(ip\);) 78.6333 Tj
0 -427.201 Td
(3892   release\(&icache.lock\);) 126.687 Tj
0 -436.695 Td
(3893 }) 26.2111 Tj
0 -446.188 Td
(3894 ) 21.8426 Tj
0 -455.681 Td
(3895 ) 21.8426 Tj
0 -465.175 Td
(3896 ) 21.8426 Tj
0 -474.668 Td
(3897 ) 21.8426 Tj
0 -484.161 Td
(3898 ) 21.8426 Tj
0 -493.655 Td
(3899 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fs.c  Page 6) 152.898 Tj
0 -28.4801 Td
(3900 // Caller holds reference to unlocked ip.  Drop reference.) 275.216 Tj
0 -37.9735 Td
(3901 void) 39.3166 Tj
0 -47.4668 Td
(3902 iput\(struct inode *ip\)) 117.95 Tj
0 -56.9602 Td
(3903 {) 26.2111 Tj
0 -66.4535 Td
(3904   acquire\(&icache.lock\);) 126.687 Tj
0 -75.9469 Td
(3905   if\(ip->ref == 1 && \(ip->flags & I_VALID\) && ip->nlink\
 == 0\){) 292.69 Tj
0 -85.4403 Td
(3906     // inode is no longer used: truncate and free inode.) 266.479 Tj
0 -94.9336 Td
(3907     if\(ip->flags & I_BUSY\)) 135.424 Tj
0 -104.427 Td
(3908       panic\("iput busy"\);) 131.055 Tj
0 -113.92 Td
(3909     ip->flags |= I_BUSY;) 126.687 Tj
0 -123.414 Td
(3910     release\(&icache.lock\);) 135.424 Tj
0 -132.907 Td
(3911     itrunc\(ip\);) 87.3703 Tj
0 -142.4 Td
(3912     ip->type = 0;) 96.1073 Tj
0 -151.894 Td
(3913     iupdate\(ip\);) 91.7388 Tj
0 -161.387 Td
(3914     acquire\(&icache.lock\);) 135.424 Tj
0 -170.88 Td
(3915     ip->flags &= ~I_BUSY;) 131.055 Tj
0 -180.374 Td
(3916     wakeup\(ip\);) 87.3703 Tj
0 -189.867 Td
(3917   }) 34.9481 Tj
0 -199.361 Td
(3918   ip->ref--;) 74.2647 Tj
0 -208.854 Td
(3919   release\(&icache.lock\);) 126.687 Tj
0 -218.347 Td
(3920 }) 26.2111 Tj
0 -227.841 Td
(3921 ) 21.8426 Tj
0 -237.334 Td
(3922 // Common idiom: unlock, then put.) 170.372 Tj
0 -246.827 Td
(3923 void) 39.3166 Tj
0 -256.321 Td
(3924 iunlockput\(struct inode *ip\)) 144.161 Tj
0 -265.814 Td
(3925 {) 26.2111 Tj
0 -275.307 Td
(3926   iunlock\(ip\);) 83.0018 Tj
0 -284.801 Td
(3927   iput\(ip\);) 69.8962 Tj
0 -294.294 Td
(3928 }) 26.2111 Tj
0 -303.788 Td
(3929 ) 21.8426 Tj
0 -313.281 Td
(3930 ) 21.8426 Tj
0 -322.774 Td
(3931 ) 21.8426 Tj
0 -332.268 Td
(3932 ) 21.8426 Tj
0 -341.761 Td
(3933 ) 21.8426 Tj
0 -351.254 Td
(3934 ) 21.8426 Tj
0 -360.748 Td
(3935 ) 21.8426 Tj
0 -370.241 Td
(3936 ) 21.8426 Tj
0 -379.734 Td
(3937 ) 21.8426 Tj
0 -389.228 Td
(3938 ) 21.8426 Tj
0 -398.721 Td
(3939 ) 21.8426 Tj
0 -408.214 Td
(3940 ) 21.8426 Tj
0 -417.708 Td
(3941 ) 21.8426 Tj
0 -427.201 Td
(3942 ) 21.8426 Tj
0 -436.695 Td
(3943 ) 21.8426 Tj
0 -446.188 Td
(3944 ) 21.8426 Tj
0 -455.681 Td
(3945 ) 21.8426 Tj
0 -465.175 Td
(3946 ) 21.8426 Tj
0 -474.668 Td
(3947 ) 21.8426 Tj
0 -484.161 Td
(3948 ) 21.8426 Tj
0 -493.655 Td
(3949 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.216 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.581 Tj
0 -94.9336 Td
(3957   struct superblock sb;) 122.318 Tj
0 -104.427 Td
(3958 ) 21.8426 Tj
0 -113.92 Td
(3959   readsb\(dev, &sb\);) 104.844 Tj
0 -123.414 Td
(3960   for\(inum = 1; inum < sb.ninodes; inum++\){  // loop ove\
r inode blocks) 327.639 Tj
0 -132.907 Td
(3961     bp = bread\(dev, IBLOCK\(inum\)\);) 170.372 Tj
0 -142.4 Td
(3962     dip = \(struct dinode*\)bp->data + inum%IPB;) 222.794 Tj
0 -151.894 Td
(3963     if\(dip->type == 0\){  // a free inode) 196.583 Tj
0 -161.387 Td
(3964       memset\(dip, 0, sizeof\(*dip\)\);) 174.741 Tj
0 -170.88 Td
(3965       dip->type = type;) 122.318 Tj
0 -180.374 Td
(3966       bwrite\(bp\);   // mark it allocated on the disk) 249.005 Tj
0 -189.867 Td
(3967       brelse\(bp\);) 96.1073 Tj
0 -199.361 Td
(3968       return iget\(dev, inum\);) 148.529 Tj
0 -208.854 Td
(3969     }) 43.6851 Tj
0 -218.347 Td
(3970     brelse\(bp\);) 87.3703 Tj
0 -227.841 Td
(3971   }) 34.9481 Tj
0 -237.334 Td
(3972   panic\("ialloc: no inodes"\);) 148.529 Tj
0 -246.827 Td
(3973 }) 26.2111 Tj
0 -256.321 Td
(3974 ) 21.8426 Tj
0 -265.814 Td
(3975 // Copy inode, which has changed, from memory to disk.) 257.742 Tj
0 -275.307 Td
(3976 void) 39.3166 Tj
0 -284.801 Td
(3977 iupdate\(struct inode *ip\)) 131.055 Tj
0 -294.294 Td
(3978 {) 26.2111 Tj
0 -303.788 Td
(3979   struct buf *bp;) 96.1073 Tj
0 -313.281 Td
(3980   struct dinode *dip;) 113.581 Tj
0 -322.774 Td
(3981 ) 21.8426 Tj
0 -332.268 Td
(3982   bp = bread\(ip->dev, IBLOCK\(ip->inum\)\);) 196.583 Tj
0 -341.761 Td
(3983   dip = \(struct dinode*\)bp->data + ip->inum%IPB;) 231.531 Tj
0 -351.254 Td
(3984   dip->type = ip->type;) 122.318 Tj
0 -360.748 Td
(3985   dip->major = ip->major;) 131.055 Tj
0 -370.241 Td
(3986   dip->minor = ip->minor;) 131.055 Tj
0 -379.734 Td
(3987   dip->nlink = ip->nlink;) 131.055 Tj
0 -389.228 Td
(3988   dip->size = ip->size;) 122.318 Tj
0 -398.721 Td
(3989   memmove\(dip->addrs, ip->addrs, sizeof\(ip->addrs\)\);) 249.005 Tj
0 -408.214 Td
(3990   bwrite\(bp\);) 78.6333 Tj
0 -417.708 Td
(3991   brelse\(bp\);) 78.6333 Tj
0 -427.201 Td
(3992 }) 26.2111 Tj
0 -436.695 Td
(3993 ) 21.8426 Tj
0 -446.188 Td
(3994 ) 21.8426 Tj
0 -455.681 Td
(3995 ) 21.8426 Tj
0 -465.175 Td
(3996 ) 21.8426 Tj
0 -474.668 Td
(3997 ) 21.8426 Tj
0 -484.161 Td
(3998 ) 21.8426 Tj
0 -493.655 Td
(3999 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.585 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.953 Tj
0 -75.9469 Td
(4005 // listed in the block ip->addrs[INDIRECT].) 209.689 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.69 Tj
0 -104.427 Td
(4008 // If there is no such block, alloc controls whether one i\
s allocated.) 327.639 Tj
0 -113.92 Td
(4009 static uint) 69.8962 Tj
0 -123.414 Td
(4010 bmap\(struct inode *ip, uint bn, int alloc\)) 205.32 Tj
0 -132.907 Td
(4011 {) 26.2111 Tj
0 -142.4 Td
(4012   uint addr, *a;) 91.7388 Tj
0 -151.894 Td
(4013   struct buf *bp;) 96.1073 Tj
0 -161.387 Td
(4014 ) 21.8426 Tj
0 -170.88 Td
(4015   if\(bn < NDIRECT\){) 104.844 Tj
0 -180.374 Td
(4016     if\(\(addr = ip->addrs[bn]\) == 0\){) 179.109 Tj
0 -189.867 Td
(4017       if\(!alloc\)) 91.7388 Tj
0 -199.361 Td
(4018         return -1;) 100.476 Tj
0 -208.854 Td
(4019       ip->addrs[bn] = addr = balloc\(ip->dev\);) 218.426 Tj
0 -218.347 Td
(4020     }) 43.6851 Tj
0 -227.841 Td
(4021     return addr;) 91.7388 Tj
0 -237.334 Td
(4022   }) 34.9481 Tj
0 -246.827 Td
(4023   bn -= NDIRECT;) 91.7388 Tj
0 -256.321 Td
(4024 ) 21.8426 Tj
0 -265.814 Td
(4025   if\(bn < NINDIRECT\){) 113.581 Tj
0 -275.307 Td
(4026     // Load indirect block, allocating if necessary.) 249.005 Tj
0 -284.801 Td
(4027     if\(\(addr = ip->addrs[INDIRECT]\) == 0\){) 205.32 Tj
0 -294.294 Td
(4028       if\(!alloc\)) 91.7388 Tj
0 -303.788 Td
(4029         return -1;) 100.476 Tj
0 -313.281 Td
(4030       ip->addrs[INDIRECT] = addr = balloc\(ip->dev\);) 244.637 Tj
0 -322.774 Td
(4031     }) 43.6851 Tj
0 -332.268 Td
(4032     bp = bread\(ip->dev, addr\);) 152.898 Tj
0 -341.761 Td
(4033     a = \(uint*\)bp->data;) 126.687 Tj
0 -351.254 Td
(4034 ) 21.8426 Tj
0 -360.748 Td
(4035     if\(\(addr = a[bn]\) == 0\){) 144.161 Tj
0 -370.241 Td
(4036       if\(!alloc\){) 96.1073 Tj
0 -379.734 Td
(4037         brelse\(bp\);) 104.844 Tj
0 -389.228 Td
(4038         return -1;) 100.476 Tj
0 -398.721 Td
(4039       }) 52.4222 Tj
0 -408.214 Td
(4040       a[bn] = addr = balloc\(ip->dev\);) 183.478 Tj
0 -417.708 Td
(4041       bwrite\(bp\);) 96.1073 Tj
0 -427.201 Td
(4042     }) 43.6851 Tj
0 -436.695 Td
(4043     brelse\(bp\);) 87.3703 Tj
0 -446.188 Td
(4044     return addr;) 91.7388 Tj
0 -455.681 Td
(4045   }) 34.9481 Tj
0 -465.175 Td
(4046 ) 21.8426 Tj
0 -474.668 Td
(4047   panic\("bmap: out of range"\);) 152.898 Tj
0 -484.161 Td
(4048 }) 26.2111 Tj
0 -493.655 Td
(4049 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fs.c  Page 9) 152.898 Tj
0 -28.4801 Td
(4050 // Truncate inode \(discard contents\).) 183.478 Tj
0 -37.9735 Td
(4051 static void) 69.8962 Tj
0 -47.4668 Td
(4052 itrunc\(struct inode *ip\)) 126.687 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.267 Tj
0 -113.92 Td
(4059     if\(ip->addrs[i]\){) 113.581 Tj
0 -123.414 Td
(4060       bfree\(ip->dev, ip->addrs[i]\);) 174.741 Tj
0 -132.907 Td
(4061       ip->addrs[i] = 0;) 122.318 Tj
0 -142.4 Td
(4062     }) 43.6851 Tj
0 -151.894 Td
(4063   }) 34.9481 Tj
0 -161.387 Td
(4064 ) 21.8426 Tj
0 -170.88 Td
(4065   if\(ip->addrs[INDIRECT]\){) 135.424 Tj
0 -180.374 Td
(4066     bp = bread\(ip->dev, ip->addrs[INDIRECT]\);) 218.426 Tj
0 -189.867 Td
(4067     a = \(uint*\)bp->data;) 126.687 Tj
0 -199.361 Td
(4068     for\(j = 0; j < NINDIRECT; j++\){) 174.741 Tj
0 -208.854 Td
(4069       if\(a[j]\)) 83.0018 Tj
0 -218.347 Td
(4070         bfree\(ip->dev, a[j]\);) 148.529 Tj
0 -227.841 Td
(4071     }) 43.6851 Tj
0 -237.334 Td
(4072     brelse\(bp\);) 87.3703 Tj
0 -246.827 Td
(4073     ip->addrs[INDIRECT] = 0;) 144.161 Tj
0 -256.321 Td
(4074   }) 34.9481 Tj
0 -265.814 Td
(4075 ) 21.8426 Tj
0 -275.307 Td
(4076   ip->size = 0;) 87.3703 Tj
0 -284.801 Td
(4077   iupdate\(ip\);) 83.0018 Tj
0 -294.294 Td
(4078 }) 26.2111 Tj
0 -303.788 Td
(4079 ) 21.8426 Tj
0 -313.281 Td
(4080 // Copy stat information from inode.) 179.109 Tj
0 -322.774 Td
(4081 void) 39.3166 Tj
0 -332.268 Td
(4082 stati\(struct inode *ip, struct stat *st\)) 196.583 Tj
0 -341.761 Td
(4083 {) 26.2111 Tj
0 -351.254 Td
(4084   st->dev = ip->dev;) 109.213 Tj
0 -360.748 Td
(4085   st->ino = ip->inum;) 113.581 Tj
0 -370.241 Td
(4086   st->type = ip->type;) 117.95 Tj
0 -379.734 Td
(4087   st->nlink = ip->nlink;) 126.687 Tj
0 -389.228 Td
(4088   st->size = ip->size;) 117.95 Tj
0 -398.721 Td
(4089 }) 26.2111 Tj
0 -408.214 Td
(4090 ) 21.8426 Tj
0 -417.708 Td
(4091 ) 21.8426 Tj
0 -427.201 Td
(4092 ) 21.8426 Tj
0 -436.695 Td
(4093 ) 21.8426 Tj
0 -446.188 Td
(4094 ) 21.8426 Tj
0 -455.681 Td
(4095 ) 21.8426 Tj
0 -465.175 Td
(4096 ) 21.8426 Tj
0 -474.668 Td
(4097 ) 21.8426 Tj
0 -484.161 Td
(4098 ) 21.8426 Tj
0 -493.655 Td
(4099 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fs.c  Page 10) 157.267 Tj
0 -28.4801 Td
(4100 // Read data from inode.) 126.687 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.005 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.687 Tj
0 -104.427 Td
(4108     if\(ip->major < 0 || ip->major >= NDEV || !devsw[ip->m\
ajor].read\)) 318.902 Tj
0 -113.92 Td
(4109       return -1;) 91.7388 Tj
0 -123.414 Td
(4110     return devsw[ip->major].read\(ip, dst, n\);) 218.426 Tj
0 -132.907 Td
(4111   }) 34.9481 Tj
0 -142.4 Td
(4112 ) 21.8426 Tj
0 -151.894 Td
(4113   if\(off > ip->size || off + n < off\)) 183.478 Tj
0 -161.387 Td
(4114     return -1;) 83.0018 Tj
0 -170.88 Td
(4115   if\(off + n > ip->size\)) 126.687 Tj
0 -180.374 Td
(4116     n = ip->size - off;) 122.318 Tj
0 -189.867 Td
(4117 ) 21.8426 Tj
0 -199.361 Td
(4118   for\(tot=0; tot<n; tot+=m, off+=m, dst+=m\){) 214.057 Tj
0 -208.854 Td
(4119     bp = bread\(ip->dev, bmap\(ip, off/BSIZE, 0\)\);) 231.531 Tj
0 -218.347 Td
(4120     m = min\(n - tot, BSIZE - off%BSIZE\);) 196.583 Tj
0 -227.841 Td
(4121     memmove\(dst, bp->data + off%BSIZE, m\);) 205.32 Tj
0 -237.334 Td
(4122     brelse\(bp\);) 87.3703 Tj
0 -246.827 Td
(4123   }) 34.9481 Tj
0 -256.321 Td
(4124   return n;) 69.8962 Tj
0 -265.814 Td
(4125 }) 26.2111 Tj
0 -275.307 Td
(4126 ) 21.8426 Tj
0 -284.801 Td
(4127 ) 21.8426 Tj
0 -294.294 Td
(4128 ) 21.8426 Tj
0 -303.788 Td
(4129 ) 21.8426 Tj
0 -313.281 Td
(4130 ) 21.8426 Tj
0 -322.774 Td
(4131 ) 21.8426 Tj
0 -332.268 Td
(4132 ) 21.8426 Tj
0 -341.761 Td
(4133 ) 21.8426 Tj
0 -351.254 Td
(4134 ) 21.8426 Tj
0 -360.748 Td
(4135 ) 21.8426 Tj
0 -370.241 Td
(4136 ) 21.8426 Tj
0 -379.734 Td
(4137 ) 21.8426 Tj
0 -389.228 Td
(4138 ) 21.8426 Tj
0 -398.721 Td
(4139 ) 21.8426 Tj
0 -408.214 Td
(4140 ) 21.8426 Tj
0 -417.708 Td
(4141 ) 21.8426 Tj
0 -427.201 Td
(4142 ) 21.8426 Tj
0 -436.695 Td
(4143 ) 21.8426 Tj
0 -446.188 Td
(4144 ) 21.8426 Tj
0 -455.681 Td
(4145 ) 21.8426 Tj
0 -465.175 Td
(4146 ) 21.8426 Tj
0 -474.668 Td
(4147 ) 21.8426 Tj
0 -484.161 Td
(4148 ) 21.8426 Tj
0 -493.655 Td
(4149 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fs.c  Page 11) 157.267 Tj
0 -28.4801 Td
(4150 // Write data to inode.) 122.318 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.374 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.687 Tj
0 -104.427 Td
(4158     if\(ip->major < 0 || ip->major >= NDEV || !devsw[ip->m\
ajor].write\)) 323.27 Tj
0 -113.92 Td
(4159       return -1;) 91.7388 Tj
0 -123.414 Td
(4160     return devsw[ip->major].write\(ip, src, n\);) 222.794 Tj
0 -132.907 Td
(4161   }) 34.9481 Tj
0 -142.4 Td
(4162 ) 21.8426 Tj
0 -151.894 Td
(4163   if\(off + n < off\)) 104.844 Tj
0 -161.387 Td
(4164     return -1;) 83.0018 Tj
0 -170.88 Td
(4165   if\(off + n > MAXFILE*BSIZE\)) 148.529 Tj
0 -180.374 Td
(4166     n = MAXFILE*BSIZE - off;) 144.161 Tj
0 -189.867 Td
(4167 ) 21.8426 Tj
0 -199.361 Td
(4168   for\(tot=0; tot<n; tot+=m, off+=m, src+=m\){) 214.057 Tj
0 -208.854 Td
(4169     bp = bread\(ip->dev, bmap\(ip, off/BSIZE, 1\)\);) 231.531 Tj
0 -218.347 Td
(4170     m = min\(n - tot, BSIZE - off%BSIZE\);) 196.583 Tj
0 -227.841 Td
(4171     memmove\(bp->data + off%BSIZE, src, m\);) 205.32 Tj
0 -237.334 Td
(4172     bwrite\(bp\);) 87.3703 Tj
0 -246.827 Td
(4173     brelse\(bp\);) 87.3703 Tj
0 -256.321 Td
(4174   }) 34.9481 Tj
0 -265.814 Td
(4175 ) 21.8426 Tj
0 -275.307 Td
(4176   if\(n > 0 && off > ip->size\){) 152.898 Tj
0 -284.801 Td
(4177     ip->size = off;) 104.844 Tj
0 -294.294 Td
(4178     iupdate\(ip\);) 91.7388 Tj
0 -303.788 Td
(4179   }) 34.9481 Tj
0 -313.281 Td
(4180   return n;) 69.8962 Tj
0 -322.774 Td
(4181 }) 26.2111 Tj
0 -332.268 Td
(4182 ) 21.8426 Tj
0 -341.761 Td
(4183 ) 21.8426 Tj
0 -351.254 Td
(4184 ) 21.8426 Tj
0 -360.748 Td
(4185 ) 21.8426 Tj
0 -370.241 Td
(4186 ) 21.8426 Tj
0 -379.734 Td
(4187 ) 21.8426 Tj
0 -389.228 Td
(4188 ) 21.8426 Tj
0 -398.721 Td
(4189 ) 21.8426 Tj
0 -408.214 Td
(4190 ) 21.8426 Tj
0 -417.708 Td
(4191 ) 21.8426 Tj
0 -427.201 Td
(4192 ) 21.8426 Tj
0 -436.695 Td
(4193 ) 21.8426 Tj
0 -446.188 Td
(4194 ) 21.8426 Tj
0 -455.681 Td
(4195 ) 21.8426 Tj
0 -465.175 Td
(4196 ) 21.8426 Tj
0 -474.668 Td
(4197 ) 21.8426 Tj
0 -484.161 Td
(4198 ) 21.8426 Tj
0 -493.655 Td
(4199 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fs.c  Page 12) 157.267 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.478 Tj
0 -66.4535 Td
(4204 {) 26.2111 Tj
0 -75.9469 Td
(4205   return strncmp\(s, t, DIRSIZ\);) 157.267 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.426 Tj
0 -113.92 Td
(4209 // If found, set *poff to byte offset of entry.) 227.163 Tj
0 -123.414 Td
(4210 // Caller must have already locked dp.) 187.846 Tj
0 -132.907 Td
(4211 struct inode*) 78.6333 Tj
0 -142.4 Td
(4212 dirlookup\(struct inode *dp, char *name, uint *poff\)) 244.637 Tj
0 -151.894 Td
(4213 {) 26.2111 Tj
0 -161.387 Td
(4214   uint off, inum;) 96.1073 Tj
0 -170.88 Td
(4215   struct buf *bp;) 96.1073 Tj
0 -180.374 Td
(4216   struct dirent *de;) 109.213 Tj
0 -189.867 Td
(4217 ) 21.8426 Tj
0 -199.361 Td
(4218   if\(dp->type != T_DIR\)) 122.318 Tj
0 -208.854 Td
(4219     panic\("dirlookup not DIR"\);) 157.267 Tj
0 -218.347 Td
(4220 ) 21.8426 Tj
0 -227.841 Td
(4221   for\(off = 0; off < dp->size; off += BSIZE\){) 218.426 Tj
0 -237.334 Td
(4222     bp = bread\(dp->dev, bmap\(dp, off / BSIZE, 0\)\);) 240.268 Tj
0 -246.827 Td
(4223     for\(de = \(struct dirent*\)bp->data;) 187.846 Tj
0 -256.321 Td
(4224         de < \(struct dirent*\)\(bp->data + BSIZE\);) 231.531 Tj
0 -265.814 Td
(4225         de++\){) 83.0018 Tj
0 -275.307 Td
(4226       if\(de->inum == 0\)) 122.318 Tj
0 -284.801 Td
(4227         continue;) 96.1073 Tj
0 -294.294 Td
(4228       if\(namecmp\(name, de->name\) == 0\){) 192.215 Tj
0 -303.788 Td
(4229         // entry matches path element) 183.478 Tj
0 -313.281 Td
(4230         if\(poff\)) 91.7388 Tj
0 -322.774 Td
(4231           *poff = off + \(uchar*\)de - bp->data;) 222.794 Tj
0 -332.268 Td
(4232         inum = de->inum;) 126.687 Tj
0 -341.761 Td
(4233         brelse\(bp\);) 104.844 Tj
0 -351.254 Td
(4234         return iget\(dp->dev, inum\);) 174.741 Tj
0 -360.748 Td
(4235       }) 52.4222 Tj
0 -370.241 Td
(4236     }) 43.6851 Tj
0 -379.734 Td
(4237     brelse\(bp\);) 87.3703 Tj
0 -389.228 Td
(4238   }) 34.9481 Tj
0 -398.721 Td
(4239   return 0;) 69.8962 Tj
0 -408.214 Td
(4240 }) 26.2111 Tj
0 -417.708 Td
(4241 ) 21.8426 Tj
0 -427.201 Td
(4242 ) 21.8426 Tj
0 -436.695 Td
(4243 ) 21.8426 Tj
0 -446.188 Td
(4244 ) 21.8426 Tj
0 -455.681 Td
(4245 ) 21.8426 Tj
0 -465.175 Td
(4246 ) 21.8426 Tj
0 -474.668 Td
(4247 ) 21.8426 Tj
0 -484.161 Td
(4248 ) 21.8426 Tj
0 -493.655 Td
(4249 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fs.c  Page 13) 157.267 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.163 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.844 Tj
0 -85.4403 Td
(4256   struct inode *ip;) 104.844 Tj
0 -94.9336 Td
(4257 ) 21.8426 Tj
0 -104.427 Td
(4258   // Check that name is not present.) 179.109 Tj
0 -113.92 Td
(4259   if\(\(ip = dirlookup\(dp, name, 0\)\) != 0\){) 200.952 Tj
0 -123.414 Td
(4260     iput\(ip\);) 78.6333 Tj
0 -132.907 Td
(4261     return -1;) 83.0018 Tj
0 -142.4 Td
(4262   }) 34.9481 Tj
0 -151.894 Td
(4263 ) 21.8426 Tj
0 -161.387 Td
(4264   // Look for an empty dirent.) 152.898 Tj
0 -170.88 Td
(4265   for\(off = 0; off < dp->size; off += sizeof\(de\)\){) 240.268 Tj
0 -180.374 Td
(4266     if\(readi\(dp, \(char*\)&de, off, sizeof\(de\)\) != si\
zeof\(de\)\)) 283.953 Tj
0 -189.867 Td
(4267       panic\("dirlink read"\);) 144.161 Tj
0 -199.361 Td
(4268     if\(de.inum == 0\)) 109.213 Tj
0 -208.854 Td
(4269       break;) 74.2647 Tj
0 -218.347 Td
(4270   }) 34.9481 Tj
0 -227.841 Td
(4271 ) 21.8426 Tj
0 -237.334 Td
(4272   strncpy\(de.name, name, DIRSIZ\);) 166.004 Tj
0 -246.827 Td
(4273   de.inum = ino;) 91.7388 Tj
0 -256.321 Td
(4274   if\(writei\(dp, \(char*\)&de, off, sizeof\(de\)\) != siz\
eof\(de\)\)) 279.585 Tj
0 -265.814 Td
(4275     panic\("dirlink"\);) 113.581 Tj
0 -275.307 Td
(4276 ) 21.8426 Tj
0 -284.801 Td
(4277   return 0;) 69.8962 Tj
0 -294.294 Td
(4278 }) 26.2111 Tj
0 -303.788 Td
(4279 ) 21.8426 Tj
0 -313.281 Td
(4280 ) 21.8426 Tj
0 -322.774 Td
(4281 ) 21.8426 Tj
0 -332.268 Td
(4282 ) 21.8426 Tj
0 -341.761 Td
(4283 ) 21.8426 Tj
0 -351.254 Td
(4284 ) 21.8426 Tj
0 -360.748 Td
(4285 ) 21.8426 Tj
0 -370.241 Td
(4286 ) 21.8426 Tj
0 -379.734 Td
(4287 ) 21.8426 Tj
0 -389.228 Td
(4288 ) 21.8426 Tj
0 -398.721 Td
(4289 ) 21.8426 Tj
0 -408.214 Td
(4290 ) 21.8426 Tj
0 -417.708 Td
(4291 ) 21.8426 Tj
0 -427.201 Td
(4292 ) 21.8426 Tj
0 -436.695 Td
(4293 ) 21.8426 Tj
0 -446.188 Td
(4294 ) 21.8426 Tj
0 -455.681 Td
(4295 ) 21.8426 Tj
0 -465.175 Td
(4296 ) 21.8426 Tj
0 -474.668 Td
(4297 ) 21.8426 Tj
0 -484.161 Td
(4298 ) 21.8426 Tj
0 -493.655 Td
(4299 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fs.c  Page 14) 157.267 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.268 Tj
0 -56.9602 Td
(4303 // Return a pointer to the element following the copied on\
e.) 283.953 Tj
0 -66.4535 Td
(4304 // The returned path has no leading slashes,) 214.057 Tj
0 -75.9469 Td
(4305 // so the caller can check *path=='\\0' to see if the name\
 is the last one.) 345.113 Tj
0 -85.4403 Td
(4306 // If no name to remove, return 0.) 170.372 Tj
0 -94.9336 Td
(4307 //) 30.5796 Tj
0 -104.427 Td
(4308 // Examples:) 74.2647 Tj
0 -113.92 Td
(4309 //   skipelem\("a/bb/c", name\) = "bb/c", setting name = "\
a") 275.216 Tj
0 -123.414 Td
(4310 //   skipelem\("///a//bb", name\) = "bb", setting name = "\
a") 275.216 Tj
0 -132.907 Td
(4311 //   skipelem\("", name\) = skipelem\("////", name\) = 0) 249.005 Tj
0 -142.4 Td
(4312 //) 30.5796 Tj
0 -151.894 Td
(4313 static char*) 74.2647 Tj
0 -161.387 Td
(4314 skipelem\(char *path, char *name\)) 161.635 Tj
0 -170.88 Td
(4315 {) 26.2111 Tj
0 -180.374 Td
(4316   char *s;) 65.5277 Tj
0 -189.867 Td
(4317   int len;) 65.5277 Tj
0 -199.361 Td
(4318 ) 21.8426 Tj
0 -208.854 Td
(4319   while\(*path == '/'\)) 113.581 Tj
0 -218.347 Td
(4320     path++;) 69.8962 Tj
0 -227.841 Td
(4321   if\(*path == 0\)) 91.7388 Tj
0 -237.334 Td
(4322     return 0;) 78.6333 Tj
0 -246.827 Td
(4323   s = path;) 69.8962 Tj
0 -256.321 Td
(4324   while\(*path != '/' && *path != 0\)) 174.741 Tj
0 -265.814 Td
(4325     path++;) 69.8962 Tj
0 -275.307 Td
(4326   len = path - s;) 96.1073 Tj
0 -284.801 Td
(4327   if\(len >= DIRSIZ\)) 104.844 Tj
0 -294.294 Td
(4328     memmove\(name, s, DIRSIZ\);) 148.529 Tj
0 -303.788 Td
(4329   else {) 56.7907 Tj
0 -313.281 Td
(4330     memmove\(name, s, len\);) 135.424 Tj
0 -322.774 Td
(4331     name[len] = 0;) 100.476 Tj
0 -332.268 Td
(4332   }) 34.9481 Tj
0 -341.761 Td
(4333   while\(*path == '/'\)) 113.581 Tj
0 -351.254 Td
(4334     path++;) 69.8962 Tj
0 -360.748 Td
(4335   return path;) 83.0018 Tj
0 -370.241 Td
(4336 }) 26.2111 Tj
0 -379.734 Td
(4337 ) 21.8426 Tj
0 -389.228 Td
(4338 ) 21.8426 Tj
0 -398.721 Td
(4339 ) 21.8426 Tj
0 -408.214 Td
(4340 ) 21.8426 Tj
0 -417.708 Td
(4341 ) 21.8426 Tj
0 -427.201 Td
(4342 ) 21.8426 Tj
0 -436.695 Td
(4343 ) 21.8426 Tj
0 -446.188 Td
(4344 ) 21.8426 Tj
0 -455.681 Td
(4345 ) 21.8426 Tj
0 -465.175 Td
(4346 ) 21.8426 Tj
0 -474.668 Td
(4347 ) 21.8426 Tj
0 -484.161 Td
(4348 ) 21.8426 Tj
0 -493.655 Td
(4349 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/fs.c  Page 15) 157.267 Tj
0 -28.4801 Td
(4350 // Look up and return the inode for a path name.) 231.531 Tj
0 -37.9735 Td
(4351 // If parent != 0, return the inode for the parent and cop\
y the final) 323.27 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.213 Tj
0 -66.4535 Td
(4354 _namei\(char *path, int parent, char *name\)) 205.32 Tj
0 -75.9469 Td
(4355 {) 26.2111 Tj
0 -85.4403 Td
(4356   struct inode *ip, *next;) 135.424 Tj
0 -94.9336 Td
(4357 ) 21.8426 Tj
0 -104.427 Td
(4358   if\(*path == '/'\)) 100.476 Tj
0 -113.92 Td
(4359     ip = iget\(ROOTDEV, 1\);) 135.424 Tj
0 -123.414 Td
(4360   else) 48.0537 Tj
0 -132.907 Td
(4361     ip = idup\(cp->cwd\);) 122.318 Tj
0 -142.4 Td
(4362 ) 21.8426 Tj
0 -151.894 Td
(4363   while\(\(path = skipelem\(path, name\)\) != 0\){) 214.057 Tj
0 -161.387 Td
(4364     ilock\(ip\);) 83.0018 Tj
0 -170.88 Td
(4365     if\(ip->type != T_DIR\){) 135.424 Tj
0 -180.374 Td
(4366       iunlockput\(ip\);) 113.581 Tj
0 -189.867 Td
(4367       return 0;) 87.3703 Tj
0 -199.361 Td
(4368     }) 43.6851 Tj
0 -208.854 Td
(4369     if\(parent && *path == '\\0'\){) 161.635 Tj
0 -218.347 Td
(4370       // Stop one level early.) 152.898 Tj
0 -227.841 Td
(4371       iunlock\(ip\);) 100.476 Tj
0 -237.334 Td
(4372       return ip;) 91.7388 Tj
0 -246.827 Td
(4373     }) 43.6851 Tj
0 -256.321 Td
(4374     if\(\(next = dirlookup\(ip, name, 0\)\) == 0\){) 218.426 Tj
0 -265.814 Td
(4375       iunlockput\(ip\);) 113.581 Tj
0 -275.307 Td
(4376       return 0;) 87.3703 Tj
0 -284.801 Td
(4377     }) 43.6851 Tj
0 -294.294 Td
(4378     iunlockput\(ip\);) 104.844 Tj
0 -303.788 Td
(4379     ip = next;) 83.0018 Tj
0 -313.281 Td
(4380   }) 34.9481 Tj
0 -322.774 Td
(4381   if\(parent\){) 78.6333 Tj
0 -332.268 Td
(4382     iput\(ip\);) 78.6333 Tj
0 -341.761 Td
(4383     return 0;) 78.6333 Tj
0 -351.254 Td
(4384   }) 34.9481 Tj
0 -360.748 Td
(4385   return ip;) 74.2647 Tj
0 -370.241 Td
(4386 }) 26.2111 Tj
0 -379.734 Td
(4387 ) 21.8426 Tj
0 -389.228 Td
(4388 struct inode*) 78.6333 Tj
0 -398.721 Td
(4389 namei\(char *path\)) 96.1073 Tj
0 -408.214 Td
(4390 {) 26.2111 Tj
0 -417.708 Td
(4391   char name[DIRSIZ];) 109.213 Tj
0 -427.201 Td
(4392   return _namei\(path, 0, name\);) 157.267 Tj
0 -436.695 Td
(4393 }) 26.2111 Tj
0 -446.188 Td
(4394 ) 21.8426 Tj
0 -455.681 Td
(4395 struct inode*) 78.6333 Tj
0 -465.175 Td
(4396 nameiparent\(char *path, char *name\)) 174.741 Tj
0 -474.668 Td
(4397 {) 26.2111 Tj
0 -484.161 Td
(4398   return _namei\(path, 1, name\);) 157.267 Tj
0 -493.655 Td
(4399 }) 26.2111 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/file.c  Page 1) 161.635 Tj
0 -28.4801 Td
(4400 #include "types.h") 100.476 Tj
0 -37.9735 Td
(4401 #include "defs.h") 96.1073 Tj
0 -47.4668 Td
(4402 #include "param.h") 100.476 Tj
0 -56.9602 Td
(4403 #include "file.h") 96.1073 Tj
0 -66.4535 Td
(4404 #include "spinlock.h") 113.581 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.055 Tj
0 -104.427 Td
(4408 struct spinlock file_table_lock;) 161.635 Tj
0 -113.92 Td
(4409 struct file file[NFILE];) 126.687 Tj
0 -123.414 Td
(4410 ) 21.8426 Tj
0 -132.907 Td
(4411 void) 39.3166 Tj
0 -142.4 Td
(4412 fileinit\(void\)) 83.0018 Tj
0 -151.894 Td
(4413 {) 26.2111 Tj
0 -161.387 Td
(4414   initlock\(&file_table_lock, "file_table"\);) 209.689 Tj
0 -170.88 Td
(4415 }) 26.2111 Tj
0 -180.374 Td
(4416 ) 21.8426 Tj
0 -189.867 Td
(4417 // Allocate a file structure.) 148.529 Tj
0 -199.361 Td
(4418 struct file*) 74.2647 Tj
0 -208.854 Td
(4419 filealloc\(void\)) 87.3703 Tj
0 -218.347 Td
(4420 {) 26.2111 Tj
0 -227.841 Td
(4421   int i;) 56.7907 Tj
0 -237.334 Td
(4422 ) 21.8426 Tj
0 -246.827 Td
(4423   acquire\(&file_table_lock\);) 144.161 Tj
0 -256.321 Td
(4424   for\(i = 0; i < NFILE; i++\){) 148.529 Tj
0 -265.814 Td
(4425     if\(file[i].type == FD_CLOSED\){) 170.372 Tj
0 -275.307 Td
(4426       file[i].type = FD_NONE;) 148.529 Tj
0 -284.801 Td
(4427       file[i].ref = 1;) 117.95 Tj
0 -294.294 Td
(4428       release\(&file_table_lock\);) 161.635 Tj
0 -303.788 Td
(4429       return file + i;) 117.95 Tj
0 -313.281 Td
(4430     }) 43.6851 Tj
0 -322.774 Td
(4431   }) 34.9481 Tj
0 -332.268 Td
(4432   release\(&file_table_lock\);) 144.161 Tj
0 -341.761 Td
(4433   return 0;) 69.8962 Tj
0 -351.254 Td
(4434 }) 26.2111 Tj
0 -360.748 Td
(4435 ) 21.8426 Tj
0 -370.241 Td
(4436 // Increment ref count for file f.) 170.372 Tj
0 -379.734 Td
(4437 struct file*) 74.2647 Tj
0 -389.228 Td
(4438 filedup\(struct file *f\)) 122.318 Tj
0 -398.721 Td
(4439 {) 26.2111 Tj
0 -408.214 Td
(4440   acquire\(&file_table_lock\);) 144.161 Tj
0 -417.708 Td
(4441   if\(f->ref < 1 || f->type == FD_CLOSED\)) 196.583 Tj
0 -427.201 Td
(4442     panic\("filedup"\);) 113.581 Tj
0 -436.695 Td
(4443   f->ref++;) 69.8962 Tj
0 -446.188 Td
(4444   release\(&file_table_lock\);) 144.161 Tj
0 -455.681 Td
(4445   return f;) 69.8962 Tj
0 -465.175 Td
(4446 }) 26.2111 Tj
0 -474.668 Td
(4447 ) 21.8426 Tj
0 -484.161 Td
(4448 ) 21.8426 Tj
0 -493.655 Td
(4449 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.69 Tj
0 -37.9735 Td
(4451 void) 39.3166 Tj
0 -47.4668 Td
(4452 fileclose\(struct file *f\)) 131.055 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.583 Tj
0 -104.427 Td
(4458     panic\("fileclose"\);) 122.318 Tj
0 -113.92 Td
(4459   if\(--f->ref > 0\){) 104.844 Tj
0 -123.414 Td
(4460     release\(&file_table_lock\);) 152.898 Tj
0 -132.907 Td
(4461     return;) 69.8962 Tj
0 -142.4 Td
(4462   }) 34.9481 Tj
0 -151.894 Td
(4463   ff = *f;) 65.5277 Tj
0 -161.387 Td
(4464   f->ref = 0;) 78.6333 Tj
0 -170.88 Td
(4465   f->type = FD_CLOSED;) 117.95 Tj
0 -180.374 Td
(4466   release\(&file_table_lock\);) 144.161 Tj
0 -189.867 Td
(4467 ) 21.8426 Tj
0 -199.361 Td
(4468   if\(ff.type == FD_PIPE\)) 126.687 Tj
0 -208.854 Td
(4469     pipeclose\(ff.pipe, ff.writable\);) 179.109 Tj
0 -218.347 Td
(4470   else if\(ff.type == FD_INODE\)) 152.898 Tj
0 -227.841 Td
(4471     iput\(ff.ip\);) 91.7388 Tj
0 -237.334 Td
(4472   else) 48.0537 Tj
0 -246.827 Td
(4473     panic\("fileclose"\);) 122.318 Tj
0 -256.321 Td
(4474 }) 26.2111 Tj
0 -265.814 Td
(4475 ) 21.8426 Tj
0 -275.307 Td
(4476 // Get metadata about file f.) 148.529 Tj
0 -284.801 Td
(4477 int) 34.9481 Tj
0 -294.294 Td
(4478 filestat\(struct file *f, struct stat *st\)) 200.952 Tj
0 -303.788 Td
(4479 {) 26.2111 Tj
0 -313.281 Td
(4480   if\(f->type == FD_INODE\){) 135.424 Tj
0 -322.774 Td
(4481     ilock\(f->ip\);) 96.1073 Tj
0 -332.268 Td
(4482     stati\(f->ip, st\);) 113.581 Tj
0 -341.761 Td
(4483     iunlock\(f->ip\);) 104.844 Tj
0 -351.254 Td
(4484     return 0;) 78.6333 Tj
0 -360.748 Td
(4485   }) 34.9481 Tj
0 -370.241 Td
(4486   return -1;) 74.2647 Tj
0 -379.734 Td
(4487 }) 26.2111 Tj
0 -389.228 Td
(4488 ) 21.8426 Tj
0 -398.721 Td
(4489 ) 21.8426 Tj
0 -408.214 Td
(4490 ) 21.8426 Tj
0 -417.708 Td
(4491 ) 21.8426 Tj
0 -427.201 Td
(4492 ) 21.8426 Tj
0 -436.695 Td
(4493 ) 21.8426 Tj
0 -446.188 Td
(4494 ) 21.8426 Tj
0 -455.681 Td
(4495 ) 21.8426 Tj
0 -465.175 Td
(4496 ) 21.8426 Tj
0 -474.668 Td
(4497 ) 21.8426 Tj
0 -484.161 Td
(4498 ) 21.8426 Tj
0 -493.655 Td
(4499 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/file.c  Page 3) 161.635 Tj
0 -28.4801 Td
(4500 // Read from file f.  Addr is kernel address.) 218.426 Tj
0 -37.9735 Td
(4501 int) 34.9481 Tj
0 -47.4668 Td
(4502 fileread\(struct file *f, char *addr, int n\)) 209.689 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.95 Tj
0 -94.9336 Td
(4507     return -1;) 83.0018 Tj
0 -104.427 Td
(4508   if\(f->type == FD_PIPE\)) 126.687 Tj
0 -113.92 Td
(4509     return piperead\(f->pipe, addr, n\);) 187.846 Tj
0 -123.414 Td
(4510   if\(f->type == FD_INODE\){) 135.424 Tj
0 -132.907 Td
(4511     ilock\(f->ip\);) 96.1073 Tj
0 -142.4 Td
(4512     if\(\(r = readi\(f->ip, addr, f->off, n\)\) > 0\)) 227.163 Tj
0 -151.894 Td
(4513       f->off += r;) 100.476 Tj
0 -161.387 Td
(4514     iunlock\(f->ip\);) 104.844 Tj
0 -170.88 Td
(4515     return r;) 78.6333 Tj
0 -180.374 Td
(4516   }) 34.9481 Tj
0 -189.867 Td
(4517   panic\("fileread"\);) 109.213 Tj
0 -199.361 Td
(4518 }) 26.2111 Tj
0 -208.854 Td
(4519 ) 21.8426 Tj
0 -218.347 Td
(4520 // Write to file f.  Addr is kernel address.) 214.057 Tj
0 -227.841 Td
(4521 int) 34.9481 Tj
0 -237.334 Td
(4522 filewrite\(struct file *f, char *addr, int n\)) 214.057 Tj
0 -246.827 Td
(4523 {) 26.2111 Tj
0 -256.321 Td
(4524   int r;) 56.7907 Tj
0 -265.814 Td
(4525 ) 21.8426 Tj
0 -275.307 Td
(4526   if\(f->writable == 0\)) 117.95 Tj
0 -284.801 Td
(4527     return -1;) 83.0018 Tj
0 -294.294 Td
(4528   if\(f->type == FD_PIPE\)) 126.687 Tj
0 -303.788 Td
(4529     return pipewrite\(f->pipe, addr, n\);) 192.215 Tj
0 -313.281 Td
(4530   if\(f->type == FD_INODE\){) 135.424 Tj
0 -322.774 Td
(4531     ilock\(f->ip\);) 96.1073 Tj
0 -332.268 Td
(4532     if\(\(r = writei\(f->ip, addr, f->off, n\)\) > 0\)) 231.531 Tj
0 -341.761 Td
(4533       f->off += r;) 100.476 Tj
0 -351.254 Td
(4534     iunlock\(f->ip\);) 104.844 Tj
0 -360.748 Td
(4535     return r;) 78.6333 Tj
0 -370.241 Td
(4536   }) 34.9481 Tj
0 -379.734 Td
(4537   panic\("filewrite"\);) 113.581 Tj
0 -389.228 Td
(4538 }) 26.2111 Tj
0 -398.721 Td
(4539 ) 21.8426 Tj
0 -408.214 Td
(4540 ) 21.8426 Tj
0 -417.708 Td
(4541 ) 21.8426 Tj
0 -427.201 Td
(4542 ) 21.8426 Tj
0 -436.695 Td
(4543 ) 21.8426 Tj
0 -446.188 Td
(4544 ) 21.8426 Tj
0 -455.681 Td
(4545 ) 21.8426 Tj
0 -465.175 Td
(4546 ) 21.8426 Tj
0 -474.668 Td
(4547 ) 21.8426 Tj
0 -484.161 Td
(4548 ) 21.8426 Tj
0 -493.655 Td
(4549 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sysfile.c  Page 1) 174.741 Tj
0 -28.4801 Td
(4550 #include "types.h") 100.476 Tj
0 -37.9735 Td
(4551 #include "defs.h") 96.1073 Tj
0 -47.4668 Td
(4552 #include "param.h") 100.476 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.476 Tj
0 -104.427 Td
(4558 #include "file.h") 96.1073 Tj
0 -113.92 Td
(4559 #include "fcntl.h") 100.476 Tj
0 -123.414 Td
(4560 ) 21.8426 Tj
0 -132.907 Td
(4561 // Fetch the nth word-sized system call argument as a file\
 descriptor) 323.27 Tj
0 -142.4 Td
(4562 // and return both the descriptor and the corresponding st\
ruct file.) 318.902 Tj
0 -151.894 Td
(4563 static int) 65.5277 Tj
0 -161.387 Td
(4564 argfd\(int n, int *pfd, struct file **pf\)) 196.583 Tj
0 -170.88 Td
(4565 {) 26.2111 Tj
0 -180.374 Td
(4566   int fd;) 61.1592 Tj
0 -189.867 Td
(4567   struct file *f;) 96.1073 Tj
0 -199.361 Td
(4568 ) 21.8426 Tj
0 -208.854 Td
(4569   if\(argint\(n, &fd\) < 0\)) 126.687 Tj
0 -218.347 Td
(4570     return -1;) 83.0018 Tj
0 -227.841 Td
(4571   if\(fd < 0 || fd >= NOFILE || \(f=cp->ofile[fd]\) == 0\)) 257.742 Tj
0 -237.334 Td
(4572     return -1;) 83.0018 Tj
0 -246.827 Td
(4573   if\(pfd\)) 61.1592 Tj
0 -256.321 Td
(4574     *pfd = fd;) 83.0018 Tj
0 -265.814 Td
(4575   if\(pf\)) 56.7907 Tj
0 -275.307 Td
(4576     *pf = f;) 74.2647 Tj
0 -284.801 Td
(4577   return 0;) 69.8962 Tj
0 -294.294 Td
(4578 }) 26.2111 Tj
0 -303.788 Td
(4579 ) 21.8426 Tj
0 -313.281 Td
(4580 // Allocate a file descriptor for the given file.) 235.9 Tj
0 -322.774 Td
(4581 // Takes over file reference from caller on success.) 249.005 Tj
0 -332.268 Td
(4582 static int) 65.5277 Tj
0 -341.761 Td
(4583 fdalloc\(struct file *f\)) 122.318 Tj
0 -351.254 Td
(4584 {) 26.2111 Tj
0 -360.748 Td
(4585   int fd;) 61.1592 Tj
0 -370.241 Td
(4586 ) 21.8426 Tj
0 -379.734 Td
(4587   for\(fd = 0; fd < NOFILE; fd++\){) 166.004 Tj
0 -389.228 Td
(4588     if\(cp->ofile[fd] == 0\){) 139.792 Tj
0 -398.721 Td
(4589       cp->ofile[fd] = f;) 126.687 Tj
0 -408.214 Td
(4590       return fd;) 91.7388 Tj
0 -417.708 Td
(4591     }) 43.6851 Tj
0 -427.201 Td
(4592   }) 34.9481 Tj
0 -436.695 Td
(4593   return -1;) 74.2647 Tj
0 -446.188 Td
(4594 }) 26.2111 Tj
0 -455.681 Td
(4595 ) 21.8426 Tj
0 -465.175 Td
(4596 ) 21.8426 Tj
0 -474.668 Td
(4597 ) 21.8426 Tj
0 -484.161 Td
(4598 ) 21.8426 Tj
0 -493.655 Td
(4599 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sysfile.c  Page 2) 174.741 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 *cp;) 69.8962 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, &cp, n\) < 0\)) 332.007 Tj
0 -104.427 Td
(4608     return -1;) 83.0018 Tj
0 -113.92 Td
(4609   return fileread\(f, cp, n\);) 144.161 Tj
0 -123.414 Td
(4610 }) 26.2111 Tj
0 -132.907 Td
(4611 ) 21.8426 Tj
0 -142.4 Td
(4612 int) 34.9481 Tj
0 -151.894 Td
(4613 sys_write\(void\)) 87.3703 Tj
0 -161.387 Td
(4614 {) 26.2111 Tj
0 -170.88 Td
(4615   struct file *f;) 96.1073 Tj
0 -180.374 Td
(4616   int n;) 56.7907 Tj
0 -189.867 Td
(4617   char *cp;) 69.8962 Tj
0 -199.361 Td
(4618 ) 21.8426 Tj
0 -208.854 Td
(4619   if\(argfd\(0, 0, &f\) < 0 || argint\(2, &n\) < 0 || argp\
tr\(1, &cp, n\) < 0\)) 332.007 Tj
0 -218.347 Td
(4620     return -1;) 83.0018 Tj
0 -227.841 Td
(4621   return filewrite\(f, cp, n\);) 148.529 Tj
0 -237.334 Td
(4622 }) 26.2111 Tj
0 -246.827 Td
(4623 ) 21.8426 Tj
0 -256.321 Td
(4624 int) 34.9481 Tj
0 -265.814 Td
(4625 sys_dup\(void\)) 78.6333 Tj
0 -275.307 Td
(4626 {) 26.2111 Tj
0 -284.801 Td
(4627   struct file *f;) 96.1073 Tj
0 -294.294 Td
(4628   int fd;) 61.1592 Tj
0 -303.788 Td
(4629 ) 21.8426 Tj
0 -313.281 Td
(4630   if\(argfd\(0, 0, &f\) < 0\)) 131.055 Tj
0 -322.774 Td
(4631     return -1;) 83.0018 Tj
0 -332.268 Td
(4632   if\(\(fd=fdalloc\(f\)\) < 0\)) 131.055 Tj
0 -341.761 Td
(4633     return -1;) 83.0018 Tj
0 -351.254 Td
(4634   filedup\(f\);) 78.6333 Tj
0 -360.748 Td
(4635   return fd;) 74.2647 Tj
0 -370.241 Td
(4636 }) 26.2111 Tj
0 -379.734 Td
(4637 ) 21.8426 Tj
0 -389.228 Td
(4638 int) 34.9481 Tj
0 -398.721 Td
(4639 sys_close\(void\)) 87.3703 Tj
0 -408.214 Td
(4640 {) 26.2111 Tj
0 -417.708 Td
(4641   int fd;) 61.1592 Tj
0 -427.201 Td
(4642   struct file *f;) 96.1073 Tj
0 -436.695 Td
(4643 ) 21.8426 Tj
0 -446.188 Td
(4644   if\(argfd\(0, &fd, &f\) < 0\)) 139.792 Tj
0 -455.681 Td
(4645     return -1;) 83.0018 Tj
0 -465.175 Td
(4646   cp->ofile[fd] = 0;) 109.213 Tj
0 -474.668 Td
(4647   fileclose\(f\);) 87.3703 Tj
0 -484.161 Td
(4648   return 0;) 69.8962 Tj
0 -493.655 Td
(4649 }) 26.2111 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sysfile.c  Page 3) 174.741 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.476 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.055 Tj
0 -113.92 Td
(4659 }) 26.2111 Tj
0 -123.414 Td
(4660 ) 21.8426 Tj
0 -132.907 Td
(4661 // Create the path new as a link to the same inode as old.) 275.216 Tj
0 -142.4 Td
(4662 int) 34.9481 Tj
0 -151.894 Td
(4663 sys_link\(void\)) 83.0018 Tj
0 -161.387 Td
(4664 {) 26.2111 Tj
0 -170.88 Td
(4665   char name[DIRSIZ], *new, *old;) 161.635 Tj
0 -180.374 Td
(4666   struct inode *dp, *ip;) 126.687 Tj
0 -189.867 Td
(4667 ) 21.8426 Tj
0 -199.361 Td
(4668   if\(argstr\(0, &old\) < 0 || argstr\(1, &new\) < 0\)) 231.531 Tj
0 -208.854 Td
(4669     return -1;) 83.0018 Tj
0 -218.347 Td
(4670   if\(\(ip = namei\(old\)\) == 0\)) 144.161 Tj
0 -227.841 Td
(4671     return -1;) 83.0018 Tj
0 -237.334 Td
(4672   ilock\(ip\);) 74.2647 Tj
0 -246.827 Td
(4673   if\(ip->type == T_DIR\){) 126.687 Tj
0 -256.321 Td
(4674     iunlockput\(ip\);) 104.844 Tj
0 -265.814 Td
(4675     return -1;) 83.0018 Tj
0 -275.307 Td
(4676   }) 34.9481 Tj
0 -284.801 Td
(4677   ip->nlink++;) 83.0018 Tj
0 -294.294 Td
(4678   iupdate\(ip\);) 83.0018 Tj
0 -303.788 Td
(4679   iunlock\(ip\);) 83.0018 Tj
0 -313.281 Td
(4680 ) 21.8426 Tj
0 -322.774 Td
(4681   if\(\(dp = nameiparent\(new, name\)\) == 0\)) 196.583 Tj
0 -332.268 Td
(4682     goto  bad;) 83.0018 Tj
0 -341.761 Td
(4683   ilock\(dp\);) 74.2647 Tj
0 -351.254 Td
(4684   if\(dp->dev != ip->dev || dirlink\(dp, name, ip->inum\) \
< 0\)) 279.585 Tj
0 -360.748 Td
(4685     goto bad;) 78.6333 Tj
0 -370.241 Td
(4686   iunlockput\(dp\);) 96.1073 Tj
0 -379.734 Td
(4687   iput\(ip\);) 69.8962 Tj
0 -389.228 Td
(4688   return 0;) 69.8962 Tj
0 -398.721 Td
(4689 ) 21.8426 Tj
0 -408.214 Td
(4690 bad:) 39.3166 Tj
0 -417.708 Td
(4691   if\(dp\)) 56.7907 Tj
0 -427.201 Td
(4692     iunlockput\(dp\);) 104.844 Tj
0 -436.695 Td
(4693   ilock\(ip\);) 74.2647 Tj
0 -446.188 Td
(4694   ip->nlink--;) 83.0018 Tj
0 -455.681 Td
(4695   iupdate\(ip\);) 83.0018 Tj
0 -465.175 Td
(4696   iunlockput\(ip\);) 96.1073 Tj
0 -474.668 Td
(4697   return -1;) 74.2647 Tj
0 -484.161 Td
(4698 }) 26.2111 Tj
0 -493.655 Td
(4699 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sysfile.c  Page 4) 174.741 Tj
0 -28.4801 Td
(4700 // Is the directory dp empty except for "." and ".." ?) 257.742 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.844 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.111 Tj
0 -104.427 Td
(4708     if\(readi\(dp, \(char*\)&de, off, sizeof\(de\)\) != si\
zeof\(de\)\)) 283.953 Tj
0 -113.92 Td
(4709       panic\("isdirempty: readi"\);) 166.004 Tj
0 -123.414 Td
(4710     if\(de.inum != 0\)) 109.213 Tj
0 -132.907 Td
(4711       return 0;) 87.3703 Tj
0 -142.4 Td
(4712   }) 34.9481 Tj
0 -151.894 Td
(4713   return 1;) 69.8962 Tj
0 -161.387 Td
(4714 }) 26.2111 Tj
0 -170.88 Td
(4715 ) 21.8426 Tj
0 -180.374 Td
(4716 ) 21.8426 Tj
0 -189.867 Td
(4717 ) 21.8426 Tj
0 -199.361 Td
(4718 ) 21.8426 Tj
0 -208.854 Td
(4719 ) 21.8426 Tj
0 -218.347 Td
(4720 ) 21.8426 Tj
0 -227.841 Td
(4721 ) 21.8426 Tj
0 -237.334 Td
(4722 ) 21.8426 Tj
0 -246.827 Td
(4723 ) 21.8426 Tj
0 -256.321 Td
(4724 ) 21.8426 Tj
0 -265.814 Td
(4725 ) 21.8426 Tj
0 -275.307 Td
(4726 ) 21.8426 Tj
0 -284.801 Td
(4727 ) 21.8426 Tj
0 -294.294 Td
(4728 ) 21.8426 Tj
0 -303.788 Td
(4729 ) 21.8426 Tj
0 -313.281 Td
(4730 ) 21.8426 Tj
0 -322.774 Td
(4731 ) 21.8426 Tj
0 -332.268 Td
(4732 ) 21.8426 Tj
0 -341.761 Td
(4733 ) 21.8426 Tj
0 -351.254 Td
(4734 ) 21.8426 Tj
0 -360.748 Td
(4735 ) 21.8426 Tj
0 -370.241 Td
(4736 ) 21.8426 Tj
0 -379.734 Td
(4737 ) 21.8426 Tj
0 -389.228 Td
(4738 ) 21.8426 Tj
0 -398.721 Td
(4739 ) 21.8426 Tj
0 -408.214 Td
(4740 ) 21.8426 Tj
0 -417.708 Td
(4741 ) 21.8426 Tj
0 -427.201 Td
(4742 ) 21.8426 Tj
0 -436.695 Td
(4743 ) 21.8426 Tj
0 -446.188 Td
(4744 ) 21.8426 Tj
0 -455.681 Td
(4745 ) 21.8426 Tj
0 -465.175 Td
(4746 ) 21.8426 Tj
0 -474.668 Td
(4747 ) 21.8426 Tj
0 -484.161 Td
(4748 ) 21.8426 Tj
0 -493.655 Td
(4749 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sysfile.c  Page 5) 174.741 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.687 Tj
0 -66.4535 Td
(4754   struct dirent de;) 104.844 Tj
0 -75.9469 Td
(4755   char name[DIRSIZ], *path;) 139.792 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.424 Tj
0 -113.92 Td
(4759     return -1;) 83.0018 Tj
0 -123.414 Td
(4760   if\(\(dp = nameiparent\(path, name\)\) == 0\)) 200.952 Tj
0 -132.907 Td
(4761     return -1;) 83.0018 Tj
0 -142.4 Td
(4762   ilock\(dp\);) 74.2647 Tj
0 -151.894 Td
(4763 ) 21.8426 Tj
0 -161.387 Td
(4764   // Cannot unlink "." or "..".) 157.267 Tj
0 -170.88 Td
(4765   if\(namecmp\(name, "."\) == 0 || namecmp\(name, ".."\) =\
= 0\){) 275.216 Tj
0 -180.374 Td
(4766     iunlockput\(dp\);) 104.844 Tj
0 -189.867 Td
(4767     return -1;) 83.0018 Tj
0 -199.361 Td
(4768   }) 34.9481 Tj
0 -208.854 Td
(4769 ) 21.8426 Tj
0 -218.347 Td
(4770   if\(\(ip = dirlookup\(dp, name, &off\)\) == 0\){) 214.057 Tj
0 -227.841 Td
(4771     iunlockput\(dp\);) 104.844 Tj
0 -237.334 Td
(4772     return -1;) 83.0018 Tj
0 -246.827 Td
(4773   }) 34.9481 Tj
0 -256.321 Td
(4774   ilock\(ip\);) 74.2647 Tj
0 -265.814 Td
(4775 ) 21.8426 Tj
0 -275.307 Td
(4776   if\(ip->nlink < 1\)) 104.844 Tj
0 -284.801 Td
(4777     panic\("unlink: nlink < 1"\);) 157.267 Tj
0 -294.294 Td
(4778   if\(ip->type == T_DIR && !isdirempty\(ip\)\){) 209.689 Tj
0 -303.788 Td
(4779     iunlockput\(ip\);) 104.844 Tj
0 -313.281 Td
(4780     iunlockput\(dp\);) 104.844 Tj
0 -322.774 Td
(4781     return -1;) 83.0018 Tj
0 -332.268 Td
(4782   }) 34.9481 Tj
0 -341.761 Td
(4783 ) 21.8426 Tj
0 -351.254 Td
(4784   memset\(&de, 0, sizeof\(de\)\);) 148.529 Tj
0 -360.748 Td
(4785   if\(writei\(dp, \(char*\)&de, off, sizeof\(de\)\) != siz\
eof\(de\)\)) 279.585 Tj
0 -370.241 Td
(4786     panic\("unlink: writei"\);) 144.161 Tj
0 -379.734 Td
(4787   iunlockput\(dp\);) 96.1073 Tj
0 -389.228 Td
(4788 ) 21.8426 Tj
0 -398.721 Td
(4789   ip->nlink--;) 83.0018 Tj
0 -408.214 Td
(4790   iupdate\(ip\);) 83.0018 Tj
0 -417.708 Td
(4791   iunlockput\(ip\);) 96.1073 Tj
0 -427.201 Td
(4792   return 0;) 69.8962 Tj
0 -436.695 Td
(4793 }) 26.2111 Tj
0 -446.188 Td
(4794 ) 21.8426 Tj
0 -455.681 Td
(4795 ) 21.8426 Tj
0 -465.175 Td
(4796 ) 21.8426 Tj
0 -474.668 Td
(4797 ) 21.8426 Tj
0 -484.161 Td
(4798 ) 21.8426 Tj
0 -493.655 Td
(4799 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sysfile.c  Page 6) 174.741 Tj
0 -28.4801 Td
(4800 static struct inode*) 109.213 Tj
0 -37.9735 Td
(4801 create\(char *path, int canexist, short type, short major,\
 short minor\)) 327.639 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.687 Tj
0 -75.9469 Td
(4805   char name[DIRSIZ];) 109.213 Tj
0 -85.4403 Td
(4806 ) 21.8426 Tj
0 -94.9336 Td
(4807   if\(\(dp = nameiparent\(path, name\)\) == 0\)) 200.952 Tj
0 -104.427 Td
(4808     return 0;) 78.6333 Tj
0 -113.92 Td
(4809   ilock\(dp\);) 74.2647 Tj
0 -123.414 Td
(4810 ) 21.8426 Tj
0 -132.907 Td
(4811   if\(canexist && \(ip = dirlookup\(dp, name, &off\)\) != \
0\){) 266.479 Tj
0 -142.4 Td
(4812     iunlockput\(dp\);) 104.844 Tj
0 -151.894 Td
(4813     ilock\(ip\);) 83.0018 Tj
0 -161.387 Td
(4814     if\(ip->type != type || ip->major != major || ip->mino\
r != minor\){) 323.27 Tj
0 -170.88 Td
(4815       iunlockput\(ip\);) 113.581 Tj
0 -180.374 Td
(4816       return 0;) 87.3703 Tj
0 -189.867 Td
(4817     }) 43.6851 Tj
0 -199.361 Td
(4818     return ip;) 83.0018 Tj
0 -208.854 Td
(4819   }) 34.9481 Tj
0 -218.347 Td
(4820 ) 21.8426 Tj
0 -227.841 Td
(4821   if\(\(ip = ialloc\(dp->dev, type\)\) == 0\){) 196.583 Tj
0 -237.334 Td
(4822     iunlockput\(dp\);) 104.844 Tj
0 -246.827 Td
(4823     return 0;) 78.6333 Tj
0 -256.321 Td
(4824   }) 34.9481 Tj
0 -265.814 Td
(4825   ilock\(ip\);) 74.2647 Tj
0 -275.307 Td
(4826   ip->major = major;) 109.213 Tj
0 -284.801 Td
(4827   ip->minor = minor;) 109.213 Tj
0 -294.294 Td
(4828   ip->nlink = 1;) 91.7388 Tj
0 -303.788 Td
(4829   iupdate\(ip\);) 83.0018 Tj
0 -313.281 Td
(4830 ) 21.8426 Tj
0 -322.774 Td
(4831   if\(dirlink\(dp, name, ip->inum\) < 0\){) 187.846 Tj
0 -332.268 Td
(4832     ip->nlink = 0;) 100.476 Tj
0 -341.761 Td
(4833     iunlockput\(ip\);) 104.844 Tj
0 -351.254 Td
(4834     iunlockput\(dp\);) 104.844 Tj
0 -360.748 Td
(4835     return 0;) 78.6333 Tj
0 -370.241 Td
(4836   }) 34.9481 Tj
0 -379.734 Td
(4837 ) 21.8426 Tj
0 -389.228 Td
(4838   if\(type == T_DIR\){  // Create . and .. entries.) 235.9 Tj
0 -398.721 Td
(4839     dp->nlink++;  // for "..") 148.529 Tj
0 -408.214 Td
(4840     iupdate\(dp\);) 91.7388 Tj
0 -417.708 Td
(4841     // No ip->nlink++ for ".": avoid cyclic ref count.) 257.742 Tj
0 -427.201 Td
(4842     if\(dirlink\(ip, ".", ip->inum\) < 0 || dirlink\(ip, "\
..", dp->inum\) < 0\)) 340.744 Tj
0 -436.695 Td
(4843       panic\("create dots"\);) 139.792 Tj
0 -446.188 Td
(4844   }) 34.9481 Tj
0 -455.681 Td
(4845   iunlockput\(dp\);) 96.1073 Tj
0 -465.175 Td
(4846   return ip;) 74.2647 Tj
0 -474.668 Td
(4847 }) 26.2111 Tj
0 -484.161 Td
(4848 ) 21.8426 Tj
0 -493.655 Td
(4849 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sysfile.c  Page 7) 174.741 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.844 Tj
0 -94.9336 Td
(4857 ) 21.8426 Tj
0 -104.427 Td
(4858   if\(argstr\(0, &path\) < 0 || argint\(1, &omode\) < 0\)) 244.637 Tj
0 -113.92 Td
(4859     return -1;) 83.0018 Tj
0 -123.414 Td
(4860 ) 21.8426 Tj
0 -132.907 Td
(4861   if\(omode & O_CREATE\){) 122.318 Tj
0 -142.4 Td
(4862     if\(\(ip = create\(path, 1, T_FILE, 0, 0\)\) == 0\)) 235.9 Tj
0 -151.894 Td
(4863       return -1;) 91.7388 Tj
0 -161.387 Td
(4864   } else {) 65.5277 Tj
0 -170.88 Td
(4865     if\(\(ip = namei\(path\)\) == 0\)) 157.267 Tj
0 -180.374 Td
(4866       return -1;) 91.7388 Tj
0 -189.867 Td
(4867     ilock\(ip\);) 83.0018 Tj
0 -199.361 Td
(4868     if\(ip->type == T_DIR && \(omode & \(O_RDWR|O_WRONLY\)\
\)\){) 270.848 Tj
0 -208.854 Td
(4869       iunlockput\(ip\);) 113.581 Tj
0 -218.347 Td
(4870       return -1;) 91.7388 Tj
0 -227.841 Td
(4871     }) 43.6851 Tj
0 -237.334 Td
(4872   }) 34.9481 Tj
0 -246.827 Td
(4873 ) 21.8426 Tj
0 -256.321 Td
(4874   if\(\(f = filealloc\(\)\) == 0 || \(fd = fdalloc\(f\)\) \
< 0\){) 257.742 Tj
0 -265.814 Td
(4875     if\(f\)) 61.1592 Tj
0 -275.307 Td
(4876       fileclose\(f\);) 104.844 Tj
0 -284.801 Td
(4877     iunlockput\(ip\);) 104.844 Tj
0 -294.294 Td
(4878     return -1;) 83.0018 Tj
0 -303.788 Td
(4879   }) 34.9481 Tj
0 -313.281 Td
(4880   iunlock\(ip\);) 83.0018 Tj
0 -322.774 Td
(4881 ) 21.8426 Tj
0 -332.268 Td
(4882   f->type = FD_INODE;) 113.581 Tj
0 -341.761 Td
(4883   f->ip = ip;) 78.6333 Tj
0 -351.254 Td
(4884   f->off = 0;) 78.6333 Tj
0 -360.748 Td
(4885   f->readable = !\(omode & O_WRONLY\);) 179.109 Tj
0 -370.241 Td
(4886   f->writable = \(omode & O_WRONLY\) || \(omode & O_RDWR\)\
;) 262.111 Tj
0 -379.734 Td
(4887 ) 21.8426 Tj
0 -389.228 Td
(4888   return fd;) 74.2647 Tj
0 -398.721 Td
(4889 }) 26.2111 Tj
0 -408.214 Td
(4890 ) 21.8426 Tj
0 -417.708 Td
(4891 ) 21.8426 Tj
0 -427.201 Td
(4892 ) 21.8426 Tj
0 -436.695 Td
(4893 ) 21.8426 Tj
0 -446.188 Td
(4894 ) 21.8426 Tj
0 -455.681 Td
(4895 ) 21.8426 Tj
0 -465.175 Td
(4896 ) 21.8426 Tj
0 -474.668 Td
(4897 ) 21.8426 Tj
0 -484.161 Td
(4898 ) 21.8426 Tj
0 -493.655 Td
(4899 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sysfile.c  Page 8) 174.741 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.844 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.844 Tj
0 -94.9336 Td
(4907 ) 21.8426 Tj
0 -104.427 Td
(4908   if\(\(len=argstr\(0, &path\)\) < 0 ||) 170.372 Tj
0 -113.92 Td
(4909      argint\(1, &major\) < 0 ||) 148.529 Tj
0 -123.414 Td
(4910      argint\(2, &minor\) < 0 ||) 148.529 Tj
0 -132.907 Td
(4911      \(ip = create\(path, 0, T_DEV, major, minor\)\) == 0\)) 257.742 Tj
0 -142.4 Td
(4912     return -1;) 83.0018 Tj
0 -151.894 Td
(4913   iunlockput\(ip\);) 96.1073 Tj
0 -161.387 Td
(4914   return 0;) 69.8962 Tj
0 -170.88 Td
(4915 }) 26.2111 Tj
0 -180.374 Td
(4916 ) 21.8426 Tj
0 -189.867 Td
(4917 int) 34.9481 Tj
0 -199.361 Td
(4918 sys_mkdir\(void\)) 87.3703 Tj
0 -208.854 Td
(4919 {) 26.2111 Tj
0 -218.347 Td
(4920   char *path;) 78.6333 Tj
0 -227.841 Td
(4921   struct inode *ip;) 104.844 Tj
0 -237.334 Td
(4922 ) 21.8426 Tj
0 -246.827 Td
(4923   if\(argstr\(0, &path\) < 0 || \(ip = create\(path, 0, T_\
DIR, 0, 0\)\) == 0\)) 327.639 Tj
0 -256.321 Td
(4924     return -1;) 83.0018 Tj
0 -265.814 Td
(4925   iunlockput\(ip\);) 96.1073 Tj
0 -275.307 Td
(4926   return 0;) 69.8962 Tj
0 -284.801 Td
(4927 }) 26.2111 Tj
0 -294.294 Td
(4928 ) 21.8426 Tj
0 -303.788 Td
(4929 int) 34.9481 Tj
0 -313.281 Td
(4930 sys_chdir\(void\)) 87.3703 Tj
0 -322.774 Td
(4931 {) 26.2111 Tj
0 -332.268 Td
(4932   char *path;) 78.6333 Tj
0 -341.761 Td
(4933   struct inode *ip;) 104.844 Tj
0 -351.254 Td
(4934 ) 21.8426 Tj
0 -360.748 Td
(4935   if\(argstr\(0, &path\) < 0 || \(ip = namei\(path\)\) == \
0\)) 253.374 Tj
0 -370.241 Td
(4936     return -1;) 83.0018 Tj
0 -379.734 Td
(4937   ilock\(ip\);) 74.2647 Tj
0 -389.228 Td
(4938   if\(ip->type != T_DIR\){) 126.687 Tj
0 -398.721 Td
(4939     iunlockput\(ip\);) 104.844 Tj
0 -408.214 Td
(4940     return -1;) 83.0018 Tj
0 -417.708 Td
(4941   }) 34.9481 Tj
0 -427.201 Td
(4942   iunlock\(ip\);) 83.0018 Tj
0 -436.695 Td
(4943   iput\(cp->cwd\);) 91.7388 Tj
0 -446.188 Td
(4944   cp->cwd = ip;) 87.3703 Tj
0 -455.681 Td
(4945   return 0;) 69.8962 Tj
0 -465.175 Td
(4946 }) 26.2111 Tj
0 -474.668 Td
(4947 ) 21.8426 Tj
0 -484.161 Td
(4948 ) 21.8426 Tj
0 -493.655 Td
(4949 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sysfile.c  Page 9) 174.741 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.687 Tj
0 -66.4535 Td
(4954   int i;) 56.7907 Tj
0 -75.9469 Td
(4955   uint uargv, uarg;) 104.844 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.848 Tj
0 -104.427 Td
(4958     return -1;) 83.0018 Tj
0 -113.92 Td
(4959   memset\(argv, 0, sizeof\(argv\)\);) 161.635 Tj
0 -123.414 Td
(4960   for\(i=0;; i++\){) 96.1073 Tj
0 -132.907 Td
(4961     if\(i >= NELEM\(argv\)\)) 126.687 Tj
0 -142.4 Td
(4962       return -1;) 91.7388 Tj
0 -151.894 Td
(4963     if\(fetchint\(cp, uargv+4*i, \(int*\)&uarg\) < 0\)) 231.531 Tj
0 -161.387 Td
(4964       return -1;) 91.7388 Tj
0 -170.88 Td
(4965     if\(uarg == 0\){) 100.476 Tj
0 -180.374 Td
(4966       argv[i] = 0;) 100.476 Tj
0 -189.867 Td
(4967       break;) 74.2647 Tj
0 -199.361 Td
(4968     }) 43.6851 Tj
0 -208.854 Td
(4969     if\(fetchstr\(cp, uarg, &argv[i]\) < 0\)) 196.583 Tj
0 -218.347 Td
(4970       return -1;) 91.7388 Tj
0 -227.841 Td
(4971   }) 34.9481 Tj
0 -237.334 Td
(4972   return exec\(path, argv\);) 135.424 Tj
0 -246.827 Td
(4973 }) 26.2111 Tj
0 -256.321 Td
(4974 ) 21.8426 Tj
0 -265.814 Td
(4975 int) 34.9481 Tj
0 -275.307 Td
(4976 sys_pipe\(void\)) 83.0018 Tj
0 -284.801 Td
(4977 {) 26.2111 Tj
0 -294.294 Td
(4978   int *fd;) 65.5277 Tj
0 -303.788 Td
(4979   struct file *rf, *wf;) 122.318 Tj
0 -313.281 Td
(4980   int fd0, fd1;) 87.3703 Tj
0 -322.774 Td
(4981 ) 21.8426 Tj
0 -332.268 Td
(4982   if\(argptr\(0, \(void*\)&fd, 2*sizeof\(fd[0]\)\) < 0\)) 231.531 Tj
0 -341.761 Td
(4983     return -1;) 83.0018 Tj
0 -351.254 Td
(4984   if\(pipealloc\(&rf, &wf\) < 0\)) 148.529 Tj
0 -360.748 Td
(4985     return -1;) 83.0018 Tj
0 -370.241 Td
(4986   fd0 = -1;) 69.8962 Tj
0 -379.734 Td
(4987   if\(\(fd0 = fdalloc\(rf\)\) < 0 || \(fd1 = fdalloc\(wf\)\
\) < 0\){) 270.848 Tj
0 -389.228 Td
(4988     if\(fd0 >= 0\)) 91.7388 Tj
0 -398.721 Td
(4989       cp->ofile[fd0] = 0;) 131.055 Tj
0 -408.214 Td
(4990     fileclose\(rf\);) 100.476 Tj
0 -417.708 Td
(4991     fileclose\(wf\);) 100.476 Tj
0 -427.201 Td
(4992     return -1;) 83.0018 Tj
0 -436.695 Td
(4993   }) 34.9481 Tj
0 -446.188 Td
(4994   fd[0] = fd0;) 83.0018 Tj
0 -455.681 Td
(4995   fd[1] = fd1;) 83.0018 Tj
0 -465.175 Td
(4996   return 0;) 69.8962 Tj
0 -474.668 Td
(4997 }) 26.2111 Tj
0 -484.161 Td
(4998 ) 21.8426 Tj
0 -493.655 Td
(4999 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/exec.c  Page 1) 161.635 Tj
0 -28.4801 Td
(5000 #include "types.h") 100.476 Tj
0 -37.9735 Td
(5001 #include "param.h") 100.476 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.92 Td
(5009 exec\(char *path, char **argv\)) 148.529 Tj
0 -123.414 Td
(5010 {) 26.2111 Tj
0 -132.907 Td
(5011   char *mem, *s, *last;) 122.318 Tj
0 -142.4 Td
(5012   int i, argc, arglen, len, off;) 161.635 Tj
0 -151.894 Td
(5013   uint sz, sp, argp;) 109.213 Tj
0 -161.387 Td
(5014   struct elfhdr elf;) 109.213 Tj
0 -170.88 Td
(5015   struct inode *ip;) 104.844 Tj
0 -180.374 Td
(5016   struct proghdr ph;) 109.213 Tj
0 -189.867 Td
(5017 ) 21.8426 Tj
0 -199.361 Td
(5018   if\(\(ip = namei\(path\)\) == 0\)) 148.529 Tj
0 -208.854 Td
(5019     return -1;) 83.0018 Tj
0 -218.347 Td
(5020   ilock\(ip\);) 74.2647 Tj
0 -227.841 Td
(5021 ) 21.8426 Tj
0 -237.334 Td
(5022   // Compute memory size of new process.) 196.583 Tj
0 -246.827 Td
(5023   mem = 0;) 65.5277 Tj
0 -256.321 Td
(5024   sz = 0;) 61.1592 Tj
0 -265.814 Td
(5025 ) 21.8426 Tj
0 -275.307 Td
(5026   // Program segments.) 117.95 Tj
0 -284.801 Td
(5027   if\(readi\(ip, \(char*\)&elf, 0, sizeof\(elf\)\) < sizeo\
f\(elf\)\)) 275.216 Tj
0 -294.294 Td
(5028     goto bad;) 78.6333 Tj
0 -303.788 Td
(5029   if\(elf.magic != ELF_MAGIC\)) 144.161 Tj
0 -313.281 Td
(5030     goto bad;) 78.6333 Tj
0 -322.774 Td
(5031   for\(i=0, off=elf.phoff; i<elf.phnum; i++, off+=sizeof\(\
ph\)\){) 288.322 Tj
0 -332.268 Td
(5032     if\(readi\(ip, \(char*\)&ph, off, sizeof\(ph\)\) != si\
zeof\(ph\)\)) 283.953 Tj
0 -341.761 Td
(5033       goto bad;) 87.3703 Tj
0 -351.254 Td
(5034     if\(ph.type != ELF_PROG_LOAD\)) 161.635 Tj
0 -360.748 Td
(5035       continue;) 87.3703 Tj
0 -370.241 Td
(5036     if\(ph.memsz < ph.filesz\)) 144.161 Tj
0 -379.734 Td
(5037       goto bad;) 87.3703 Tj
0 -389.228 Td
(5038     sz += ph.memsz;) 104.844 Tj
0 -398.721 Td
(5039   }) 34.9481 Tj
0 -408.214 Td
(5040 ) 21.8426 Tj
0 -417.708 Td
(5041   // Arguments.) 87.3703 Tj
0 -427.201 Td
(5042   arglen = 0;) 78.6333 Tj
0 -436.695 Td
(5043   for\(argc=0; argv[argc]; argc++\)) 166.004 Tj
0 -446.188 Td
(5044     arglen += strlen\(argv[i]\) + 1;) 170.372 Tj
0 -455.681 Td
(5045   arglen = \(arglen+3\) & ~3;) 139.792 Tj
0 -465.175 Td
(5046   sz += arglen + 4*\(argc+1\);) 144.161 Tj
0 -474.668 Td
(5047 ) 21.8426 Tj
0 -484.161 Td
(5048   // Stack.) 69.8962 Tj
0 -493.655 Td
(5049   sz += PAGE;) 78.6333 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/exec.c  Page 2) 161.635 Tj
0 -28.4801 Td
(5050   // Allocate program memory.) 148.529 Tj
0 -37.9735 Td
(5051   sz = \(sz+PAGE-1\) & ~\(PAGE-1\);) 157.267 Tj
0 -47.4668 Td
(5052   mem = kalloc\(sz\);) 104.844 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.581 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.92 Td
(5059     if\(readi\(ip, \(char*\)&ph, off, sizeof\(ph\)\) != si\
zeof\(ph\)\)) 283.953 Tj
0 -123.414 Td
(5060       goto bad;) 87.3703 Tj
0 -132.907 Td
(5061     if\(ph.type != ELF_PROG_LOAD\)) 161.635 Tj
0 -142.4 Td
(5062       continue;) 87.3703 Tj
0 -151.894 Td
(5063     if\(ph.va + ph.memsz > sz\)) 148.529 Tj
0 -161.387 Td
(5064       goto bad;) 87.3703 Tj
0 -170.88 Td
(5065     if\(readi\(ip, mem + ph.va, ph.offset, ph.filesz\) != \
ph.filesz\)) 305.796 Tj
0 -180.374 Td
(5066       goto bad;) 87.3703 Tj
0 -189.867 Td
(5067     memset\(mem + ph.va + ph.filesz, 0, ph.memsz - ph.file\
sz\);) 288.322 Tj
0 -199.361 Td
(5068   }) 34.9481 Tj
0 -208.854 Td
(5069   iunlockput\(ip\);) 96.1073 Tj
0 -218.347 Td
(5070 ) 21.8426 Tj
0 -227.841 Td
(5071   // Initialize stack.) 117.95 Tj
0 -237.334 Td
(5072   sp = sz;) 65.5277 Tj
0 -246.827 Td
(5073   argp = sz - arglen - 4*\(argc+1\);) 170.372 Tj
0 -256.321 Td
(5074 ) 21.8426 Tj
0 -265.814 Td
(5075   // Copy argv strings and pointers to stack.) 218.426 Tj
0 -275.307 Td
(5076   *\(uint*\)\(mem+argp + 4*argc\) = 0;  // argv[argc]) 235.9 Tj
0 -284.801 Td
(5077   for\(i=argc-1; i>=0; i--\){) 139.792 Tj
0 -294.294 Td
(5078     len = strlen\(argv[i]\) + 1;) 152.898 Tj
0 -303.788 Td
(5079     sp -= len;) 83.0018 Tj
0 -313.281 Td
(5080     memmove\(mem+sp, argv[i], len\);) 170.372 Tj
0 -322.774 Td
(5081     *\(uint*\)\(mem+argp + 4*i\) = sp;  // argv[i]) 222.794 Tj
0 -332.268 Td
(5082   }) 34.9481 Tj
0 -341.761 Td
(5083 ) 21.8426 Tj
0 -351.254 Td
(5084   // Stack frame for main\(argc, argv\), below arguments.) 262.111 Tj
0 -360.748 Td
(5085   sp = argp;) 74.2647 Tj
0 -370.241 Td
(5086   sp -= 4;) 65.5277 Tj
0 -379.734 Td
(5087   *\(uint*\)\(mem+sp\) = argp;) 135.424 Tj
0 -389.228 Td
(5088   sp -= 4;) 65.5277 Tj
0 -398.721 Td
(5089   *\(uint*\)\(mem+sp\) = argc;) 135.424 Tj
0 -408.214 Td
(5090   sp -= 4;) 65.5277 Tj
0 -417.708 Td
(5091   *\(uint*\)\(mem+sp\) = 0xffffffff;   // fake return pc) 249.005 Tj
0 -427.201 Td
(5092 ) 21.8426 Tj
0 -436.695 Td
(5093   // Save program name for debugging.) 183.478 Tj
0 -446.188 Td
(5094   for\(last=s=path; *s; s++\)) 139.792 Tj
0 -455.681 Td
(5095     if\(*s == '/'\)) 96.1073 Tj
0 -465.175 Td
(5096       last = s+1;) 96.1073 Tj
0 -474.668 Td
(5097   safestrcpy\(cp->name, last, sizeof\(cp->name\)\);) 227.163 Tj
0 -484.161 Td
(5098 ) 21.8426 Tj
0 -493.655 Td
(5099 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/exec.c  Page 3) 161.635 Tj
0 -28.4801 Td
(5100   // Commit to the new image.) 148.529 Tj
0 -37.9735 Td
(5101   kfree\(cp->mem, cp->sz\);) 131.055 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.741 Tj
0 -75.9469 Td
(5105   cp->tf->esp = sp;) 104.844 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.92 Td
(5109  bad:) 43.6851 Tj
0 -123.414 Td
(5110   if\(mem\)) 61.1592 Tj
0 -132.907 Td
(5111     kfree\(mem, sz\);) 104.844 Tj
0 -142.4 Td
(5112   iunlockput\(ip\);) 96.1073 Tj
0 -151.894 Td
(5113   return -1;) 74.2647 Tj
0 -161.387 Td
(5114 }) 26.2111 Tj
0 -170.88 Td
(5115 ) 21.8426 Tj
0 -180.374 Td
(5116 ) 21.8426 Tj
0 -189.867 Td
(5117 ) 21.8426 Tj
0 -199.361 Td
(5118 ) 21.8426 Tj
0 -208.854 Td
(5119 ) 21.8426 Tj
0 -218.347 Td
(5120 ) 21.8426 Tj
0 -227.841 Td
(5121 ) 21.8426 Tj
0 -237.334 Td
(5122 ) 21.8426 Tj
0 -246.827 Td
(5123 ) 21.8426 Tj
0 -256.321 Td
(5124 ) 21.8426 Tj
0 -265.814 Td
(5125 ) 21.8426 Tj
0 -275.307 Td
(5126 ) 21.8426 Tj
0 -284.801 Td
(5127 ) 21.8426 Tj
0 -294.294 Td
(5128 ) 21.8426 Tj
0 -303.788 Td
(5129 ) 21.8426 Tj
0 -313.281 Td
(5130 ) 21.8426 Tj
0 -322.774 Td
(5131 ) 21.8426 Tj
0 -332.268 Td
(5132 ) 21.8426 Tj
0 -341.761 Td
(5133 ) 21.8426 Tj
0 -351.254 Td
(5134 ) 21.8426 Tj
0 -360.748 Td
(5135 ) 21.8426 Tj
0 -370.241 Td
(5136 ) 21.8426 Tj
0 -379.734 Td
(5137 ) 21.8426 Tj
0 -389.228 Td
(5138 ) 21.8426 Tj
0 -398.721 Td
(5139 ) 21.8426 Tj
0 -408.214 Td
(5140 ) 21.8426 Tj
0 -417.708 Td
(5141 ) 21.8426 Tj
0 -427.201 Td
(5142 ) 21.8426 Tj
0 -436.695 Td
(5143 ) 21.8426 Tj
0 -446.188 Td
(5144 ) 21.8426 Tj
0 -455.681 Td
(5145 ) 21.8426 Tj
0 -465.175 Td
(5146 ) 21.8426 Tj
0 -474.668 Td
(5147 ) 21.8426 Tj
0 -484.161 Td
(5148 ) 21.8426 Tj
0 -493.655 Td
(5149 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/pipe.c  Page 1) 161.635 Tj
0 -28.4801 Td
(5150 #include "types.h") 100.476 Tj
0 -37.9735 Td
(5151 #include "defs.h") 96.1073 Tj
0 -47.4668 Td
(5152 #include "param.h") 100.476 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.581 Tj
0 -94.9336 Td
(5157 ) 21.8426 Tj
0 -104.427 Td
(5158 #define PIPESIZE 512) 109.213 Tj
0 -113.92 Td
(5159 ) 21.8426 Tj
0 -123.414 Td
(5160 struct pipe {) 78.6333 Tj
0 -132.907 Td
(5161   int readopen;   // read fd is still open) 205.32 Tj
0 -142.4 Td
(5162   int writeopen;  // write fd is still open) 209.689 Tj
0 -151.894 Td
(5163   int writep;     // next index to write) 196.583 Tj
0 -161.387 Td
(5164   int readp;      // next index to read) 192.215 Tj
0 -170.88 Td
(5165   struct spinlock lock;) 122.318 Tj
0 -180.374 Td
(5166   char data[PIPESIZE];) 117.95 Tj
0 -189.867 Td
(5167 };) 30.5796 Tj
0 -199.361 Td
(5168 ) 21.8426 Tj
0 -208.854 Td
(5169 int) 34.9481 Tj
0 -218.347 Td
(5170 pipealloc\(struct file **f0, struct file **f1\)) 218.426 Tj
0 -227.841 Td
(5171 {) 26.2111 Tj
0 -237.334 Td
(5172   struct pipe *p;) 96.1073 Tj
0 -246.827 Td
(5173 ) 21.8426 Tj
0 -256.321 Td
(5174   p = 0;) 56.7907 Tj
0 -265.814 Td
(5175   *f0 = *f1 = 0;) 91.7388 Tj
0 -275.307 Td
(5176   if\(\(*f0 = filealloc\(\)\) == 0 || \(*f1 = filealloc\(\)\
\) == 0\)) 275.216 Tj
0 -284.801 Td
(5177     goto bad;) 78.6333 Tj
0 -294.294 Td
(5178   if\(\(p = \(struct pipe*\)kalloc\(PAGE\)\) == 0\)) 209.689 Tj
0 -303.788 Td
(5179     goto bad;) 78.6333 Tj
0 -313.281 Td
(5180   p->readopen = 1;) 100.476 Tj
0 -322.774 Td
(5181   p->writeopen = 1;) 104.844 Tj
0 -332.268 Td
(5182   p->writep = 0;) 91.7388 Tj
0 -341.761 Td
(5183   p->readp = 0;) 87.3703 Tj
0 -351.254 Td
(5184   initlock\(&p->lock, "pipe"\);) 148.529 Tj
0 -360.748 Td
(5185   \(*f0\)->type = FD_PIPE;) 126.687 Tj
0 -370.241 Td
(5186   \(*f0\)->readable = 1;) 117.95 Tj
0 -379.734 Td
(5187   \(*f0\)->writable = 0;) 117.95 Tj
0 -389.228 Td
(5188   \(*f0\)->pipe = p;) 100.476 Tj
0 -398.721 Td
(5189   \(*f1\)->type = FD_PIPE;) 126.687 Tj
0 -408.214 Td
(5190   \(*f1\)->readable = 0;) 117.95 Tj
0 -417.708 Td
(5191   \(*f1\)->writable = 1;) 117.95 Tj
0 -427.201 Td
(5192   \(*f1\)->pipe = p;) 100.476 Tj
0 -436.695 Td
(5193   return 0;) 69.8962 Tj
0 -446.188 Td
(5194 ) 21.8426 Tj
0 -455.681 Td
(5195 ) 21.8426 Tj
0 -465.175 Td
(5196 ) 21.8426 Tj
0 -474.668 Td
(5197 ) 21.8426 Tj
0 -484.161 Td
(5198 ) 21.8426 Tj
0 -493.655 Td
(5199 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.424 Tj
0 -56.9602 Td
(5203   if\(*f0\){) 65.5277 Tj
0 -66.4535 Td
(5204     \(*f0\)->type = FD_NONE;) 135.424 Tj
0 -75.9469 Td
(5205     fileclose\(*f0\);) 104.844 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.424 Tj
0 -113.92 Td
(5209     fileclose\(*f1\);) 104.844 Tj
0 -123.414 Td
(5210   }) 34.9481 Tj
0 -132.907 Td
(5211   return -1;) 74.2647 Tj
0 -142.4 Td
(5212 }) 26.2111 Tj
0 -151.894 Td
(5213 ) 21.8426 Tj
0 -161.387 Td
(5214 void) 39.3166 Tj
0 -170.88 Td
(5215 pipeclose\(struct pipe *p, int writable\)) 192.215 Tj
0 -180.374 Td
(5216 {) 26.2111 Tj
0 -189.867 Td
(5217   acquire\(&p->lock\);) 109.213 Tj
0 -199.361 Td
(5218   if\(writable\){) 87.3703 Tj
0 -208.854 Td
(5219     p->writeopen = 0;) 113.581 Tj
0 -218.347 Td
(5220     wakeup\(&p->readp\);) 117.95 Tj
0 -227.841 Td
(5221   } else {) 65.5277 Tj
0 -237.334 Td
(5222     p->readopen = 0;) 109.213 Tj
0 -246.827 Td
(5223     wakeup\(&p->writep\);) 122.318 Tj
0 -256.321 Td
(5224   }) 34.9481 Tj
0 -265.814 Td
(5225   release\(&p->lock\);) 109.213 Tj
0 -275.307 Td
(5226 ) 21.8426 Tj
0 -284.801 Td
(5227   if\(p->readopen == 0 && p->writeopen == 0\)) 209.689 Tj
0 -294.294 Td
(5228     kfree\(\(char*\)p, PAGE\);) 135.424 Tj
0 -303.788 Td
(5229 }) 26.2111 Tj
0 -313.281 Td
(5230 ) 21.8426 Tj
0 -322.774 Td
(5231 ) 21.8426 Tj
0 -332.268 Td
(5232 ) 21.8426 Tj
0 -341.761 Td
(5233 ) 21.8426 Tj
0 -351.254 Td
(5234 ) 21.8426 Tj
0 -360.748 Td
(5235 ) 21.8426 Tj
0 -370.241 Td
(5236 ) 21.8426 Tj
0 -379.734 Td
(5237 ) 21.8426 Tj
0 -389.228 Td
(5238 ) 21.8426 Tj
0 -398.721 Td
(5239 ) 21.8426 Tj
0 -408.214 Td
(5240 ) 21.8426 Tj
0 -417.708 Td
(5241 ) 21.8426 Tj
0 -427.201 Td
(5242 ) 21.8426 Tj
0 -436.695 Td
(5243 ) 21.8426 Tj
0 -446.188 Td
(5244 ) 21.8426 Tj
0 -455.681 Td
(5245 ) 21.8426 Tj
0 -465.175 Td
(5246 ) 21.8426 Tj
0 -474.668 Td
(5247 ) 21.8426 Tj
0 -484.161 Td
(5248 ) 21.8426 Tj
0 -493.655 Td
(5249 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.057 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.213 Tj
0 -85.4403 Td
(5256   for\(i = 0; i < n; i++\){) 131.055 Tj
0 -94.9336 Td
(5257     while\(\(\(p->writep + 1\) % PIPESIZE\) == p->readp\){) 249.005 Tj
0 -104.427 Td
(5258       if\(p->readopen == 0 || cp->killed\){) 200.952 Tj
0 -113.92 Td
(5259         release\(&p->lock\);) 135.424 Tj
0 -123.414 Td
(5260         return -1;) 100.476 Tj
0 -132.907 Td
(5261       }) 52.4222 Tj
0 -142.4 Td
(5262       wakeup\(&p->readp\);) 126.687 Tj
0 -151.894 Td
(5263       sleep\(&p->writep, &p->lock\);) 170.372 Tj
0 -161.387 Td
(5264     }) 43.6851 Tj
0 -170.88 Td
(5265     p->data[p->writep] = addr[i];) 166.004 Tj
0 -180.374 Td
(5266     p->writep = \(p->writep + 1\) % PIPESIZE;) 209.689 Tj
0 -189.867 Td
(5267   }) 34.9481 Tj
0 -199.361 Td
(5268   wakeup\(&p->readp\);) 109.213 Tj
0 -208.854 Td
(5269   release\(&p->lock\);) 109.213 Tj
0 -218.347 Td
(5270   return i;) 69.8962 Tj
0 -227.841 Td
(5271 }) 26.2111 Tj
0 -237.334 Td
(5272 ) 21.8426 Tj
0 -246.827 Td
(5273 int) 34.9481 Tj
0 -256.321 Td
(5274 piperead\(struct pipe *p, char *addr, int n\)) 209.689 Tj
0 -265.814 Td
(5275 {) 26.2111 Tj
0 -275.307 Td
(5276   int i;) 56.7907 Tj
0 -284.801 Td
(5277 ) 21.8426 Tj
0 -294.294 Td
(5278   acquire\(&p->lock\);) 109.213 Tj
0 -303.788 Td
(5279   while\(p->readp == p->writep && p->writeopen\){) 227.163 Tj
0 -313.281 Td
(5280     if\(cp->killed\){) 104.844 Tj
0 -322.774 Td
(5281       release\(&p->lock\);) 126.687 Tj
0 -332.268 Td
(5282       return -1;) 91.7388 Tj
0 -341.761 Td
(5283     }) 43.6851 Tj
0 -351.254 Td
(5284     sleep\(&p->readp, &p->lock\);) 157.267 Tj
0 -360.748 Td
(5285   }) 34.9481 Tj
0 -370.241 Td
(5286   for\(i = 0; i < n; i++\){) 131.055 Tj
0 -379.734 Td
(5287     if\(p->readp == p->writep\)) 148.529 Tj
0 -389.228 Td
(5288       break;) 74.2647 Tj
0 -398.721 Td
(5289     addr[i] = p->data[p->readp];) 161.635 Tj
0 -408.214 Td
(5290     p->readp = \(p->readp + 1\) % PIPESIZE;) 200.952 Tj
0 -417.708 Td
(5291   }) 34.9481 Tj
0 -427.201 Td
(5292   wakeup\(&p->writep\);) 113.581 Tj
0 -436.695 Td
(5293   release\(&p->lock\);) 109.213 Tj
0 -446.188 Td
(5294   return i;) 69.8962 Tj
0 -455.681 Td
(5295 }) 26.2111 Tj
0 -465.175 Td
(5296 ) 21.8426 Tj
0 -474.668 Td
(5297 ) 21.8426 Tj
0 -484.161 Td
(5298 ) 21.8426 Tj
0 -493.655 Td
(5299 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/string.c  Page 1) 170.372 Tj
0 -28.4801 Td
(5300 #include "types.h") 100.476 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.92 Td
(5309     *d++ = c;) 78.6333 Tj
0 -123.414 Td
(5310 ) 21.8426 Tj
0 -132.907 Td
(5311   return dst;) 78.6333 Tj
0 -142.4 Td
(5312 }) 26.2111 Tj
0 -151.894 Td
(5313 ) 21.8426 Tj
0 -161.387 Td
(5314 int) 34.9481 Tj
0 -170.88 Td
(5315 memcmp\(const void *v1, const void *v2, uint n\)) 222.794 Tj
0 -180.374 Td
(5316 {) 26.2111 Tj
0 -189.867 Td
(5317   const uchar *s1, *s2;) 122.318 Tj
0 -199.361 Td
(5318 ) 21.8426 Tj
0 -208.854 Td
(5319   s1 = v1;) 65.5277 Tj
0 -218.347 Td
(5320   s2 = v2;) 65.5277 Tj
0 -227.841 Td
(5321   while\(n-- > 0\){) 96.1073 Tj
0 -237.334 Td
(5322     if\(*s1 != *s2\)) 100.476 Tj
0 -246.827 Td
(5323       return *s1 - *s2;) 122.318 Tj
0 -256.321 Td
(5324     s1++, s2++;) 87.3703 Tj
0 -265.814 Td
(5325   }) 34.9481 Tj
0 -275.307 Td
(5326 ) 21.8426 Tj
0 -284.801 Td
(5327   return 0;) 69.8962 Tj
0 -294.294 Td
(5328 }) 26.2111 Tj
0 -303.788 Td
(5329 ) 21.8426 Tj
0 -313.281 Td
(5330 void*) 43.6851 Tj
0 -322.774 Td
(5331 memmove\(void *dst, const void *src, uint n\)) 209.689 Tj
0 -332.268 Td
(5332 {) 26.2111 Tj
0 -341.761 Td
(5333   const char *s;) 91.7388 Tj
0 -351.254 Td
(5334   char *d;) 65.5277 Tj
0 -360.748 Td
(5335 ) 21.8426 Tj
0 -370.241 Td
(5336   s = src;) 65.5277 Tj
0 -379.734 Td
(5337   d = dst;) 65.5277 Tj
0 -389.228 Td
(5338   if\(s < d && s + n > d\){) 131.055 Tj
0 -398.721 Td
(5339     s += n;) 69.8962 Tj
0 -408.214 Td
(5340     d += n;) 69.8962 Tj
0 -417.708 Td
(5341     while\(n-- > 0\)) 100.476 Tj
0 -427.201 Td
(5342       *--d = *--s;) 100.476 Tj
0 -436.695 Td
(5343   } else) 56.7907 Tj
0 -446.188 Td
(5344     while\(n-- > 0\)) 100.476 Tj
0 -455.681 Td
(5345       *d++ = *s++;) 100.476 Tj
0 -465.175 Td
(5346 ) 21.8426 Tj
0 -474.668 Td
(5347   return dst;) 78.6333 Tj
0 -484.161 Td
(5348 }) 26.2111 Tj
0 -493.655 Td
(5349 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/string.c  Page 2) 170.372 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.426 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.476 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.267 Tj
0 -104.427 Td
(5358 }) 26.2111 Tj
0 -113.92 Td
(5359 ) 21.8426 Tj
0 -123.414 Td
(5360 char*) 43.6851 Tj
0 -132.907 Td
(5361 strncpy\(char *s, const char *t, int n\)) 187.846 Tj
0 -142.4 Td
(5362 {) 26.2111 Tj
0 -151.894 Td
(5363   char *os;) 69.8962 Tj
0 -161.387 Td
(5364 ) 21.8426 Tj
0 -170.88 Td
(5365   os = s;) 61.1592 Tj
0 -180.374 Td
(5366   while\(n-- > 0 && \(*s++ = *t++\) != 0\)) 187.846 Tj
0 -189.867 Td
(5367     ;) 43.6851 Tj
0 -199.361 Td
(5368   while\(n-- > 0\)) 91.7388 Tj
0 -208.854 Td
(5369     *s++ = 0;) 78.6333 Tj
0 -218.347 Td
(5370   return os;) 74.2647 Tj
0 -227.841 Td
(5371 }) 26.2111 Tj
0 -237.334 Td
(5372 ) 21.8426 Tj
0 -246.827 Td
(5373 // Like strncpy but guaranteed to NUL-terminate.) 231.531 Tj
0 -256.321 Td
(5374 char*) 43.6851 Tj
0 -265.814 Td
(5375 safestrcpy\(char *s, const char *t, int n\)) 200.952 Tj
0 -275.307 Td
(5376 {) 26.2111 Tj
0 -284.801 Td
(5377   char *os;) 69.8962 Tj
0 -294.294 Td
(5378 ) 21.8426 Tj
0 -303.788 Td
(5379   os = s;) 61.1592 Tj
0 -313.281 Td
(5380   if\(n <= 0\)) 74.2647 Tj
0 -322.774 Td
(5381     return os;) 83.0018 Tj
0 -332.268 Td
(5382   while\(--n > 0 && \(*s++ = *t++\) != 0\)) 187.846 Tj
0 -341.761 Td
(5383     ;) 43.6851 Tj
0 -351.254 Td
(5384   *s = 0;) 61.1592 Tj
0 -360.748 Td
(5385   return os;) 74.2647 Tj
0 -370.241 Td
(5386 }) 26.2111 Tj
0 -379.734 Td
(5387 ) 21.8426 Tj
0 -389.228 Td
(5388 int) 34.9481 Tj
0 -398.721 Td
(5389 strlen\(const char *s\)) 113.581 Tj
0 -408.214 Td
(5390 {) 26.2111 Tj
0 -417.708 Td
(5391   int n;) 56.7907 Tj
0 -427.201 Td
(5392 ) 21.8426 Tj
0 -436.695 Td
(5393   for\(n = 0; s[n]; n++\)) 122.318 Tj
0 -446.188 Td
(5394     ;) 43.6851 Tj
0 -455.681 Td
(5395   return n;) 69.8962 Tj
0 -465.175 Td
(5396 }) 26.2111 Tj
0 -474.668 Td
(5397 ) 21.8426 Tj
0 -484.161 Td
(5398 ) 21.8426 Tj
0 -493.655 Td
(5399 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/mp.h  Page 1) 152.898 Tj
0 -28.4801 Td
(5400 // See MultiProcessor Specification Version 1.[14]) 240.268 Tj
0 -37.9735 Td
(5401 ) 21.8426 Tj
0 -47.4668 Td
(5402 struct mp {             // floating pointer) 209.689 Tj
0 -56.9602 Td
(5403   uchar signature[4];           // "_MP_") 200.952 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.109 Tj
0 -85.4403 Td
(5406   uchar specrev;                // [14]) 192.215 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.479 Tj
0 -113.92 Td
(5409   uchar imcrp;) 83.0018 Tj
0 -123.414 Td
(5410   uchar reserved[3];) 109.213 Tj
0 -132.907 Td
(5411 };) 30.5796 Tj
0 -142.4 Td
(5412 ) 21.8426 Tj
0 -151.894 Td
(5413 struct mpconf {         // configuration table header) 253.374 Tj
0 -161.387 Td
(5414   uchar signature[4];           // "PCMP") 200.952 Tj
0 -170.88 Td
(5415   ushort length;                // total table length) 253.374 Tj
0 -180.374 Td
(5416   uchar version;                // [14]) 192.215 Tj
0 -189.867 Td
(5417   uchar checksum;               // all bytes must add up t\
o 0) 288.322 Tj
0 -199.361 Td
(5418   uchar product[20];            // product id) 218.426 Tj
0 -208.854 Td
(5419   uint *oemtable;               // OEM table pointer) 249.005 Tj
0 -218.347 Td
(5420   ushort oemlength;             // OEM table length) 244.637 Tj
0 -227.841 Td
(5421   ushort entry;                 // entry count) 222.794 Tj
0 -237.334 Td
(5422   uint *lapicaddr;              // address of local APIC) 266.479 Tj
0 -246.827 Td
(5423   ushort xlength;               // extended table length) 266.479 Tj
0 -256.321 Td
(5424   uchar xchecksum;              // extended table checksum) 275.216 Tj
0 -265.814 Td
(5425   uchar reserved;) 96.1073 Tj
0 -275.307 Td
(5426 };) 30.5796 Tj
0 -284.801 Td
(5427 ) 21.8426 Tj
0 -294.294 Td
(5428 struct mpproc {         // processor table entry) 231.531 Tj
0 -303.788 Td
(5429   uchar type;                   // entry type \(0\)) 235.9 Tj
0 -313.281 Td
(5430   uchar apicid;                 // local APIC id) 231.531 Tj
0 -322.774 Td
(5431   uchar version;                // local APIC verison) 253.374 Tj
0 -332.268 Td
(5432   uchar flags;                  // CPU flags) 214.057 Tj
0 -341.761 Td
(5433     #define MPBOOT 0x02           // This proc is the boot\
strap processor.) 345.113 Tj
0 -351.254 Td
(5434   uchar signature[4];           // CPU signature) 231.531 Tj
0 -360.748 Td
(5435   uint feature;                 // feature flags from CPUI\
D instruction) 332.007 Tj
0 -370.241 Td
(5436   uchar reserved[8];) 109.213 Tj
0 -379.734 Td
(5437 };) 30.5796 Tj
0 -389.228 Td
(5438 ) 21.8426 Tj
0 -398.721 Td
(5439 struct mpioapic {       // I/O APIC table entry) 227.163 Tj
0 -408.214 Td
(5440   uchar type;                   // entry type \(2\)) 235.9 Tj
0 -417.708 Td
(5441   uchar apicno;                 // I/O APIC id) 222.794 Tj
0 -427.201 Td
(5442   uchar version;                // I/O APIC version) 244.637 Tj
0 -436.695 Td
(5443   uchar flags;                  // I/O APIC flags) 235.9 Tj
0 -446.188 Td
(5444   uint *addr;                  // I/O APIC address) 240.268 Tj
0 -455.681 Td
(5445 };) 30.5796 Tj
0 -465.175 Td
(5446 ) 21.8426 Tj
0 -474.668 Td
(5447 ) 21.8426 Tj
0 -484.161 Td
(5448 ) 21.8426 Tj
0 -493.655 Td
(5449 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/mp.h  Page 2) 152.898 Tj
0 -28.4801 Td
(5450 // Table entry types) 109.213 Tj
0 -37.9735 Td
(5451 #define MPPROC    0x00  // One per processor) 214.057 Tj
0 -47.4668 Td
(5452 #define MPBUS     0x01  // One per bus) 187.846 Tj
0 -56.9602 Td
(5453 #define MPIOAPIC  0x02  // One per I/O APIC) 209.689 Tj
0 -66.4535 Td
(5454 #define MPIOINTR  0x03  // One per bus interrupt source) 262.111 Tj
0 -75.9469 Td
(5455 #define MPLINTR   0x04  // One per system interrupt source) 275.216 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.92 Td
(5459 ) 21.8426 Tj
0 -123.414 Td
(5460 ) 21.8426 Tj
0 -132.907 Td
(5461 ) 21.8426 Tj
0 -142.4 Td
(5462 ) 21.8426 Tj
0 -151.894 Td
(5463 ) 21.8426 Tj
0 -161.387 Td
(5464 ) 21.8426 Tj
0 -170.88 Td
(5465 ) 21.8426 Tj
0 -180.374 Td
(5466 ) 21.8426 Tj
0 -189.867 Td
(5467 ) 21.8426 Tj
0 -199.361 Td
(5468 ) 21.8426 Tj
0 -208.854 Td
(5469 ) 21.8426 Tj
0 -218.347 Td
(5470 ) 21.8426 Tj
0 -227.841 Td
(5471 ) 21.8426 Tj
0 -237.334 Td
(5472 ) 21.8426 Tj
0 -246.827 Td
(5473 ) 21.8426 Tj
0 -256.321 Td
(5474 ) 21.8426 Tj
0 -265.814 Td
(5475 ) 21.8426 Tj
0 -275.307 Td
(5476 ) 21.8426 Tj
0 -284.801 Td
(5477 ) 21.8426 Tj
0 -294.294 Td
(5478 ) 21.8426 Tj
0 -303.788 Td
(5479 ) 21.8426 Tj
0 -313.281 Td
(5480 ) 21.8426 Tj
0 -322.774 Td
(5481 ) 21.8426 Tj
0 -332.268 Td
(5482 ) 21.8426 Tj
0 -341.761 Td
(5483 ) 21.8426 Tj
0 -351.254 Td
(5484 ) 21.8426 Tj
0 -360.748 Td
(5485 ) 21.8426 Tj
0 -370.241 Td
(5486 ) 21.8426 Tj
0 -379.734 Td
(5487 ) 21.8426 Tj
0 -389.228 Td
(5488 ) 21.8426 Tj
0 -398.721 Td
(5489 ) 21.8426 Tj
0 -408.214 Td
(5490 ) 21.8426 Tj
0 -417.708 Td
(5491 ) 21.8426 Tj
0 -427.201 Td
(5492 ) 21.8426 Tj
0 -436.695 Td
(5493 ) 21.8426 Tj
0 -446.188 Td
(5494 ) 21.8426 Tj
0 -455.681 Td
(5495 ) 21.8426 Tj
0 -465.175 Td
(5496 ) 21.8426 Tj
0 -474.668 Td
(5497 ) 21.8426 Tj
0 -484.161 Td
(5498 ) 21.8426 Tj
0 -493.655 Td
(5499 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.163 Tj
0 -47.4668 Td
(5502 // http://developer.intel.com/design/pentium/datashts/2420\
1606.pdf) 310.165 Tj
0 -56.9602 Td
(5503 ) 21.8426 Tj
0 -66.4535 Td
(5504 #include "types.h") 100.476 Tj
0 -75.9469 Td
(5505 #include "defs.h") 96.1073 Tj
0 -85.4403 Td
(5506 #include "param.h") 100.476 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.92 Td
(5509 #include "mmu.h") 91.7388 Tj
0 -123.414 Td
(5510 #include "proc.h") 96.1073 Tj
0 -132.907 Td
(5511 ) 21.8426 Tj
0 -142.4 Td
(5512 struct cpu cpus[NCPU];) 117.95 Tj
0 -151.894 Td
(5513 static struct cpu *bcpu;) 126.687 Tj
0 -161.387 Td
(5514 int ismp;) 61.1592 Tj
0 -170.88 Td
(5515 int ncpu;) 61.1592 Tj
0 -180.374 Td
(5516 uchar ioapic_id;) 91.7388 Tj
0 -189.867 Td
(5517 ) 21.8426 Tj
0 -199.361 Td
(5518 int) 34.9481 Tj
0 -208.854 Td
(5519 mp_bcpu\(void\)) 78.6333 Tj
0 -218.347 Td
(5520 {) 26.2111 Tj
0 -227.841 Td
(5521   return bcpu-cpus;) 104.844 Tj
0 -237.334 Td
(5522 }) 26.2111 Tj
0 -246.827 Td
(5523 ) 21.8426 Tj
0 -256.321 Td
(5524 static uchar) 74.2647 Tj
0 -265.814 Td
(5525 sum\(uchar *addr, int len\)) 131.055 Tj
0 -275.307 Td
(5526 {) 26.2111 Tj
0 -284.801 Td
(5527   int i, sum;) 78.6333 Tj
0 -294.294 Td
(5528 ) 21.8426 Tj
0 -303.788 Td
(5529   sum = 0;) 65.5277 Tj
0 -313.281 Td
(5530   for\(i=0; i<len; i++\)) 117.95 Tj
0 -322.774 Td
(5531     sum += addr[i];) 104.844 Tj
0 -332.268 Td
(5532   return sum;) 78.6333 Tj
0 -341.761 Td
(5533 }) 26.2111 Tj
0 -351.254 Td
(5534 ) 21.8426 Tj
0 -360.748 Td
(5535 // Look for an MP structure in the len bytes at addr.) 253.374 Tj
0 -370.241 Td
(5536 static struct mp*) 96.1073 Tj
0 -379.734 Td
(5537 mp_search1\(uchar *addr, int len\)) 161.635 Tj
0 -389.228 Td
(5538 {) 26.2111 Tj
0 -398.721 Td
(5539   uchar *e, *p;) 87.3703 Tj
0 -408.214 Td
(5540 ) 21.8426 Tj
0 -417.708 Td
(5541   e = addr+len;) 87.3703 Tj
0 -427.201 Td
(5542   for\(p = addr; p < e; p += sizeof\(struct mp\)\)) 222.794 Tj
0 -436.695 Td
(5543     if\(memcmp\(p, "_MP_", 4\) == 0 && sum\(p, sizeof\(str\
uct mp\)\) == 0\)) 314.533 Tj
0 -446.188 Td
(5544       return \(struct mp*\)p;) 139.792 Tj
0 -455.681 Td
(5545   return 0;) 69.8962 Tj
0 -465.175 Td
(5546 }) 26.2111 Tj
0 -474.668 Td
(5547 ) 21.8426 Tj
0 -484.161 Td
(5548 ) 21.8426 Tj
0 -493.655 Td
(5549 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.007 Tj
0 -37.9735 Td
(5551 // spec is in one of the following three locations:) 244.637 Tj
0 -47.4668 Td
(5552 // 1\) in the first KB of the EBDA;) 170.372 Tj
0 -56.9602 Td
(5553 // 2\) in the last KB of system base memory;) 209.689 Tj
0 -66.4535 Td
(5554 // 3\) in the BIOS ROM between 0xE0000 and 0xFFFFF.) 240.268 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.92 Td
(5559   uint p;) 61.1592 Tj
0 -123.414 Td
(5560   struct mp *mp;) 91.7388 Tj
0 -132.907 Td
(5561 ) 21.8426 Tj
0 -142.4 Td
(5562   bda = \(uchar*\)0x400;) 117.95 Tj
0 -151.894 Td
(5563   if\(\(p = \(bda[0x0F]<<8\)|bda[0x0E]\)\){) 183.478 Tj
0 -161.387 Td
(5564     if\(\(mp = mp_search1\(\(uchar*\)p, 1024\)\)\)) 205.32 Tj
0 -170.88 Td
(5565       return mp;) 91.7388 Tj
0 -180.374 Td
(5566   } else {) 65.5277 Tj
0 -189.867 Td
(5567     p = \(\(bda[0x14]<<8\)|bda[0x13]\)*1024;) 196.583 Tj
0 -199.361 Td
(5568     if\(\(mp = mp_search1\(\(uchar*\)p-1024, 1024\)\)\)) 227.163 Tj
0 -208.854 Td
(5569       return mp;) 91.7388 Tj
0 -218.347 Td
(5570   }) 34.9481 Tj
0 -227.841 Td
(5571   return mp_search1\(\(uchar*\)0xF0000, 0x10000\);) 222.794 Tj
0 -237.334 Td
(5572 }) 26.2111 Tj
0 -246.827 Td
(5573 ) 21.8426 Tj
0 -256.321 Td
(5574 // Search for an MP configuration table.  For now,) 240.268 Tj
0 -265.814 Td
(5575 // don't accept the default configurations \(physaddr == 0\
\).) 279.585 Tj
0 -275.307 Td
(5576 // Check for correct signature, calculate the checksum and\
,) 279.585 Tj
0 -284.801 Td
(5577 // if correct, check the version.) 166.004 Tj
0 -294.294 Td
(5578 // To do: check extended table checksum.) 196.583 Tj
0 -303.788 Td
(5579 static struct mpconf*) 113.581 Tj
0 -313.281 Td
(5580 mp_config\(struct mp **pmp\)) 135.424 Tj
0 -322.774 Td
(5581 {) 26.2111 Tj
0 -332.268 Td
(5582   struct mpconf *conf;) 117.95 Tj
0 -341.761 Td
(5583   struct mp *mp;) 91.7388 Tj
0 -351.254 Td
(5584 ) 21.8426 Tj
0 -360.748 Td
(5585   if\(\(mp = mp_search\(\)\) == 0 || mp->physaddr == 0\)) 240.268 Tj
0 -370.241 Td
(5586     return 0;) 78.6333 Tj
0 -379.734 Td
(5587   conf = \(struct mpconf*\)mp->physaddr;) 187.846 Tj
0 -389.228 Td
(5588   if\(memcmp\(conf, "PCMP", 4\) != 0\)) 170.372 Tj
0 -398.721 Td
(5589     return 0;) 78.6333 Tj
0 -408.214 Td
(5590   if\(conf->version != 1 && conf->version != 4\)) 222.794 Tj
0 -417.708 Td
(5591     return 0;) 78.6333 Tj
0 -427.201 Td
(5592   if\(sum\(\(uchar*\)conf, conf->length\) != 0\)) 205.32 Tj
0 -436.695 Td
(5593     return 0;) 78.6333 Tj
0 -446.188 Td
(5594   *pmp = mp;) 74.2647 Tj
0 -455.681 Td
(5595   return conf;) 83.0018 Tj
0 -465.175 Td
(5596 }) 26.2111 Tj
0 -474.668 Td
(5597 ) 21.8426 Tj
0 -484.161 Td
(5598 ) 21.8426 Tj
0 -493.655 Td
(5599 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  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.95 Tj
0 -85.4403 Td
(5606   struct mpproc *proc;) 117.95 Tj
0 -94.9336 Td
(5607   struct mpioapic *ioapic;) 135.424 Tj
0 -104.427 Td
(5608 ) 21.8426 Tj
0 -113.92 Td
(5609   bcpu = &cpus[ncpu];) 113.581 Tj
0 -123.414 Td
(5610   if\(\(conf = mp_config\(&mp\)\) == 0\)) 170.372 Tj
0 -132.907 Td
(5611     return;) 69.8962 Tj
0 -142.4 Td
(5612 ) 21.8426 Tj
0 -151.894 Td
(5613   ismp = 1;) 69.8962 Tj
0 -161.387 Td
(5614   lapic = \(uint*\)conf->lapicaddr;) 166.004 Tj
0 -170.88 Td
(5615 ) 21.8426 Tj
0 -180.374 Td
(5616   for\(p=\(uchar*\)\(conf+1\), e=\(uchar*\)conf+conf->leng\
th; p<e; \){) 292.69 Tj
0 -189.867 Td
(5617     switch\(*p\){) 87.3703 Tj
0 -199.361 Td
(5618     case MPPROC:) 91.7388 Tj
0 -208.854 Td
(5619       proc = \(struct mpproc*\)p;) 157.267 Tj
0 -218.347 Td
(5620       cpus[ncpu].apicid = proc->apicid;) 192.215 Tj
0 -227.841 Td
(5621       if\(proc->flags & MPBOOT\)) 152.898 Tj
0 -237.334 Td
(5622         bcpu = &cpus[ncpu];) 139.792 Tj
0 -246.827 Td
(5623       ncpu++;) 78.6333 Tj
0 -256.321 Td
(5624       p += sizeof\(struct mpproc\);) 166.004 Tj
0 -265.814 Td
(5625       continue;) 87.3703 Tj
0 -275.307 Td
(5626     case MPIOAPIC:) 100.476 Tj
0 -284.801 Td
(5627       ioapic = \(struct mpioapic*\)p;) 174.741 Tj
0 -294.294 Td
(5628       ioapic_id = ioapic->apicno;) 166.004 Tj
0 -303.788 Td
(5629       p += sizeof\(struct mpioapic\);) 174.741 Tj
0 -313.281 Td
(5630       continue;) 87.3703 Tj
0 -322.774 Td
(5631     case MPBUS:) 87.3703 Tj
0 -332.268 Td
(5632     case MPIOINTR:) 100.476 Tj
0 -341.761 Td
(5633     case MPLINTR:) 96.1073 Tj
0 -351.254 Td
(5634       p += 8;) 78.6333 Tj
0 -360.748 Td
(5635       continue;) 87.3703 Tj
0 -370.241 Td
(5636     default:) 74.2647 Tj
0 -379.734 Td
(5637       cprintf\("mp_init: unknown config type %x\\n", *p\);) 262.111 Tj
0 -389.228 Td
(5638       panic\("mp_init"\);) 122.318 Tj
0 -398.721 Td
(5639     }) 43.6851 Tj
0 -408.214 Td
(5640   }) 34.9481 Tj
0 -417.708 Td
(5641 ) 21.8426 Tj
0 -427.201 Td
(5642   if\(mp->imcrp\){) 91.7388 Tj
0 -436.695 Td
(5643     // Bochs doesn't support IMCR, so this doesn't run on \
Bochs.) 301.427 Tj
0 -446.188 Td
(5644     // But it would on real hardware.) 183.478 Tj
0 -455.681 Td
(5645     outb\(0x22, 0x70\);   // Select IMCR) 187.846 Tj
0 -465.175 Td
(5646     outb\(0x23, inb\(0x23\) | 1\);  // Mask external inter\
rupts.) 283.953 Tj
0 -474.668 Td
(5647   }) 34.9481 Tj
0 -484.161 Td
(5648 }) 26.2111 Tj
0 -493.655 Td
(5649 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/lapic.c  Page 1) 166.004 Tj
0 -28.4801 Td
(5650 // The local APIC manages internal \(non-I/O\) interrupts.) 266.479 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.476 Tj
0 -66.4535 Td
(5654 #include "traps.h") 100.476 Tj
0 -75.9469 Td
(5655 ) 21.8426 Tj
0 -85.4403 Td
(5656 // Local APIC registers, divided by 4 for use as uint[] in\
dices.) 301.427 Tj
0 -94.9336 Td
(5657 #define ID      \(0x0020/4\)   // ID) 170.372 Tj
0 -104.427 Td
(5658 #define VER     \(0x0030/4\)   // Version) 192.215 Tj
0 -113.92 Td
(5659 #define TPR     \(0x0080/4\)   // Task Priority) 218.426 Tj
0 -123.414 Td
(5660 #define EOI     \(0x00B0/4\)   // EOI) 174.741 Tj
0 -132.907 Td
(5661 #define SVR     \(0x00F0/4\)   // Spurious Interrupt Vecto\
r) 270.848 Tj
0 -142.4 Td
(5662   #define ENABLE     0x00000100   // Unit Enable) 231.531 Tj
0 -151.894 Td
(5663 #define ESR     \(0x0280/4\)   // Error Status) 214.057 Tj
0 -161.387 Td
(5664 #define ICRLO   \(0x0300/4\)   // Interrupt Command) 235.9 Tj
0 -170.88 Td
(5665   #define INIT       0x00000500   // INIT/RESET) 227.163 Tj
0 -180.374 Td
(5666   #define STARTUP    0x00000600   // Startup IPI) 231.531 Tj
0 -189.867 Td
(5667   #define DELIVS     0x00001000   // Delivery status) 249.005 Tj
0 -199.361 Td
(5668   #define ASSERT     0x00004000   // Assert interrupt \(vs\
 deassert\)) 314.533 Tj
0 -208.854 Td
(5669   #define LEVEL      0x00008000   // Level triggered) 249.005 Tj
0 -218.347 Td
(5670   #define BCAST      0x00080000   // Send to all APICs, in\
cluding self.) 332.007 Tj
0 -227.841 Td
(5671 #define ICRHI   \(0x0310/4\)   // Interrupt Command [63:32\
]) 270.848 Tj
0 -237.334 Td
(5672 #define TIMER   \(0x0320/4\)   // Local Vector Table 0 \(T\
IMER\)) 283.953 Tj
0 -246.827 Td
(5673   #define X1         0x0000000B   // divide counts by 1) 262.111 Tj
0 -256.321 Td
(5674   #define PERIODIC   0x00020000   // Periodic) 218.426 Tj
0 -265.814 Td
(5675 #define PCINT   \(0x0340/4\)   // Performance Counter LVT) 262.111 Tj
0 -275.307 Td
(5676 #define LINT0   \(0x0350/4\)   // Local Vector Table 1 \(L\
INT0\)) 283.953 Tj
0 -284.801 Td
(5677 #define LINT1   \(0x0360/4\)   // Local Vector Table 2 \(L\
INT1\)) 283.953 Tj
0 -294.294 Td
(5678 #define ERROR   \(0x0370/4\)   // Local Vector Table 3 \(E\
RROR\)) 283.953 Tj
0 -303.788 Td
(5679   #define MASKED     0x00010000   // Interrupt masked) 253.374 Tj
0 -313.281 Td
(5680 #define TICR    \(0x0380/4\)   // Timer Initial Count) 244.637 Tj
0 -322.774 Td
(5681 #define TCCR    \(0x0390/4\)   // Timer Current Count) 244.637 Tj
0 -332.268 Td
(5682 #define TDCR    \(0x03E0/4\)   // Timer Divide Configurati\
on) 275.216 Tj
0 -341.761 Td
(5683 ) 21.8426 Tj
0 -351.254 Td
(5684 volatile uint *lapic;  // Initialized in mp.c) 218.426 Tj
0 -360.748 Td
(5685 ) 21.8426 Tj
0 -370.241 Td
(5686 ) 21.8426 Tj
0 -379.734 Td
(5687 ) 21.8426 Tj
0 -389.228 Td
(5688 ) 21.8426 Tj
0 -398.721 Td
(5689 ) 21.8426 Tj
0 -408.214 Td
(5690 ) 21.8426 Tj
0 -417.708 Td
(5691 ) 21.8426 Tj
0 -427.201 Td
(5692 ) 21.8426 Tj
0 -436.695 Td
(5693 ) 21.8426 Tj
0 -446.188 Td
(5694 ) 21.8426 Tj
0 -455.681 Td
(5695 ) 21.8426 Tj
0 -465.175 Td
(5696 ) 21.8426 Tj
0 -474.668 Td
(5697 ) 21.8426 Tj
0 -484.161 Td
(5698 ) 21.8426 Tj
0 -493.655 Td
(5699 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/lapic.c  Page 2) 166.004 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.742 Tj
0 -94.9336 Td
(5707   lapic[SVR] = ENABLE | \(IRQ_OFFSET+IRQ_SPURIOUS\);) 240.268 Tj
0 -104.427 Td
(5708 ) 21.8426 Tj
0 -113.92 Td
(5709   // The timer repeatedly counts down at bus frequency) 257.742 Tj
0 -123.414 Td
(5710   // from lapic[TICR] and then issues an interrupt.) 244.637 Tj
0 -132.907 Td
(5711   // Lapic[TCCR] is the current counter value.) 222.794 Tj
0 -142.4 Td
(5712   // If xv6 cared more about precise timekeeping, the) 253.374 Tj
0 -151.894 Td
(5713   // values of TICR and TCCR would be calibrated using) 257.742 Tj
0 -161.387 Td
(5714   // an external time source.) 148.529 Tj
0 -170.88 Td
(5715   lapic[TDCR] = X1;) 104.844 Tj
0 -180.374 Td
(5716   lapic[TICR] = 10000000;) 131.055 Tj
0 -189.867 Td
(5717   lapic[TCCR] = 10000000;) 131.055 Tj
0 -199.361 Td
(5718   lapic[TIMER] = PERIODIC | \(IRQ_OFFSET + IRQ_TIMER\);) 253.374 Tj
0 -208.854 Td
(5719 ) 21.8426 Tj
0 -218.347 Td
(5720   // Disable logical interrupt lines.) 183.478 Tj
0 -227.841 Td
(5721   lapic[LINT0] = MASKED;) 126.687 Tj
0 -237.334 Td
(5722   lapic[LINT1] = MASKED;) 126.687 Tj
0 -246.827 Td
(5723 ) 21.8426 Tj
0 -256.321 Td
(5724   // Disable performance counter overflow interrupts) 249.005 Tj
0 -265.814 Td
(5725   // on machines that provide that interrupt entry.) 244.637 Tj
0 -275.307 Td
(5726   if\(\(\(lapic[VER]>>16\) & 0xFF\) >= 4\)) 179.109 Tj
0 -284.801 Td
(5727     lapic[PCINT] = MASKED;) 135.424 Tj
0 -294.294 Td
(5728 ) 21.8426 Tj
0 -303.788 Td
(5729   // Map error interrupt to IRQ_ERROR.) 187.846 Tj
0 -313.281 Td
(5730   lapic[ERROR] = IRQ_OFFSET+IRQ_ERROR;) 187.846 Tj
0 -322.774 Td
(5731 ) 21.8426 Tj
0 -332.268 Td
(5732   // Clear error status register \(requires back-to-back w\
rites\).) 301.427 Tj
0 -341.761 Td
(5733   lapic[ESR] = 0;) 96.1073 Tj
0 -351.254 Td
(5734   lapic[ESR] = 0;) 96.1073 Tj
0 -360.748 Td
(5735 ) 21.8426 Tj
0 -370.241 Td
(5736   // Ack any outstanding interrupts.) 179.109 Tj
0 -379.734 Td
(5737   lapic[EOI] = 0;) 96.1073 Tj
0 -389.228 Td
(5738 ) 21.8426 Tj
0 -398.721 Td
(5739   // Send an Init Level De-Assert to synchronise arbitrati\
on ID's.) 310.165 Tj
0 -408.214 Td
(5740   lapic[ICRHI] = 0;) 104.844 Tj
0 -417.708 Td
(5741   lapic[ICRLO] = BCAST | INIT | LEVEL;) 187.846 Tj
0 -427.201 Td
(5742   while\(lapic[ICRLO] & DELIVS\)) 152.898 Tj
0 -436.695 Td
(5743     ;) 43.6851 Tj
0 -446.188 Td
(5744 ) 21.8426 Tj
0 -455.681 Td
(5745   // Enable interrupts on the APIC \(but not on the proces\
sor\).) 292.69 Tj
0 -465.175 Td
(5746   lapic[TPR] = 0;) 96.1073 Tj
0 -474.668 Td
(5747 }) 26.2111 Tj
0 -484.161 Td
(5748 ) 21.8426 Tj
0 -493.655 Td
(5749 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/lapic.c  Page 3) 166.004 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   if\(lapic\)) 69.8962 Tj
0 -66.4535 Td
(5754     return lapic[ID]>>24;) 131.055 Tj
0 -75.9469 Td
(5755   return 0;) 69.8962 Tj
0 -85.4403 Td
(5756 }) 26.2111 Tj
0 -94.9336 Td
(5757 ) 21.8426 Tj
0 -104.427 Td
(5758 // Acknowledge interrupt.) 131.055 Tj
0 -113.92 Td
(5759 void) 39.3166 Tj
0 -123.414 Td
(5760 lapic_eoi\(void\)) 87.3703 Tj
0 -132.907 Td
(5761 {) 26.2111 Tj
0 -142.4 Td
(5762   if\(lapic\)) 69.8962 Tj
0 -151.894 Td
(5763     lapic[EOI] = 0;) 104.844 Tj
0 -161.387 Td
(5764 }) 26.2111 Tj
0 -170.88 Td
(5765 ) 21.8426 Tj
0 -180.374 Td
(5766 // Spin for a given number of microseconds.) 209.689 Tj
0 -189.867 Td
(5767 // On real hardware would want to tune this dynamically.) 266.479 Tj
0 -199.361 Td
(5768 static void) 69.8962 Tj
0 -208.854 Td
(5769 microdelay\(int us\)) 100.476 Tj
0 -218.347 Td
(5770 {) 26.2111 Tj
0 -227.841 Td
(5771   volatile int j = 0;) 113.581 Tj
0 -237.334 Td
(5772 ) 21.8426 Tj
0 -246.827 Td
(5773   while\(us-- > 0\)) 96.1073 Tj
0 -256.321 Td
(5774     for\(j=0; j<10000; j++\);) 139.792 Tj
0 -265.814 Td
(5775 }) 26.2111 Tj
0 -275.307 Td
(5776 ) 21.8426 Tj
0 -284.801 Td
(5777 // Start additional processor running bootstrap code at ad\
dr.) 288.322 Tj
0 -294.294 Td
(5778 // See Appendix B of MultiProcessor Specification.) 240.268 Tj
0 -303.788 Td
(5779 void) 39.3166 Tj
0 -313.281 Td
(5780 lapic_startap\(uchar apicid, uint addr\)) 187.846 Tj
0 -322.774 Td
(5781 {) 26.2111 Tj
0 -332.268 Td
(5782   int i;) 56.7907 Tj
0 -341.761 Td
(5783   volatile int j = 0;) 113.581 Tj
0 -351.254 Td
(5784 ) 21.8426 Tj
0 -360.748 Td
(5785   // Send INIT interrupt to reset other CPU.) 214.057 Tj
0 -370.241 Td
(5786   lapic[ICRHI] = apicid<<24;) 144.161 Tj
0 -379.734 Td
(5787   lapic[ICRLO] = INIT | LEVEL;) 152.898 Tj
0 -389.228 Td
(5788   microdelay\(10\);) 96.1073 Tj
0 -398.721 Td
(5789 ) 21.8426 Tj
0 -408.214 Td
(5790   // Send startup IPI \(twice!\) to enter bootstrap code.) 262.111 Tj
0 -417.708 Td
(5791   for\(i = 0; i < 2; i++\){) 131.055 Tj
0 -427.201 Td
(5792     lapic[ICRHI] = apicid<<24;) 152.898 Tj
0 -436.695 Td
(5793     lapic[ICRLO] = STARTUP | \(addr>>12\);) 196.583 Tj
0 -446.188 Td
(5794     for\(j=0; j<10000; j++\);  // 200us) 183.478 Tj
0 -455.681 Td
(5795   }) 34.9481 Tj
0 -465.175 Td
(5796 }) 26.2111 Tj
0 -474.668 Td
(5797 ) 21.8426 Tj
0 -484.161 Td
(5798 ) 21.8426 Tj
0 -493.655 Td
(5799 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/ioapic.c  Page 1) 170.372 Tj
0 -28.4801 Td
(5800 // The I/O APIC manages hardware interrupts for an SMP sys\
tem.) 292.69 Tj
0 -37.9735 Td
(5801 // http://www.intel.com/design/chipsets/datashts/29056601.\
pdf) 288.322 Tj
0 -47.4668 Td
(5802 // See also picirq.c.) 113.581 Tj
0 -56.9602 Td
(5803 ) 21.8426 Tj
0 -66.4535 Td
(5804 #include "types.h") 100.476 Tj
0 -75.9469 Td
(5805 #include "defs.h") 96.1073 Tj
0 -85.4403 Td
(5806 #include "traps.h") 100.476 Tj
0 -94.9336 Td
(5807 ) 21.8426 Tj
0 -104.427 Td
(5808 #define IOAPIC  0xFEC00000   // Default physical address o\
f IO APIC) 314.533 Tj
0 -113.92 Td
(5809 ) 21.8426 Tj
0 -123.414 Td
(5810 #define REG_ID     0x00  // Register index: ID) 222.794 Tj
0 -132.907 Td
(5811 #define REG_VER    0x01  // Register index: version) 244.637 Tj
0 -142.4 Td
(5812 #define REG_TABLE  0x10  // Redirection table base) 240.268 Tj
0 -151.894 Td
(5813 ) 21.8426 Tj
0 -161.387 Td
(5814 // The redirection table starts at REG_TABLE and uses) 253.374 Tj
0 -170.88 Td
(5815 // two registers to configure each interrupt.) 218.426 Tj
0 -180.374 Td
(5816 // The first \(low\) register in a pair contains configura\
tion bits.) 310.165 Tj
0 -189.867 Td
(5817 // The second \(high\) register contains a bitmask telling\
 which) 292.69 Tj
0 -199.361 Td
(5818 // CPUs can serve that interrupt.) 166.004 Tj
0 -208.854 Td
(5819 #define INT_DISABLED   0x00100000  // Interrupt disabled) 266.479 Tj
0 -218.347 Td
(5820 #define INT_LEVEL      0x00008000  // Level-triggered \(vs\
 edge-\)) 301.427 Tj
0 -227.841 Td
(5821 #define INT_ACTIVELOW  0x00002000  // Active low \(vs high\
\)) 275.216 Tj
0 -237.334 Td
(5822 #define INT_LOGICAL    0x00000800  // Destination is CPU i\
d \(vs APIC ID\)) 336.376 Tj
0 -246.827 Td
(5823 ) 21.8426 Tj
0 -256.321 Td
(5824 volatile struct ioapic *ioapic;) 157.267 Tj
0 -265.814 Td
(5825 ) 21.8426 Tj
0 -275.307 Td
(5826 // IO APIC MMIO structure: write reg, then read or write d\
ata.) 292.69 Tj
0 -284.801 Td
(5827 struct ioapic {) 87.3703 Tj
0 -294.294 Td
(5828   uint reg;) 69.8962 Tj
0 -303.788 Td
(5829   uint pad[3];) 83.0018 Tj
0 -313.281 Td
(5830   uint data;) 74.2647 Tj
0 -322.774 Td
(5831 };) 30.5796 Tj
0 -332.268 Td
(5832 ) 21.8426 Tj
0 -341.761 Td
(5833 static uint) 69.8962 Tj
0 -351.254 Td
(5834 ioapic_read\(int reg\)) 109.213 Tj
0 -360.748 Td
(5835 {) 26.2111 Tj
0 -370.241 Td
(5836   ioapic->reg = reg;) 109.213 Tj
0 -379.734 Td
(5837   return ioapic->data;) 117.95 Tj
0 -389.228 Td
(5838 }) 26.2111 Tj
0 -398.721 Td
(5839 ) 21.8426 Tj
0 -408.214 Td
(5840 static void) 69.8962 Tj
0 -417.708 Td
(5841 ioapic_write\(int reg, uint data\)) 161.635 Tj
0 -427.201 Td
(5842 {) 26.2111 Tj
0 -436.695 Td
(5843   ioapic->reg = reg;) 109.213 Tj
0 -446.188 Td
(5844   ioapic->data = data;) 117.95 Tj
0 -455.681 Td
(5845 }) 26.2111 Tj
0 -465.175 Td
(5846 ) 21.8426 Tj
0 -474.668 Td
(5847 ) 21.8426 Tj
0 -484.161 Td
(5848 ) 21.8426 Tj
0 -493.655 Td
(5849 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/ioapic.c  Page 2) 170.372 Tj
0 -28.4801 Td
(5850 void) 39.3166 Tj
0 -37.9735 Td
(5851 ioapic_init\(void\)) 96.1073 Tj
0 -47.4668 Td
(5852 {) 26.2111 Tj
0 -56.9602 Td
(5853   int i, id, maxintr;) 113.581 Tj
0 -66.4535 Td
(5854 ) 21.8426 Tj
0 -75.9469 Td
(5855   if\(!ismp\)) 69.8962 Tj
0 -85.4403 Td
(5856     return;) 69.8962 Tj
0 -94.9336 Td
(5857 ) 21.8426 Tj
0 -104.427 Td
(5858   ioapic = \(volatile struct ioapic*\)IOAPIC;) 209.689 Tj
0 -113.92 Td
(5859   maxintr = \(ioapic_read\(REG_VER\) >> 16\) & 0xFF;) 231.531 Tj
0 -123.414 Td
(5860   id = ioapic_read\(REG_ID\) >> 24;) 166.004 Tj
0 -132.907 Td
(5861   if\(id != ioapic_id\)) 113.581 Tj
0 -142.4 Td
(5862     cprintf\("ioapic_init: id isn't equal to ioapic_id; no\
t a MP\\n"\);) 318.902 Tj
0 -151.894 Td
(5863 ) 21.8426 Tj
0 -161.387 Td
(5864   // Mark all interrupts edge-triggered, active high, disa\
bled,) 297.059 Tj
0 -170.88 Td
(5865   // and not routed to any CPUs.) 161.635 Tj
0 -180.374 Td
(5866   for\(i = 0; i <= maxintr; i++\){) 161.635 Tj
0 -189.867 Td
(5867     ioapic_write\(REG_TABLE+2*i, INT_DISABLED | \(IRQ_OFFS\
ET + i\)\);) 305.796 Tj
0 -199.361 Td
(5868     ioapic_write\(REG_TABLE+2*i+1, 0\);) 183.478 Tj
0 -208.854 Td
(5869   }) 34.9481 Tj
0 -218.347 Td
(5870 }) 26.2111 Tj
0 -227.841 Td
(5871 ) 21.8426 Tj
0 -237.334 Td
(5872 void) 39.3166 Tj
0 -246.827 Td
(5873 ioapic_enable\(int irq, int cpunum\)) 170.372 Tj
0 -256.321 Td
(5874 {) 26.2111 Tj
0 -265.814 Td
(5875   if\(!ismp\)) 69.8962 Tj
0 -275.307 Td
(5876     return;) 69.8962 Tj
0 -284.801 Td
(5877 ) 21.8426 Tj
0 -294.294 Td
(5878   // Mark interrupt edge-triggered, active high,) 231.531 Tj
0 -303.788 Td
(5879   // enabled, and routed to the given cpunum,) 218.426 Tj
0 -313.281 Td
(5880   // which happens to be that cpu's APIC ID.) 214.057 Tj
0 -322.774 Td
(5881   ioapic_write\(REG_TABLE+2*irq, IRQ_OFFSET + irq\);) 240.268 Tj
0 -332.268 Td
(5882   ioapic_write\(REG_TABLE+2*irq+1, cpunum << 24\);) 231.531 Tj
0 -341.761 Td
(5883 }) 26.2111 Tj
0 -351.254 Td
(5884 ) 21.8426 Tj
0 -360.748 Td
(5885 ) 21.8426 Tj
0 -370.241 Td
(5886 ) 21.8426 Tj
0 -379.734 Td
(5887 ) 21.8426 Tj
0 -389.228 Td
(5888 ) 21.8426 Tj
0 -398.721 Td
(5889 ) 21.8426 Tj
0 -408.214 Td
(5890 ) 21.8426 Tj
0 -417.708 Td
(5891 ) 21.8426 Tj
0 -427.201 Td
(5892 ) 21.8426 Tj
0 -436.695 Td
(5893 ) 21.8426 Tj
0 -446.188 Td
(5894 ) 21.8426 Tj
0 -455.681 Td
(5895 ) 21.8426 Tj
0 -465.175 Td
(5896 ) 21.8426 Tj
0 -474.668 Td
(5897 ) 21.8426 Tj
0 -484.161 Td
(5898 ) 21.8426 Tj
0 -493.655 Td
(5899 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/picirq.c  Page 1) 170.372 Tj
0 -28.4801 Td
(5900 // Intel 8259A programmable interrupt controllers.) 240.268 Tj
0 -37.9735 Td
(5901 ) 21.8426 Tj
0 -47.4668 Td
(5902 #include "types.h") 100.476 Tj
0 -56.9602 Td
(5903 #include "x86.h") 91.7388 Tj
0 -66.4535 Td
(5904 #include "traps.h") 100.476 Tj
0 -75.9469 Td
(5905 ) 21.8426 Tj
0 -85.4403 Td
(5906 // I/O Addresses of the two programmable interrupt control\
lers) 292.69 Tj
0 -94.9336 Td
(5907 #define IO_PIC1         0x20    // Master \(IRQs 0-7\)) 249.005 Tj
0 -104.427 Td
(5908 #define IO_PIC2         0xA0    // Slave \(IRQs 8-15\)) 249.005 Tj
0 -113.92 Td
(5909 ) 21.8426 Tj
0 -123.414 Td
(5910 #define IRQ_SLAVE       2       // IRQ at which slave conn\
ects to master) 336.376 Tj
0 -132.907 Td
(5911 ) 21.8426 Tj
0 -142.4 Td
(5912 // Current IRQ mask.) 109.213 Tj
0 -151.894 Td
(5913 // Initial IRQ mask has interrupt 2 enabled \(for slave 82\
59A\).) 292.69 Tj
0 -161.387 Td
(5914 static ushort irqmask = 0xFFFF & ~\(1<<IRQ_SLAVE\);) 235.9 Tj
0 -170.88 Td
(5915 ) 21.8426 Tj
0 -180.374 Td
(5916 static void) 69.8962 Tj
0 -189.867 Td
(5917 pic_setmask\(ushort mask\)) 126.687 Tj
0 -199.361 Td
(5918 {) 26.2111 Tj
0 -208.854 Td
(5919   irqmask = mask;) 96.1073 Tj
0 -218.347 Td
(5920   outb\(IO_PIC1+1, mask\);) 126.687 Tj
0 -227.841 Td
(5921   outb\(IO_PIC2+1, mask >> 8\);) 148.529 Tj
0 -237.334 Td
(5922 }) 26.2111 Tj
0 -246.827 Td
(5923 ) 21.8426 Tj
0 -256.321 Td
(5924 void) 39.3166 Tj
0 -265.814 Td
(5925 pic_enable\(int irq\)) 104.844 Tj
0 -275.307 Td
(5926 {) 26.2111 Tj
0 -284.801 Td
(5927   pic_setmask\(irqmask & ~\(1<<irq\)\);) 174.741 Tj
0 -294.294 Td
(5928 }) 26.2111 Tj
0 -303.788 Td
(5929 ) 21.8426 Tj
0 -313.281 Td
(5930 // Initialize the 8259A interrupt controllers.) 222.794 Tj
0 -322.774 Td
(5931 void) 39.3166 Tj
0 -332.268 Td
(5932 pic_init\(void\)) 83.0018 Tj
0 -341.761 Td
(5933 {) 26.2111 Tj
0 -351.254 Td
(5934   // mask all interrupts) 126.687 Tj
0 -360.748 Td
(5935   outb\(IO_PIC1+1, 0xFF\);) 126.687 Tj
0 -370.241 Td
(5936   outb\(IO_PIC2+1, 0xFF\);) 126.687 Tj
0 -379.734 Td
(5937 ) 21.8426 Tj
0 -389.228 Td
(5938   // Set up master \(8259A-1\)) 144.161 Tj
0 -398.721 Td
(5939 ) 21.8426 Tj
0 -408.214 Td
(5940   // ICW1:  0001g0hi) 109.213 Tj
0 -417.708 Td
(5941   //    g:  0 = edge triggering, 1 = level triggering) 253.374 Tj
0 -427.201 Td
(5942   //    h:  0 = cascaded PICs, 1 = master only) 222.794 Tj
0 -436.695 Td
(5943   //    i:  0 = no ICW4, 1 = ICW4 required) 205.32 Tj
0 -446.188 Td
(5944   outb\(IO_PIC1, 0x11\);) 117.95 Tj
0 -455.681 Td
(5945 ) 21.8426 Tj
0 -465.175 Td
(5946   // ICW2:  Vector offset) 131.055 Tj
0 -474.668 Td
(5947   outb\(IO_PIC1+1, IRQ_OFFSET\);) 152.898 Tj
0 -484.161 Td
(5948 ) 21.8426 Tj
0 -493.655 Td
(5949 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/picirq.c  Page 2) 170.372 Tj
0 -28.4801 Td
(5950   // ICW3:  \(master PIC\) bit mask of IR lines connected \
to slaves) 305.796 Tj
0 -37.9735 Td
(5951   //        \(slave PIC\) 3-bit # of slave's connection to\
 master) 297.059 Tj
0 -47.4668 Td
(5952   outb\(IO_PIC1+1, 1<<IRQ_SLAVE\);) 161.635 Tj
0 -56.9602 Td
(5953 ) 21.8426 Tj
0 -66.4535 Td
(5954   // ICW4:  000nbmap) 109.213 Tj
0 -75.9469 Td
(5955   //    n:  1 = special fully nested mode) 200.952 Tj
0 -85.4403 Td
(5956   //    b:  1 = buffered mode) 148.529 Tj
0 -94.9336 Td
(5957   //    m:  0 = slave PIC, 1 = master PIC) 200.952 Tj
0 -104.427 Td
(5958   //      \(ignored when b is 0, as the master/slave role) 266.479 Tj
0 -113.92 Td
(5959   //      can be hardwired\).) 144.161 Tj
0 -123.414 Td
(5960   //    a:  1 = Automatic EOI mode) 170.372 Tj
0 -132.907 Td
(5961   //    p:  0 = MCS-80/85 mode, 1 = intel x86 mode) 240.268 Tj
0 -142.4 Td
(5962   outb\(IO_PIC1+1, 0x3\);) 122.318 Tj
0 -151.894 Td
(5963 ) 21.8426 Tj
0 -161.387 Td
(5964   // Set up slave \(8259A-2\)) 139.792 Tj
0 -170.88 Td
(5965   outb\(IO_PIC2, 0x11\);                  // ICW1) 227.163 Tj
0 -180.374 Td
(5966   outb\(IO_PIC2+1, IRQ_OFFSET + 8\);      // ICW2) 227.163 Tj
0 -189.867 Td
(5967   outb\(IO_PIC2+1, IRQ_SLAVE\);           // ICW3) 227.163 Tj
0 -199.361 Td
(5968   // NB Automatic EOI mode doesn't tend to work on the sla\
ve.) 288.322 Tj
0 -208.854 Td
(5969   // Linux source code says it's "to be investigated".) 257.742 Tj
0 -218.347 Td
(5970   outb\(IO_PIC2+1, 0x3\);                 // ICW4) 227.163 Tj
0 -227.841 Td
(5971 ) 21.8426 Tj
0 -237.334 Td
(5972   // OCW3:  0ef01prs) 109.213 Tj
0 -246.827 Td
(5973   //   ef:  0x = NOP, 10 = clear specific mask, 11 = set s\
pecific mask) 327.639 Tj
0 -256.321 Td
(5974   //    p:  0 = no polling, 1 = polling mode) 214.057 Tj
0 -265.814 Td
(5975   //   rs:  0x = NOP, 10 = read IRR, 11 = read ISR) 240.268 Tj
0 -275.307 Td
(5976   outb\(IO_PIC1, 0x68\);             // clear specific mas\
k) 270.848 Tj
0 -284.801 Td
(5977   outb\(IO_PIC1, 0x0a\);             // read IRR by defaul\
t) 270.848 Tj
0 -294.294 Td
(5978 ) 21.8426 Tj
0 -303.788 Td
(5979   outb\(IO_PIC2, 0x68\);             // OCW3) 205.32 Tj
0 -313.281 Td
(5980   outb\(IO_PIC2, 0x0a\);             // OCW3) 205.32 Tj
0 -322.774 Td
(5981 ) 21.8426 Tj
0 -332.268 Td
(5982   if\(irqmask != 0xFFFF\)) 122.318 Tj
0 -341.761 Td
(5983     pic_setmask\(irqmask\);) 131.055 Tj
0 -351.254 Td
(5984 }) 26.2111 Tj
0 -360.748 Td
(5985 ) 21.8426 Tj
0 -370.241 Td
(5986 ) 21.8426 Tj
0 -379.734 Td
(5987 ) 21.8426 Tj
0 -389.228 Td
(5988 ) 21.8426 Tj
0 -398.721 Td
(5989 ) 21.8426 Tj
0 -408.214 Td
(5990 ) 21.8426 Tj
0 -417.708 Td
(5991 ) 21.8426 Tj
0 -427.201 Td
(5992 ) 21.8426 Tj
0 -436.695 Td
(5993 ) 21.8426 Tj
0 -446.188 Td
(5994 ) 21.8426 Tj
0 -455.681 Td
(5995 ) 21.8426 Tj
0 -465.175 Td
(5996 ) 21.8426 Tj
0 -474.668 Td
(5997 ) 21.8426 Tj
0 -484.161 Td
(5998 ) 21.8426 Tj
0 -493.655 Td
(5999 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/kbd.h  Page 1) 157.267 Tj
0 -28.4801 Td
(6000 // PC keyboard interface constants) 170.372 Tj
0 -37.9735 Td
(6001 ) 21.8426 Tj
0 -47.4668 Td
(6002 #define KBSTATP         0x64    // kbd controller status p\
ort\(I\)) 301.427 Tj
0 -56.9602 Td
(6003 #define KBS_DIB         0x01    // kbd data in buffer) 253.374 Tj
0 -66.4535 Td
(6004 #define KBDATAP         0x60    // kbd data port\(I\)) 244.637 Tj
0 -75.9469 Td
(6005 ) 21.8426 Tj
0 -85.4403 Td
(6006 #define NO              0) 131.055 Tj
0 -94.9336 Td
(6007 ) 21.8426 Tj
0 -104.427 Td
(6008 #define SHIFT           \(1<<0\)) 152.898 Tj
0 -113.92 Td
(6009 #define CTL             \(1<<1\)) 152.898 Tj
0 -123.414 Td
(6010 #define ALT             \(1<<2\)) 152.898 Tj
0 -132.907 Td
(6011 ) 21.8426 Tj
0 -142.4 Td
(6012 #define CAPSLOCK        \(1<<3\)) 152.898 Tj
0 -151.894 Td
(6013 #define NUMLOCK         \(1<<4\)) 152.898 Tj
0 -161.387 Td
(6014 #define SCROLLLOCK      \(1<<5\)) 152.898 Tj
0 -170.88 Td
(6015 ) 21.8426 Tj
0 -180.374 Td
(6016 #define E0ESC           \(1<<6\)) 152.898 Tj
0 -189.867 Td
(6017 ) 21.8426 Tj
0 -199.361 Td
(6018 // Special keycodes) 104.844 Tj
0 -208.854 Td
(6019 #define KEY_HOME        0xE0) 144.161 Tj
0 -218.347 Td
(6020 #define KEY_END         0xE1) 144.161 Tj
0 -227.841 Td
(6021 #define KEY_UP          0xE2) 144.161 Tj
0 -237.334 Td
(6022 #define KEY_DN          0xE3) 144.161 Tj
0 -246.827 Td
(6023 #define KEY_LF          0xE4) 144.161 Tj
0 -256.321 Td
(6024 #define KEY_RT          0xE5) 144.161 Tj
0 -265.814 Td
(6025 #define KEY_PGUP        0xE6) 144.161 Tj
0 -275.307 Td
(6026 #define KEY_PGDN        0xE7) 144.161 Tj
0 -284.801 Td
(6027 #define KEY_INS         0xE8) 144.161 Tj
0 -294.294 Td
(6028 #define KEY_DEL         0xE9) 144.161 Tj
0 -303.788 Td
(6029 ) 21.8426 Tj
0 -313.281 Td
(6030 // C\('A'\) == Control-A) 117.95 Tj
0 -322.774 Td
(6031 #define C\(x\) \(x - '@'\)) 117.95 Tj
0 -332.268 Td
(6032 ) 21.8426 Tj
0 -341.761 Td
(6033 static uchar shiftcode[256] =) 148.529 Tj
0 -351.254 Td
(6034 {) 26.2111 Tj
0 -360.748 Td
(6035   [0x1D] CTL,) 78.6333 Tj
0 -370.241 Td
(6036   [0x2A] SHIFT,) 87.3703 Tj
0 -379.734 Td
(6037   [0x36] SHIFT,) 87.3703 Tj
0 -389.228 Td
(6038   [0x38] ALT,) 78.6333 Tj
0 -398.721 Td
(6039   [0x9D] CTL,) 78.6333 Tj
0 -408.214 Td
(6040   [0xB8] ALT) 74.2647 Tj
0 -417.708 Td
(6041 };) 30.5796 Tj
0 -427.201 Td
(6042 ) 21.8426 Tj
0 -436.695 Td
(6043 static uchar togglecode[256] =) 152.898 Tj
0 -446.188 Td
(6044 {) 26.2111 Tj
0 -455.681 Td
(6045   [0x3A] CAPSLOCK,) 100.476 Tj
0 -465.175 Td
(6046   [0x45] NUMLOCK,) 96.1073 Tj
0 -474.668 Td
(6047   [0x46] SCROLLLOCK) 104.844 Tj
0 -484.161 Td
(6048 };) 30.5796 Tj
0 -493.655 Td
(6049 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/kbd.h  Page 2) 157.267 Tj
0 -28.4801 Td
(6050 static uchar normalmap[256] =) 148.529 Tj
0 -37.9735 Td
(6051 {) 26.2111 Tj
0 -47.4668 Td
(6052   NO,   0x1B, '1',  '2',  '3',  '4',  '5',  '6',  // 0x00) 270.848 Tj
0 -56.9602 Td
(6053   '7',  '8',  '9',  '0',  '-',  '=',  '\\b', '\\t',) 235.9 Tj
0 -66.4535 Td
(6054   'q',  'w',  'e',  'r',  't',  'y',  'u',  'i',  // 0x10) 270.848 Tj
0 -75.9469 Td
(6055   'o',  'p',  '[',  ']',  '\\n', NO,   'a',  's',) 231.531 Tj
0 -85.4403 Td
(6056   'd',  'f',  'g',  'h',  'j',  'k',  'l',  ';',  // 0x20) 270.848 Tj
0 -94.9336 Td
(6057   '\\'', '`',  NO,   '\\\\', 'z',  'x',  'c',  'v',) 231.531 Tj
0 -104.427 Td
(6058   'b',  'n',  'm',  ',',  '.',  '/',  NO,   '*',  // 0x30) 270.848 Tj
0 -113.92 Td
(6059   NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO,) 227.163 Tj
0 -123.414 Td
(6060   NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40) 270.848 Tj
0 -132.907 Td
(6061   '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',) 231.531 Tj
0 -142.4 Td
(6062   '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50) 270.848 Tj
0 -151.894 Td
(6063   [0x9C] '\\n',      // KP_Enter) 157.267 Tj
0 -161.387 Td
(6064   [0xB5] '/',       // KP_Div) 148.529 Tj
0 -170.88 Td
(6065   [0xC8] KEY_UP,    [0xD0] KEY_DN,) 170.372 Tj
0 -180.374 Td
(6066   [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN,) 179.109 Tj
0 -189.867 Td
(6067   [0xCB] KEY_LF,    [0xCD] KEY_RT,) 170.372 Tj
0 -199.361 Td
(6068   [0x97] KEY_HOME,  [0xCF] KEY_END,) 174.741 Tj
0 -208.854 Td
(6069   [0xD2] KEY_INS,   [0xD3] KEY_DEL) 170.372 Tj
0 -218.347 Td
(6070 };) 30.5796 Tj
0 -227.841 Td
(6071 ) 21.8426 Tj
0 -237.334 Td
(6072 static uchar shiftmap[256] =) 144.161 Tj
0 -246.827 Td
(6073 {) 26.2111 Tj
0 -256.321 Td
(6074   NO,   033,  '!',  '@',  '#',  '$',  '%',  '^',  // 0x00) 270.848 Tj
0 -265.814 Td
(6075   '&',  '*',  '\(',  '\)',  '_',  '+',  '\\b', '\\t',) 235.9 Tj
0 -275.307 Td
(6076   'Q',  'W',  'E',  'R',  'T',  'Y',  'U',  'I',  // 0x10) 270.848 Tj
0 -284.801 Td
(6077   'O',  'P',  '{',  '}',  '\\n', NO,   'A',  'S',) 231.531 Tj
0 -294.294 Td
(6078   'D',  'F',  'G',  'H',  'J',  'K',  'L',  ':',  // 0x20) 270.848 Tj
0 -303.788 Td
(6079   '"',  '~',  NO,   '|',  'Z',  'X',  'C',  'V',) 231.531 Tj
0 -313.281 Td
(6080   'B',  'N',  'M',  '<',  '>',  '?',  NO,   '*',  // 0x30) 270.848 Tj
0 -322.774 Td
(6081   NO,   ' ',  NO,   NO,   NO,   NO,   NO,   NO,) 227.163 Tj
0 -332.268 Td
(6082   NO,   NO,   NO,   NO,   NO,   NO,   NO,   '7',  // 0x40) 270.848 Tj
0 -341.761 Td
(6083   '8',  '9',  '-',  '4',  '5',  '6',  '+',  '1',) 231.531 Tj
0 -351.254 Td
(6084   '2',  '3',  '0',  '.',  NO,   NO,   NO,   NO,   // 0x50) 270.848 Tj
0 -360.748 Td
(6085   [0x9C] '\\n',      // KP_Enter) 157.267 Tj
0 -370.241 Td
(6086   [0xB5] '/',       // KP_Div) 148.529 Tj
0 -379.734 Td
(6087   [0xC8] KEY_UP,    [0xD0] KEY_DN,) 170.372 Tj
0 -389.228 Td
(6088   [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN,) 179.109 Tj
0 -398.721 Td
(6089   [0xCB] KEY_LF,    [0xCD] KEY_RT,) 170.372 Tj
0 -408.214 Td
(6090   [0x97] KEY_HOME,  [0xCF] KEY_END,) 174.741 Tj
0 -417.708 Td
(6091   [0xD2] KEY_INS,   [0xD3] KEY_DEL) 170.372 Tj
0 -427.201 Td
(6092 };) 30.5796 Tj
0 -436.695 Td
(6093 ) 21.8426 Tj
0 -446.188 Td
(6094 ) 21.8426 Tj
0 -455.681 Td
(6095 ) 21.8426 Tj
0 -465.175 Td
(6096 ) 21.8426 Tj
0 -474.668 Td
(6097 ) 21.8426 Tj
0 -484.161 Td
(6098 ) 21.8426 Tj
0 -493.655 Td
(6099 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/kbd.h  Page 3) 157.267 Tj
0 -28.4801 Td
(6100 static uchar ctlmap[256] =) 135.424 Tj
0 -37.9735 Td
(6101 {) 26.2111 Tj
0 -47.4668 Td
(6102   NO,      NO,      NO,      NO,      NO,      NO,      NO\
,      NO,) 318.902 Tj
0 -56.9602 Td
(6103   NO,      NO,      NO,      NO,      NO,      NO,      NO\
,      NO,) 318.902 Tj
0 -66.4535 Td
(6104   C\('Q'\),  C\('W'\),  C\('E'\),  C\('R'\),  C\('T'\),  C\
\('Y'\),  C\('U'\),  C\('I'\),) 336.376 Tj
0 -75.9469 Td
(6105   C\('O'\),  C\('P'\),  NO,      NO,      '\\r',    NO,   \
   C\('A'\),  C\('S'\),) 336.376 Tj
0 -85.4403 Td
(6106   C\('D'\),  C\('F'\),  C\('G'\),  C\('H'\),  C\('J'\),  C\
\('K'\),  C\('L'\),  NO,) 318.902 Tj
0 -94.9336 Td
(6107   NO,      NO,      NO,      C\('\\\\'\), C\('Z'\),  C\('X\
'\),  C\('C'\),  C\('V'\),) 336.376 Tj
0 -104.427 Td
(6108   C\('B'\),  C\('N'\),  C\('M'\),  NO,      NO,      C\('/\
'\),  NO,      NO,) 318.902 Tj
0 -113.92 Td
(6109   [0x9C] '\\r',      // KP_Enter) 157.267 Tj
0 -123.414 Td
(6110   [0xB5] C\('/'\),    // KP_Div) 148.529 Tj
0 -132.907 Td
(6111   [0xC8] KEY_UP,    [0xD0] KEY_DN,) 170.372 Tj
0 -142.4 Td
(6112   [0xC9] KEY_PGUP,  [0xD1] KEY_PGDN,) 179.109 Tj
0 -151.894 Td
(6113   [0xCB] KEY_LF,    [0xCD] KEY_RT,) 170.372 Tj
0 -161.387 Td
(6114   [0x97] KEY_HOME,  [0xCF] KEY_END,) 174.741 Tj
0 -170.88 Td
(6115   [0xD2] KEY_INS,   [0xD3] KEY_DEL) 170.372 Tj
0 -180.374 Td
(6116 };) 30.5796 Tj
0 -189.867 Td
(6117 ) 21.8426 Tj
0 -199.361 Td
(6118 ) 21.8426 Tj
0 -208.854 Td
(6119 ) 21.8426 Tj
0 -218.347 Td
(6120 ) 21.8426 Tj
0 -227.841 Td
(6121 ) 21.8426 Tj
0 -237.334 Td
(6122 ) 21.8426 Tj
0 -246.827 Td
(6123 ) 21.8426 Tj
0 -256.321 Td
(6124 ) 21.8426 Tj
0 -265.814 Td
(6125 ) 21.8426 Tj
0 -275.307 Td
(6126 ) 21.8426 Tj
0 -284.801 Td
(6127 ) 21.8426 Tj
0 -294.294 Td
(6128 ) 21.8426 Tj
0 -303.788 Td
(6129 ) 21.8426 Tj
0 -313.281 Td
(6130 ) 21.8426 Tj
0 -322.774 Td
(6131 ) 21.8426 Tj
0 -332.268 Td
(6132 ) 21.8426 Tj
0 -341.761 Td
(6133 ) 21.8426 Tj
0 -351.254 Td
(6134 ) 21.8426 Tj
0 -360.748 Td
(6135 ) 21.8426 Tj
0 -370.241 Td
(6136 ) 21.8426 Tj
0 -379.734 Td
(6137 ) 21.8426 Tj
0 -389.228 Td
(6138 ) 21.8426 Tj
0 -398.721 Td
(6139 ) 21.8426 Tj
0 -408.214 Td
(6140 ) 21.8426 Tj
0 -417.708 Td
(6141 ) 21.8426 Tj
0 -427.201 Td
(6142 ) 21.8426 Tj
0 -436.695 Td
(6143 ) 21.8426 Tj
0 -446.188 Td
(6144 ) 21.8426 Tj
0 -455.681 Td
(6145 ) 21.8426 Tj
0 -465.175 Td
(6146 ) 21.8426 Tj
0 -474.668 Td
(6147 ) 21.8426 Tj
0 -484.161 Td
(6148 ) 21.8426 Tj
0 -493.655 Td
(6149 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/kbd.c  Page 1) 157.267 Tj
0 -28.4801 Td
(6150 #include "types.h") 100.476 Tj
0 -37.9735 Td
(6151 #include "x86.h") 91.7388 Tj
0 -47.4668 Td
(6152 #include "defs.h") 96.1073 Tj
0 -56.9602 Td
(6153 #include "kbd.h") 91.7388 Tj
0 -66.4535 Td
(6154 ) 21.8426 Tj
0 -75.9469 Td
(6155 int) 34.9481 Tj
0 -85.4403 Td
(6156 kbd_getc\(void\)) 83.0018 Tj
0 -94.9336 Td
(6157 {) 26.2111 Tj
0 -104.427 Td
(6158   static uint shift;) 109.213 Tj
0 -113.92 Td
(6159   static uchar *charcode[4] = {) 157.267 Tj
0 -123.414 Td
(6160     normalmap, shiftmap, ctlmap, ctlmap) 192.215 Tj
0 -132.907 Td
(6161   };) 39.3166 Tj
0 -142.4 Td
(6162   uint st, data, c;) 104.844 Tj
0 -151.894 Td
(6163 ) 21.8426 Tj
0 -161.387 Td
(6164   st = inb\(KBSTATP\);) 109.213 Tj
0 -170.88 Td
(6165   if\(\(st & KBS_DIB\) == 0\)) 131.055 Tj
0 -180.374 Td
(6166     return -1;) 83.0018 Tj
0 -189.867 Td
(6167   data = inb\(KBDATAP\);) 117.95 Tj
0 -199.361 Td
(6168 ) 21.8426 Tj
0 -208.854 Td
(6169   if\(data == 0xE0\){) 104.844 Tj
0 -218.347 Td
(6170     shift |= E0ESC;) 104.844 Tj
0 -227.841 Td
(6171     return 0;) 78.6333 Tj
0 -237.334 Td
(6172   } else if\(data & 0x80\){) 131.055 Tj
0 -246.827 Td
(6173     // Key released) 104.844 Tj
0 -256.321 Td
(6174     data = \(shift & E0ESC ? data : data & 0x7F\);) 231.531 Tj
0 -265.814 Td
(6175     shift &= ~\(shiftcode[data] | E0ESC\);) 196.583 Tj
0 -275.307 Td
(6176     return 0;) 78.6333 Tj
0 -284.801 Td
(6177   } else if\(shift & E0ESC\){) 139.792 Tj
0 -294.294 Td
(6178     // Last character was an E0 escape; or with 0x80) 249.005 Tj
0 -303.788 Td
(6179     data |= 0x80;) 96.1073 Tj
0 -313.281 Td
(6180     shift &= ~E0ESC;) 109.213 Tj
0 -322.774 Td
(6181   }) 34.9481 Tj
0 -332.268 Td
(6182 ) 21.8426 Tj
0 -341.761 Td
(6183   shift |= shiftcode[data];) 139.792 Tj
0 -351.254 Td
(6184   shift ^= togglecode[data];) 144.161 Tj
0 -360.748 Td
(6185   c = charcode[shift & \(CTL | SHIFT\)][data];) 214.057 Tj
0 -370.241 Td
(6186   if\(shift & CAPSLOCK\){) 122.318 Tj
0 -379.734 Td
(6187     if\('a' <= c && c <= 'z'\)) 144.161 Tj
0 -389.228 Td
(6188       c += 'A' - 'a';) 113.581 Tj
0 -398.721 Td
(6189     else if\('A' <= c && c <= 'Z'\)) 166.004 Tj
0 -408.214 Td
(6190       c += 'a' - 'A';) 113.581 Tj
0 -417.708 Td
(6191   }) 34.9481 Tj
0 -427.201 Td
(6192   return c;) 69.8962 Tj
0 -436.695 Td
(6193 }) 26.2111 Tj
0 -446.188 Td
(6194 ) 21.8426 Tj
0 -455.681 Td
(6195 void) 39.3166 Tj
0 -465.175 Td
(6196 kbd_intr\(void\)) 83.0018 Tj
0 -474.668 Td
(6197 {) 26.2111 Tj
0 -484.161 Td
(6198   console_intr\(kbd_getc\);) 131.055 Tj
0 -493.655 Td
(6199 }) 26.2111 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/console.c  Page 1) 174.741 Tj
0 -28.4801 Td
(6200 // Console input and output.) 144.161 Tj
0 -37.9735 Td
(6201 // Input is from the keyboard only.) 174.741 Tj
0 -47.4668 Td
(6202 // Output is written to the screen and the printer port.) 266.479 Tj
0 -56.9602 Td
(6203 ) 21.8426 Tj
0 -66.4535 Td
(6204 #include "types.h") 100.476 Tj
0 -75.9469 Td
(6205 #include "defs.h") 96.1073 Tj
0 -85.4403 Td
(6206 #include "param.h") 100.476 Tj
0 -94.9336 Td
(6207 #include "traps.h") 100.476 Tj
0 -104.427 Td
(6208 #include "spinlock.h") 113.581 Tj
0 -113.92 Td
(6209 #include "dev.h") 91.7388 Tj
0 -123.414 Td
(6210 #include "mmu.h") 91.7388 Tj
0 -132.907 Td
(6211 #include "proc.h") 96.1073 Tj
0 -142.4 Td
(6212 #include "x86.h") 91.7388 Tj
0 -151.894 Td
(6213 ) 21.8426 Tj
0 -161.387 Td
(6214 #define CRTPORT 0x3d4) 113.581 Tj
0 -170.88 Td
(6215 #define LPTPORT 0x378) 113.581 Tj
0 -180.374 Td
(6216 #define BACKSPACE 0x100) 122.318 Tj
0 -189.867 Td
(6217 ) 21.8426 Tj
0 -199.361 Td
(6218 static ushort *crt = \(ushort*\)0xb8000;  // CGA memory) 253.374 Tj
0 -208.854 Td
(6219 ) 21.8426 Tj
0 -218.347 Td
(6220 static struct spinlock console_lock;) 179.109 Tj
0 -227.841 Td
(6221 int panicked = 0;) 96.1073 Tj
0 -237.334 Td
(6222 int use_console_lock = 0;) 131.055 Tj
0 -246.827 Td
(6223 ) 21.8426 Tj
0 -256.321 Td
(6224 // Copy console output to parallel port, which you can tel\
l) 279.585 Tj
0 -265.814 Td
(6225 // .bochsrc to copy to the stdout:) 170.372 Tj
0 -275.307 Td
(6226 //   parport1: enabled=1, file="/dev/stdout") 214.057 Tj
0 -284.801 Td
(6227 static void) 69.8962 Tj
0 -294.294 Td
(6228 lpt_putc\(int c\)) 87.3703 Tj
0 -303.788 Td
(6229 {) 26.2111 Tj
0 -313.281 Td
(6230   int i;) 56.7907 Tj
0 -322.774 Td
(6231 ) 21.8426 Tj
0 -332.268 Td
(6232   for\(i = 0; !\(inb\(LPTPORT+1\) & 0x80\) && i < 12800; i\
++\)) 266.479 Tj
0 -341.761 Td
(6233     ;) 43.6851 Tj
0 -351.254 Td
(6234   if\(c == BACKSPACE\)) 109.213 Tj
0 -360.748 Td
(6235     c = '\\b';) 78.6333 Tj
0 -370.241 Td
(6236   outb\(LPTPORT+0, c\);) 113.581 Tj
0 -379.734 Td
(6237   outb\(LPTPORT+2, 0x08|0x04|0x01\);) 170.372 Tj
0 -389.228 Td
(6238   outb\(LPTPORT+2, 0x08\);) 126.687 Tj
0 -398.721 Td
(6239 }) 26.2111 Tj
0 -408.214 Td
(6240 ) 21.8426 Tj
0 -417.708 Td
(6241 ) 21.8426 Tj
0 -427.201 Td
(6242 ) 21.8426 Tj
0 -436.695 Td
(6243 ) 21.8426 Tj
0 -446.188 Td
(6244 ) 21.8426 Tj
0 -455.681 Td
(6245 ) 21.8426 Tj
0 -465.175 Td
(6246 ) 21.8426 Tj
0 -474.668 Td
(6247 ) 21.8426 Tj
0 -484.161 Td
(6248 ) 21.8426 Tj
0 -493.655 Td
(6249 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/console.c  Page 2) 174.741 Tj
0 -28.4801 Td
(6250 static void) 69.8962 Tj
0 -37.9735 Td
(6251 cga_putc\(int c\)) 87.3703 Tj
0 -47.4668 Td
(6252 {) 26.2111 Tj
0 -56.9602 Td
(6253   int pos;) 65.5277 Tj
0 -66.4535 Td
(6254 ) 21.8426 Tj
0 -75.9469 Td
(6255   // Cursor position: col + 80*row.) 174.741 Tj
0 -85.4403 Td
(6256   outb\(CRTPORT, 14\);) 109.213 Tj
0 -94.9336 Td
(6257   pos = inb\(CRTPORT+1\) << 8;) 144.161 Tj
0 -104.427 Td
(6258   outb\(CRTPORT, 15\);) 109.213 Tj
0 -113.92 Td
(6259   pos |= inb\(CRTPORT+1\);) 126.687 Tj
0 -123.414 Td
(6260 ) 21.8426 Tj
0 -132.907 Td
(6261   if\(c == '\\n'\)) 87.3703 Tj
0 -142.4 Td
(6262     pos += 80 - pos%80;) 122.318 Tj
0 -151.894 Td
(6263   else if\(c == BACKSPACE\){) 135.424 Tj
0 -161.387 Td
(6264     if\(pos > 0\)) 87.3703 Tj
0 -170.88 Td
(6265       crt[--pos] = ' ' | 0x0700;) 161.635 Tj
0 -180.374 Td
(6266   } else) 56.7907 Tj
0 -189.867 Td
(6267     crt[pos++] = \(c&0xff\) | 0x0700;  // black on white) 257.742 Tj
0 -199.361 Td
(6268 ) 21.8426 Tj
0 -208.854 Td
(6269   if\(\(pos/80\) >= 24\){  // Scroll up.) 179.109 Tj
0 -218.347 Td
(6270     memmove\(crt, crt+80, sizeof\(crt[0]\)*23*80\);) 227.163 Tj
0 -227.841 Td
(6271     pos -= 80;) 83.0018 Tj
0 -237.334 Td
(6272     memset\(crt+pos, 0, sizeof\(crt[0]\)*\(24*80 - pos\)\)\
;) 253.374 Tj
0 -246.827 Td
(6273   }) 34.9481 Tj
0 -256.321 Td
(6274 ) 21.8426 Tj
0 -265.814 Td
(6275   outb\(CRTPORT, 14\);) 109.213 Tj
0 -275.307 Td
(6276   outb\(CRTPORT+1, pos>>8\);) 135.424 Tj
0 -284.801 Td
(6277   outb\(CRTPORT, 15\);) 109.213 Tj
0 -294.294 Td
(6278   outb\(CRTPORT+1, pos\);) 122.318 Tj
0 -303.788 Td
(6279   crt[pos] = ' ' | 0x0700;) 135.424 Tj
0 -313.281 Td
(6280 }) 26.2111 Tj
0 -322.774 Td
(6281 ) 21.8426 Tj
0 -332.268 Td
(6282 static void) 69.8962 Tj
0 -341.761 Td
(6283 cons_putc\(int c\)) 91.7388 Tj
0 -351.254 Td
(6284 {) 26.2111 Tj
0 -360.748 Td
(6285   if\(panicked\){) 87.3703 Tj
0 -370.241 Td
(6286     cli\(\);) 65.5277 Tj
0 -379.734 Td
(6287     for\(;;\)) 69.8962 Tj
0 -389.228 Td
(6288       ;) 52.4222 Tj
0 -398.721 Td
(6289   }) 34.9481 Tj
0 -408.214 Td
(6290 ) 21.8426 Tj
0 -417.708 Td
(6291   lpt_putc\(c\);) 83.0018 Tj
0 -427.201 Td
(6292   cga_putc\(c\);) 83.0018 Tj
0 -436.695 Td
(6293 }) 26.2111 Tj
0 -446.188 Td
(6294 ) 21.8426 Tj
0 -455.681 Td
(6295 ) 21.8426 Tj
0 -465.175 Td
(6296 ) 21.8426 Tj
0 -474.668 Td
(6297 ) 21.8426 Tj
0 -484.161 Td
(6298 ) 21.8426 Tj
0 -493.655 Td
(6299 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/console.c  Page 3) 174.741 Tj
0 -28.4801 Td
(6300 void) 39.3166 Tj
0 -37.9735 Td
(6301 printint\(int xx, int base, int sgn\)) 174.741 Tj
0 -47.4668 Td
(6302 {) 26.2111 Tj
0 -56.9602 Td
(6303   static char digits[] = "0123456789ABCDEF";) 214.057 Tj
0 -66.4535 Td
(6304   char buf[16];) 87.3703 Tj
0 -75.9469 Td
(6305   int i = 0, neg = 0;) 113.581 Tj
0 -85.4403 Td
(6306   uint x;) 61.1592 Tj
0 -94.9336 Td
(6307 ) 21.8426 Tj
0 -104.427 Td
(6308   if\(sgn && xx < 0\){) 109.213 Tj
0 -113.92 Td
(6309     neg = 1;) 74.2647 Tj
0 -123.414 Td
(6310     x = 0 - xx;) 87.3703 Tj
0 -132.907 Td
(6311   } else {) 65.5277 Tj
0 -142.4 Td
(6312     x = xx;) 69.8962 Tj
0 -151.894 Td
(6313   }) 34.9481 Tj
0 -161.387 Td
(6314 ) 21.8426 Tj
0 -170.88 Td
(6315   do{) 43.6851 Tj
0 -180.374 Td
(6316     buf[i++] = digits[x % base];) 161.635 Tj
0 -189.867 Td
(6317   }while\(\(x /= base\) != 0\);) 139.792 Tj
0 -199.361 Td
(6318   if\(neg\)) 61.1592 Tj
0 -208.854 Td
(6319     buf[i++] = '-';) 104.844 Tj
0 -218.347 Td
(6320 ) 21.8426 Tj
0 -227.841 Td
(6321   while\(--i >= 0\)) 96.1073 Tj
0 -237.334 Td
(6322     cons_putc\(buf[i]\);) 117.95 Tj
0 -246.827 Td
(6323 }) 26.2111 Tj
0 -256.321 Td
(6324 ) 21.8426 Tj
0 -265.814 Td
(6325 // Print to the console. only understands %d, %x, %p, %s.) 270.848 Tj
0 -275.307 Td
(6326 void) 39.3166 Tj
0 -284.801 Td
(6327 cprintf\(char *fmt, ...\)) 122.318 Tj
0 -294.294 Td
(6328 {) 26.2111 Tj
0 -303.788 Td
(6329   int i, c, state, locking;) 139.792 Tj
0 -313.281 Td
(6330   uint *argp;) 78.6333 Tj
0 -322.774 Td
(6331   char *s;) 65.5277 Tj
0 -332.268 Td
(6332 ) 21.8426 Tj
0 -341.761 Td
(6333   locking = use_console_lock;) 148.529 Tj
0 -351.254 Td
(6334   if\(locking\)) 78.6333 Tj
0 -360.748 Td
(6335     acquire\(&console_lock\);) 139.792 Tj
0 -370.241 Td
(6336 ) 21.8426 Tj
0 -379.734 Td
(6337   argp = \(uint*\)\(void*\)&fmt + 1;) 161.635 Tj
0 -389.228 Td
(6338   state = 0;) 74.2647 Tj
0 -398.721 Td
(6339   for\(i = 0; fmt[i]; i++\){) 135.424 Tj
0 -408.214 Td
(6340     c = fmt[i] & 0xff;) 117.95 Tj
0 -417.708 Td
(6341     switch\(state\){) 100.476 Tj
0 -427.201 Td
(6342     case 0:) 69.8962 Tj
0 -436.695 Td
(6343       if\(c == '%'\)) 100.476 Tj
0 -446.188 Td
(6344         state = '%';) 109.213 Tj
0 -455.681 Td
(6345       else) 65.5277 Tj
0 -465.175 Td
(6346         cons_putc\(c\);) 113.581 Tj
0 -474.668 Td
(6347       break;) 74.2647 Tj
0 -484.161 Td
(6348 ) 21.8426 Tj
0 -493.655 Td
(6349 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/console.c  Page 4) 174.741 Tj
0 -28.4801 Td
(6350     case '%':) 78.6333 Tj
0 -37.9735 Td
(6351       switch\(c\){) 91.7388 Tj
0 -47.4668 Td
(6352       case 'd':) 87.3703 Tj
0 -56.9602 Td
(6353         printint\(*argp++, 10, 1\);) 166.004 Tj
0 -66.4535 Td
(6354         break;) 83.0018 Tj
0 -75.9469 Td
(6355       case 'x':) 87.3703 Tj
0 -85.4403 Td
(6356       case 'p':) 87.3703 Tj
0 -94.9336 Td
(6357         printint\(*argp++, 16, 0\);) 166.004 Tj
0 -104.427 Td
(6358         break;) 83.0018 Tj
0 -113.92 Td
(6359       case 's':) 87.3703 Tj
0 -123.414 Td
(6360         s = \(char*\)*argp++;) 139.792 Tj
0 -132.907 Td
(6361         if\(s == 0\)) 100.476 Tj
0 -142.4 Td
(6362           s = "\(null\)";) 122.318 Tj
0 -151.894 Td
(6363         for\(; *s; s++\)) 117.95 Tj
0 -161.387 Td
(6364           cons_putc\(*s\);) 126.687 Tj
0 -170.88 Td
(6365         break;) 83.0018 Tj
0 -180.374 Td
(6366       case '%':) 87.3703 Tj
0 -189.867 Td
(6367         cons_putc\('%'\);) 122.318 Tj
0 -199.361 Td
(6368         break;) 83.0018 Tj
0 -208.854 Td
(6369       default:) 83.0018 Tj
0 -218.347 Td
(6370         // Print unknown % sequence to draw attention.) 257.742 Tj
0 -227.841 Td
(6371         cons_putc\('%'\);) 122.318 Tj
0 -237.334 Td
(6372         cons_putc\(c\);) 113.581 Tj
0 -246.827 Td
(6373         break;) 83.0018 Tj
0 -256.321 Td
(6374       }) 52.4222 Tj
0 -265.814 Td
(6375       state = 0;) 91.7388 Tj
0 -275.307 Td
(6376       break;) 74.2647 Tj
0 -284.801 Td
(6377     }) 43.6851 Tj
0 -294.294 Td
(6378   }) 34.9481 Tj
0 -303.788 Td
(6379 ) 21.8426 Tj
0 -313.281 Td
(6380   if\(locking\)) 78.6333 Tj
0 -322.774 Td
(6381     release\(&console_lock\);) 139.792 Tj
0 -332.268 Td
(6382 }) 26.2111 Tj
0 -341.761 Td
(6383 ) 21.8426 Tj
0 -351.254 Td
(6384 int) 34.9481 Tj
0 -360.748 Td
(6385 console_write\(struct inode *ip, char *buf, int n\)) 235.9 Tj
0 -370.241 Td
(6386 {) 26.2111 Tj
0 -379.734 Td
(6387   int i;) 56.7907 Tj
0 -389.228 Td
(6388 ) 21.8426 Tj
0 -398.721 Td
(6389   iunlock\(ip\);) 83.0018 Tj
0 -408.214 Td
(6390   acquire\(&console_lock\);) 131.055 Tj
0 -417.708 Td
(6391   for\(i = 0; i < n; i++\)) 126.687 Tj
0 -427.201 Td
(6392     cons_putc\(buf[i] & 0xff\);) 148.529 Tj
0 -436.695 Td
(6393   release\(&console_lock\);) 131.055 Tj
0 -446.188 Td
(6394   ilock\(ip\);) 74.2647 Tj
0 -455.681 Td
(6395 ) 21.8426 Tj
0 -465.175 Td
(6396   return n;) 69.8962 Tj
0 -474.668 Td
(6397 }) 26.2111 Tj
0 -484.161 Td
(6398 ) 21.8426 Tj
0 -493.655 Td
(6399 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/console.c  Page 5) 174.741 Tj
0 -28.4801 Td
(6400 #define INPUT_BUF 128) 113.581 Tj
0 -37.9735 Td
(6401 struct {) 56.7907 Tj
0 -47.4668 Td
(6402   struct spinlock lock;) 122.318 Tj
0 -56.9602 Td
(6403   char buf[INPUT_BUF];) 117.95 Tj
0 -66.4535 Td
(6404   int r;  // Read index) 122.318 Tj
0 -75.9469 Td
(6405   int w;  // Write index) 126.687 Tj
0 -85.4403 Td
(6406   int e;  // Edit index) 122.318 Tj
0 -94.9336 Td
(6407 } input;) 56.7907 Tj
0 -104.427 Td
(6408 ) 21.8426 Tj
0 -113.92 Td
(6409 #define C\(x\)  \(\(x\)-'@'\)  // Control-x) 183.478 Tj
0 -123.414 Td
(6410 ) 21.8426 Tj
0 -132.907 Td
(6411 void) 39.3166 Tj
0 -142.4 Td
(6412 console_intr\(int \(*getc\)\(void\)\)) 157.267 Tj
0 -151.894 Td
(6413 {) 26.2111 Tj
0 -161.387 Td
(6414   int c;) 56.7907 Tj
0 -170.88 Td
(6415 ) 21.8426 Tj
0 -180.374 Td
(6416   acquire\(&input.lock\);) 122.318 Tj
0 -189.867 Td
(6417   while\(\(c = getc\(\)\) >= 0\){) 139.792 Tj
0 -199.361 Td
(6418     switch\(c\){) 83.0018 Tj
0 -208.854 Td
(6419     case C\('P'\):  // Process listing.) 183.478 Tj
0 -218.347 Td
(6420       procdump\(\);) 96.1073 Tj
0 -227.841 Td
(6421       break;) 74.2647 Tj
0 -237.334 Td
(6422     case C\('U'\):  // Kill line.) 157.267 Tj
0 -246.827 Td
(6423       while\(input.e > input.w &&) 161.635 Tj
0 -256.321 Td
(6424             input.buf[\(input.e-1\) % INPUT_BUF] != '\\n'\)\
{) 266.479 Tj
0 -265.814 Td
(6425         input.e--;) 100.476 Tj
0 -275.307 Td
(6426         cons_putc\(BACKSPACE\);) 148.529 Tj
0 -284.801 Td
(6427       }) 52.4222 Tj
0 -294.294 Td
(6428       break;) 74.2647 Tj
0 -303.788 Td
(6429     case C\('H'\):  // Backspace) 152.898 Tj
0 -313.281 Td
(6430       if\(input.e > input.w\){) 144.161 Tj
0 -322.774 Td
(6431         input.e--;) 100.476 Tj
0 -332.268 Td
(6432         cons_putc\(BACKSPACE\);) 148.529 Tj
0 -341.761 Td
(6433       }) 52.4222 Tj
0 -351.254 Td
(6434       break;) 74.2647 Tj
0 -360.748 Td
(6435     default:) 74.2647 Tj
0 -370.241 Td
(6436       if\(c != 0 && input.e < input.r+INPUT_BUF\){) 231.531 Tj
0 -379.734 Td
(6437         input.buf[input.e++] = c;) 166.004 Tj
0 -389.228 Td
(6438         cons_putc\(c\);) 113.581 Tj
0 -398.721 Td
(6439         if\(c == '\\n' || c == C\('D'\) || input.e == inpu\
t.r+INPUT_BUF\){) 323.27 Tj
0 -408.214 Td
(6440           input.w = input.e;) 144.161 Tj
0 -417.708 Td
(6441           wakeup\(&input.r\);) 139.792 Tj
0 -427.201 Td
(6442         }) 61.1592 Tj
0 -436.695 Td
(6443       }) 52.4222 Tj
0 -446.188 Td
(6444       break;) 74.2647 Tj
0 -455.681 Td
(6445     }) 43.6851 Tj
0 -465.175 Td
(6446   }) 34.9481 Tj
0 -474.668 Td
(6447   release\(&input.lock\);) 122.318 Tj
0 -484.161 Td
(6448 }) 26.2111 Tj
0 -493.655 Td
(6449 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/console.c  Page 6) 174.741 Tj
0 -28.4801 Td
(6450 int) 34.9481 Tj
0 -37.9735 Td
(6451 console_read\(struct inode *ip, char *dst, int n\)) 231.531 Tj
0 -47.4668 Td
(6452 {) 26.2111 Tj
0 -56.9602 Td
(6453   uint target;) 83.0018 Tj
0 -66.4535 Td
(6454   int c;) 56.7907 Tj
0 -75.9469 Td
(6455 ) 21.8426 Tj
0 -85.4403 Td
(6456   iunlock\(ip\);) 83.0018 Tj
0 -94.9336 Td
(6457   target = n;) 78.6333 Tj
0 -104.427 Td
(6458   acquire\(&input.lock\);) 122.318 Tj
0 -113.92 Td
(6459   while\(n > 0\){) 87.3703 Tj
0 -123.414 Td
(6460     while\(input.r == input.w\){) 152.898 Tj
0 -132.907 Td
(6461       if\(cp->killed\){) 113.581 Tj
0 -142.4 Td
(6462         release\(&input.lock\);) 148.529 Tj
0 -151.894 Td
(6463         ilock\(ip\);) 100.476 Tj
0 -161.387 Td
(6464         return -1;) 100.476 Tj
0 -170.88 Td
(6465       }) 52.4222 Tj
0 -180.374 Td
(6466       sleep\(&input.r, &input.lock\);) 174.741 Tj
0 -189.867 Td
(6467     }) 43.6851 Tj
0 -199.361 Td
(6468     c = input.buf[input.r++];) 148.529 Tj
0 -208.854 Td
(6469     if\(c == C\('D'\)\){  // EOF) 144.161 Tj
0 -218.347 Td
(6470       if\(n < target\){) 113.581 Tj
0 -227.841 Td
(6471         // Save ^D for next time, to make sure) 222.794 Tj
0 -237.334 Td
(6472         // caller gets a 0-byte result.) 192.215 Tj
0 -246.827 Td
(6473         input.r--;) 100.476 Tj
0 -256.321 Td
(6474       }) 52.4222 Tj
0 -265.814 Td
(6475       break;) 74.2647 Tj
0 -275.307 Td
(6476     }) 43.6851 Tj
0 -284.801 Td
(6477     *dst++ = c;) 87.3703 Tj
0 -294.294 Td
(6478     --n;) 56.7907 Tj
0 -303.788 Td
(6479     if\(c == '\\n'\)) 96.1073 Tj
0 -313.281 Td
(6480       break;) 74.2647 Tj
0 -322.774 Td
(6481     if\(input.r >= INPUT_BUF\)) 144.161 Tj
0 -332.268 Td
(6482       input.r = 0;) 100.476 Tj
0 -341.761 Td
(6483   }) 34.9481 Tj
0 -351.254 Td
(6484   release\(&input.lock\);) 122.318 Tj
0 -360.748 Td
(6485   ilock\(ip\);) 74.2647 Tj
0 -370.241 Td
(6486 ) 21.8426 Tj
0 -379.734 Td
(6487   return target - n;) 109.213 Tj
0 -389.228 Td
(6488 }) 26.2111 Tj
0 -398.721 Td
(6489 ) 21.8426 Tj
0 -408.214 Td
(6490 ) 21.8426 Tj
0 -417.708 Td
(6491 ) 21.8426 Tj
0 -427.201 Td
(6492 ) 21.8426 Tj
0 -436.695 Td
(6493 ) 21.8426 Tj
0 -446.188 Td
(6494 ) 21.8426 Tj
0 -455.681 Td
(6495 ) 21.8426 Tj
0 -465.175 Td
(6496 ) 21.8426 Tj
0 -474.668 Td
(6497 ) 21.8426 Tj
0 -484.161 Td
(6498 ) 21.8426 Tj
0 -493.655 Td
(6499 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/console.c  Page 7) 174.741 Tj
0 -28.4801 Td
(6500 void) 39.3166 Tj
0 -37.9735 Td
(6501 console_init\(void\)) 100.476 Tj
0 -47.4668 Td
(6502 {) 26.2111 Tj
0 -56.9602 Td
(6503   initlock\(&console_lock, "console"\);) 183.478 Tj
0 -66.4535 Td
(6504   initlock\(&input.lock, "console input"\);) 200.952 Tj
0 -75.9469 Td
(6505 ) 21.8426 Tj
0 -85.4403 Td
(6506   devsw[CONSOLE].write = console_write;) 192.215 Tj
0 -94.9336 Td
(6507   devsw[CONSOLE].read = console_read;) 183.478 Tj
0 -104.427 Td
(6508   //use_console_lock = 1;) 131.055 Tj
0 -113.92 Td
(6509 ) 21.8426 Tj
0 -123.414 Td
(6510   pic_enable\(IRQ_KBD\);) 117.95 Tj
0 -132.907 Td
(6511   ioapic_enable\(IRQ_KBD, 0\);) 144.161 Tj
0 -142.4 Td
(6512 }) 26.2111 Tj
0 -151.894 Td
(6513 ) 21.8426 Tj
0 -161.387 Td
(6514 void) 39.3166 Tj
0 -170.88 Td
(6515 panic\(char *s\)) 83.0018 Tj
0 -180.374 Td
(6516 {) 26.2111 Tj
0 -189.867 Td
(6517   int i;) 56.7907 Tj
0 -199.361 Td
(6518   uint pcs[10];) 87.3703 Tj
0 -208.854 Td
(6519 ) 21.8426 Tj
0 -218.347 Td
(6520   __asm __volatile\("cli"\);) 135.424 Tj
0 -227.841 Td
(6521   use_console_lock = 0;) 122.318 Tj
0 -237.334 Td
(6522   cprintf\("panic \(%d\): ", cpu\(\)\);) 166.004 Tj
0 -246.827 Td
(6523   cprintf\(s, 0\);) 91.7388 Tj
0 -256.321 Td
(6524   cprintf\("\\n", 0\);) 104.844 Tj
0 -265.814 Td
(6525   getcallerpcs\(&s, pcs\);) 126.687 Tj
0 -275.307 Td
(6526   for\(i=0; i<10; i++\)) 113.581 Tj
0 -284.801 Td
(6527     cprintf\(" %p", pcs[i]\);) 139.792 Tj
0 -294.294 Td
(6528   panicked = 1; // freeze other CPU) 174.741 Tj
0 -303.788 Td
(6529   for\(;;\)) 61.1592 Tj
0 -313.281 Td
(6530     ;) 43.6851 Tj
0 -322.774 Td
(6531 }) 26.2111 Tj
0 -332.268 Td
(6532 ) 21.8426 Tj
0 -341.761 Td
(6533 ) 21.8426 Tj
0 -351.254 Td
(6534 ) 21.8426 Tj
0 -360.748 Td
(6535 ) 21.8426 Tj
0 -370.241 Td
(6536 ) 21.8426 Tj
0 -379.734 Td
(6537 ) 21.8426 Tj
0 -389.228 Td
(6538 ) 21.8426 Tj
0 -398.721 Td
(6539 ) 21.8426 Tj
0 -408.214 Td
(6540 ) 21.8426 Tj
0 -417.708 Td
(6541 ) 21.8426 Tj
0 -427.201 Td
(6542 ) 21.8426 Tj
0 -436.695 Td
(6543 ) 21.8426 Tj
0 -446.188 Td
(6544 ) 21.8426 Tj
0 -455.681 Td
(6545 ) 21.8426 Tj
0 -465.175 Td
(6546 ) 21.8426 Tj
0 -474.668 Td
(6547 ) 21.8426 Tj
0 -484.161 Td
(6548 ) 21.8426 Tj
0 -493.655 Td
(6549 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/timer.c  Page 1) 166.004 Tj
0 -28.4801 Td
(6550 // Intel 8253/8254/82C54 Programmable Interval Timer \(PIT\
\).) 279.585 Tj
0 -37.9735 Td
(6551 // Only used on uniprocessors;) 152.898 Tj
0 -47.4668 Td
(6552 // SMP machines use the local APIC timer.) 200.952 Tj
0 -56.9602 Td
(6553 ) 21.8426 Tj
0 -66.4535 Td
(6554 #include "types.h") 100.476 Tj
0 -75.9469 Td
(6555 #include "defs.h") 96.1073 Tj
0 -85.4403 Td
(6556 #include "traps.h") 100.476 Tj
0 -94.9336 Td
(6557 #include "x86.h") 91.7388 Tj
0 -104.427 Td
(6558 ) 21.8426 Tj
0 -113.92 Td
(6559 #define IO_TIMER1       0x040           // 8253 Timer #1) 266.479 Tj
0 -123.414 Td
(6560 ) 21.8426 Tj
0 -132.907 Td
(6561 // Frequency of all three count-down timers;) 214.057 Tj
0 -142.4 Td
(6562 // \(TIMER_FREQ/freq\) is the appropriate count) 218.426 Tj
0 -151.894 Td
(6563 // to generate a frequency of freq Hz.) 187.846 Tj
0 -161.387 Td
(6564 ) 21.8426 Tj
0 -170.88 Td
(6565 #define TIMER_FREQ      1193182) 157.267 Tj
0 -180.374 Td
(6566 #define TIMER_DIV\(x\)    \(\(TIMER_FREQ+\(x\)/2\)/\(x\)\)) 231.531 Tj
0 -189.867 Td
(6567 ) 21.8426 Tj
0 -199.361 Td
(6568 #define TIMER_MODE      \(IO_TIMER1 + 3\) // timer mode po\
rt) 275.216 Tj
0 -208.854 Td
(6569 #define TIMER_SEL0      0x00    // select counter 0) 244.637 Tj
0 -218.347 Td
(6570 #define TIMER_RATEGEN   0x04    // mode 2, rate generator) 270.848 Tj
0 -227.841 Td
(6571 #define TIMER_16BIT     0x30    // r/w counter 16 bits, LS\
B first) 305.796 Tj
0 -237.334 Td
(6572 ) 21.8426 Tj
0 -246.827 Td
(6573 void) 39.3166 Tj
0 -256.321 Td
(6574 timer_init\(void\)) 91.7388 Tj
0 -265.814 Td
(6575 {) 26.2111 Tj
0 -275.307 Td
(6576   // Interrupt 100 times/sec.) 148.529 Tj
0 -284.801 Td
(6577   outb\(TIMER_MODE, TIMER_SEL0 | TIMER_RATEGEN | TIMER_16B\
IT\);) 288.322 Tj
0 -294.294 Td
(6578   outb\(IO_TIMER1, TIMER_DIV\(100\) % 256\);) 196.583 Tj
0 -303.788 Td
(6579   outb\(IO_TIMER1, TIMER_DIV\(100\) / 256\);) 196.583 Tj
0 -313.281 Td
(6580   pic_enable\(IRQ_TIMER\);) 126.687 Tj
0 -322.774 Td
(6581 }) 26.2111 Tj
0 -332.268 Td
(6582 ) 21.8426 Tj
0 -341.761 Td
(6583 ) 21.8426 Tj
0 -351.254 Td
(6584 ) 21.8426 Tj
0 -360.748 Td
(6585 ) 21.8426 Tj
0 -370.241 Td
(6586 ) 21.8426 Tj
0 -379.734 Td
(6587 ) 21.8426 Tj
0 -389.228 Td
(6588 ) 21.8426 Tj
0 -398.721 Td
(6589 ) 21.8426 Tj
0 -408.214 Td
(6590 ) 21.8426 Tj
0 -417.708 Td
(6591 ) 21.8426 Tj
0 -427.201 Td
(6592 ) 21.8426 Tj
0 -436.695 Td
(6593 ) 21.8426 Tj
0 -446.188 Td
(6594 ) 21.8426 Tj
0 -455.681 Td
(6595 ) 21.8426 Tj
0 -465.175 Td
(6596 ) 21.8426 Tj
0 -474.668 Td
(6597 ) 21.8426 Tj
0 -484.161 Td
(6598 ) 21.8426 Tj
0 -493.655 Td
(6599 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/initcode.S  Page 1) 179.109 Tj
0 -28.4801 Td
(6600 # Initial process execs /init.) 152.898 Tj
0 -37.9735 Td
(6601 ) 21.8426 Tj
0 -47.4668 Td
(6602 #include "syscall.h") 109.213 Tj
0 -56.9602 Td
(6603 #include "traps.h") 100.476 Tj
0 -66.4535 Td
(6604 ) 21.8426 Tj
0 -75.9469 Td
(6605 # exec\(init, argv\)) 100.476 Tj
0 -85.4403 Td
(6606 .globl start) 74.2647 Tj
0 -94.9336 Td
(6607 start:) 48.0537 Tj
0 -104.427 Td
(6608   pushl $argv) 78.6333 Tj
0 -113.92 Td
(6609   pushl $init) 78.6333 Tj
0 -123.414 Td
(6610   pushl $0) 65.5277 Tj
0 -132.907 Td
(6611   movl $SYS_exec, %eax) 117.95 Tj
0 -142.4 Td
(6612   int $T_SYSCALL) 91.7388 Tj
0 -151.894 Td
(6613 ) 21.8426 Tj
0 -161.387 Td
(6614 # for\(;;\) exit\(\);) 96.1073 Tj
0 -170.88 Td
(6615 exit:) 43.6851 Tj
0 -180.374 Td
(6616   movl $SYS_exit, %eax) 117.95 Tj
0 -189.867 Td
(6617   int $T_SYSCALL) 91.7388 Tj
0 -199.361 Td
(6618   jmp exit) 65.5277 Tj
0 -208.854 Td
(6619 ) 21.8426 Tj
0 -218.347 Td
(6620 # char init[] = "/init\\0";) 135.424 Tj
0 -227.841 Td
(6621 init:) 43.6851 Tj
0 -237.334 Td
(6622   .string "/init\\0") 104.844 Tj
0 -246.827 Td
(6623 ) 21.8426 Tj
0 -256.321 Td
(6624 # char *argv[] = { init, 0 };) 148.529 Tj
0 -265.814 Td
(6625 .p2align 2) 65.5277 Tj
0 -275.307 Td
(6626 argv:) 43.6851 Tj
0 -284.801 Td
(6627   .long init) 74.2647 Tj
0 -294.294 Td
(6628   .long 0) 61.1592 Tj
0 -303.788 Td
(6629 ) 21.8426 Tj
0 -313.281 Td
(6630 ) 21.8426 Tj
0 -322.774 Td
(6631 ) 21.8426 Tj
0 -332.268 Td
(6632 ) 21.8426 Tj
0 -341.761 Td
(6633 ) 21.8426 Tj
0 -351.254 Td
(6634 ) 21.8426 Tj
0 -360.748 Td
(6635 ) 21.8426 Tj
0 -370.241 Td
(6636 ) 21.8426 Tj
0 -379.734 Td
(6637 ) 21.8426 Tj
0 -389.228 Td
(6638 ) 21.8426 Tj
0 -398.721 Td
(6639 ) 21.8426 Tj
0 -408.214 Td
(6640 ) 21.8426 Tj
0 -417.708 Td
(6641 ) 21.8426 Tj
0 -427.201 Td
(6642 ) 21.8426 Tj
0 -436.695 Td
(6643 ) 21.8426 Tj
0 -446.188 Td
(6644 ) 21.8426 Tj
0 -455.681 Td
(6645 ) 21.8426 Tj
0 -465.175 Td
(6646 ) 21.8426 Tj
0 -474.668 Td
(6647 ) 21.8426 Tj
0 -484.161 Td
(6648 ) 21.8426 Tj
0 -493.655 Td
(6649 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/init.c  Page 1) 161.635 Tj
0 -28.4801 Td
(6650 // init: The initial user-level program) 192.215 Tj
0 -37.9735 Td
(6651 ) 21.8426 Tj
0 -47.4668 Td
(6652 #include "types.h") 100.476 Tj
0 -56.9602 Td
(6653 #include "stat.h") 96.1073 Tj
0 -66.4535 Td
(6654 #include "user.h") 96.1073 Tj
0 -75.9469 Td
(6655 #include "fcntl.h") 100.476 Tj
0 -85.4403 Td
(6656 ) 21.8426 Tj
0 -94.9336 Td
(6657 char *sh_args[] = { "sh", 0 };) 152.898 Tj
0 -104.427 Td
(6658 ) 21.8426 Tj
0 -113.92 Td
(6659 int) 34.9481 Tj
0 -123.414 Td
(6660 main\(void\)) 65.5277 Tj
0 -132.907 Td
(6661 {) 26.2111 Tj
0 -142.4 Td
(6662   int pid, wpid;) 91.7388 Tj
0 -151.894 Td
(6663 ) 21.8426 Tj
0 -161.387 Td
(6664   if\(open\("console", O_RDWR\) < 0\){) 170.372 Tj
0 -170.88 Td
(6665     mknod\("console", 1, 1\);) 139.792 Tj
0 -180.374 Td
(6666     open\("console", O_RDWR\);) 144.161 Tj
0 -189.867 Td
(6667   }) 34.9481 Tj
0 -199.361 Td
(6668   dup\(0\);  // stdout) 109.213 Tj
0 -208.854 Td
(6669   dup\(0\);  // stderr) 109.213 Tj
0 -218.347 Td
(6670 ) 21.8426 Tj
0 -227.841 Td
(6671   for\(;;\){) 65.5277 Tj
0 -237.334 Td
(6672     printf\(1, "init: starting sh\\n"\);) 183.478 Tj
0 -246.827 Td
(6673     pid = fork\(\);) 96.1073 Tj
0 -256.321 Td
(6674     if\(pid < 0\){) 91.7388 Tj
0 -265.814 Td
(6675       printf\(1, "init: fork failed\\n"\);) 192.215 Tj
0 -275.307 Td
(6676       exit\(\);) 78.6333 Tj
0 -284.801 Td
(6677     }) 43.6851 Tj
0 -294.294 Td
(6678     if\(pid == 0\){) 96.1073 Tj
0 -303.788 Td
(6679       exec\("sh", sh_args\);) 135.424 Tj
0 -313.281 Td
(6680       printf\(1, "init: exec sh failed\\n"\);) 205.32 Tj
0 -322.774 Td
(6681       exit\(\);) 78.6333 Tj
0 -332.268 Td
(6682     }) 43.6851 Tj
0 -341.761 Td
(6683     while\(\(wpid=wait\(\)\) >= 0 && wpid != pid\)) 214.057 Tj
0 -351.254 Td
(6684       printf\(1, "zombie!\\n"\);) 148.529 Tj
0 -360.748 Td
(6685   }) 34.9481 Tj
0 -370.241 Td
(6686 }) 26.2111 Tj
0 -379.734 Td
(6687 ) 21.8426 Tj
0 -389.228 Td
(6688 ) 21.8426 Tj
0 -398.721 Td
(6689 ) 21.8426 Tj
0 -408.214 Td
(6690 ) 21.8426 Tj
0 -417.708 Td
(6691 ) 21.8426 Tj
0 -427.201 Td
(6692 ) 21.8426 Tj
0 -436.695 Td
(6693 ) 21.8426 Tj
0 -446.188 Td
(6694 ) 21.8426 Tj
0 -455.681 Td
(6695 ) 21.8426 Tj
0 -465.175 Td
(6696 ) 21.8426 Tj
0 -474.668 Td
(6697 ) 21.8426 Tj
0 -484.161 Td
(6698 ) 21.8426 Tj
0 -493.655 Td
(6699 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/usys.S  Page 1) 161.635 Tj
0 -28.4801 Td
(6700 #include "syscall.h") 109.213 Tj
0 -37.9735 Td
(6701 #include "traps.h") 100.476 Tj
0 -47.4668 Td
(6702 ) 21.8426 Tj
0 -56.9602 Td
(6703 #define STUB\(name\) \\) 109.213 Tj
0 -66.4535 Td
(6704   .globl name; \\) 91.7388 Tj
0 -75.9469 Td
(6705   name: \\) 61.1592 Tj
0 -85.4403 Td
(6706     movl $SYS_ ## name, %eax; \\) 157.267 Tj
0 -94.9336 Td
(6707     int $T_SYSCALL; \\) 113.581 Tj
0 -104.427 Td
(6708     ret) 52.4222 Tj
0 -113.92 Td
(6709 ) 21.8426 Tj
0 -123.414 Td
(6710 STUB\(fork\)) 65.5277 Tj
0 -132.907 Td
(6711 STUB\(exit\)) 65.5277 Tj
0 -142.4 Td
(6712 STUB\(wait\)) 65.5277 Tj
0 -151.894 Td
(6713 STUB\(pipe\)) 65.5277 Tj
0 -161.387 Td
(6714 STUB\(read\)) 65.5277 Tj
0 -170.88 Td
(6715 STUB\(write\)) 69.8962 Tj
0 -180.374 Td
(6716 STUB\(close\)) 69.8962 Tj
0 -189.867 Td
(6717 STUB\(kill\)) 65.5277 Tj
0 -199.361 Td
(6718 STUB\(exec\)) 65.5277 Tj
0 -208.854 Td
(6719 STUB\(open\)) 65.5277 Tj
0 -218.347 Td
(6720 STUB\(mknod\)) 69.8962 Tj
0 -227.841 Td
(6721 STUB\(unlink\)) 74.2647 Tj
0 -237.334 Td
(6722 STUB\(fstat\)) 69.8962 Tj
0 -246.827 Td
(6723 STUB\(link\)) 65.5277 Tj
0 -256.321 Td
(6724 STUB\(mkdir\)) 69.8962 Tj
0 -265.814 Td
(6725 STUB\(chdir\)) 69.8962 Tj
0 -275.307 Td
(6726 STUB\(dup\)) 61.1592 Tj
0 -284.801 Td
(6727 STUB\(getpid\)) 74.2647 Tj
0 -294.294 Td
(6728 STUB\(sbrk\)) 65.5277 Tj
0 -303.788 Td
(6729 STUB\(sleep\)) 69.8962 Tj
0 -313.281 Td
(6730 ) 21.8426 Tj
0 -322.774 Td
(6731 ) 21.8426 Tj
0 -332.268 Td
(6732 ) 21.8426 Tj
0 -341.761 Td
(6733 ) 21.8426 Tj
0 -351.254 Td
(6734 ) 21.8426 Tj
0 -360.748 Td
(6735 ) 21.8426 Tj
0 -370.241 Td
(6736 ) 21.8426 Tj
0 -379.734 Td
(6737 ) 21.8426 Tj
0 -389.228 Td
(6738 ) 21.8426 Tj
0 -398.721 Td
(6739 ) 21.8426 Tj
0 -408.214 Td
(6740 ) 21.8426 Tj
0 -417.708 Td
(6741 ) 21.8426 Tj
0 -427.201 Td
(6742 ) 21.8426 Tj
0 -436.695 Td
(6743 ) 21.8426 Tj
0 -446.188 Td
(6744 ) 21.8426 Tj
0 -455.681 Td
(6745 ) 21.8426 Tj
0 -465.175 Td
(6746 ) 21.8426 Tj
0 -474.668 Td
(6747 ) 21.8426 Tj
0 -484.161 Td
(6748 ) 21.8426 Tj
0 -493.655 Td
(6749 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sh.c  Page 1) 152.898 Tj
0 -28.4801 Td
(6750 // Shell.) 61.1592 Tj
0 -37.9735 Td
(6751 ) 21.8426 Tj
0 -47.4668 Td
(6752 #include "types.h") 100.476 Tj
0 -56.9602 Td
(6753 #include "user.h") 96.1073 Tj
0 -66.4535 Td
(6754 #include "fcntl.h") 100.476 Tj
0 -75.9469 Td
(6755 ) 21.8426 Tj
0 -85.4403 Td
(6756 // Parsed command representation) 161.635 Tj
0 -94.9336 Td
(6757 #define EXEC  1) 87.3703 Tj
0 -104.427 Td
(6758 #define REDIR 2) 87.3703 Tj
0 -113.92 Td
(6759 #define PIPE  3) 87.3703 Tj
0 -123.414 Td
(6760 #define LIST  4) 87.3703 Tj
0 -132.907 Td
(6761 #define BACK  5) 87.3703 Tj
0 -142.4 Td
(6762 ) 21.8426 Tj
0 -151.894 Td
(6763 #define MAXARGS 10) 100.476 Tj
0 -161.387 Td
(6764 ) 21.8426 Tj
0 -170.88 Td
(6765 struct cmd {) 74.2647 Tj
0 -180.374 Td
(6766   int type;) 69.8962 Tj
0 -189.867 Td
(6767 };) 30.5796 Tj
0 -199.361 Td
(6768 ) 21.8426 Tj
0 -208.854 Td
(6769 struct execcmd {) 91.7388 Tj
0 -218.347 Td
(6770   int type;) 69.8962 Tj
0 -227.841 Td
(6771   char *argv[MAXARGS];) 117.95 Tj
0 -237.334 Td
(6772   char *eargv[MAXARGS];) 122.318 Tj
0 -246.827 Td
(6773 };) 30.5796 Tj
0 -256.321 Td
(6774 ) 21.8426 Tj
0 -265.814 Td
(6775 struct redircmd {) 96.1073 Tj
0 -275.307 Td
(6776   int type;) 69.8962 Tj
0 -284.801 Td
(6777   struct cmd *cmd;) 100.476 Tj
0 -294.294 Td
(6778   char *file;) 78.6333 Tj
0 -303.788 Td
(6779   char *efile;) 83.0018 Tj
0 -313.281 Td
(6780   int mode;) 69.8962 Tj
0 -322.774 Td
(6781   int fd;) 61.1592 Tj
0 -332.268 Td
(6782 };) 30.5796 Tj
0 -341.761 Td
(6783 ) 21.8426 Tj
0 -351.254 Td
(6784 struct pipecmd {) 91.7388 Tj
0 -360.748 Td
(6785   int type;) 69.8962 Tj
0 -370.241 Td
(6786   struct cmd *left;) 104.844 Tj
0 -379.734 Td
(6787   struct cmd *right;) 109.213 Tj
0 -389.228 Td
(6788 };) 30.5796 Tj
0 -398.721 Td
(6789 ) 21.8426 Tj
0 -408.214 Td
(6790 struct listcmd {) 91.7388 Tj
0 -417.708 Td
(6791   int type;) 69.8962 Tj
0 -427.201 Td
(6792   struct cmd *left;) 104.844 Tj
0 -436.695 Td
(6793   struct cmd *right;) 109.213 Tj
0 -446.188 Td
(6794 };) 30.5796 Tj
0 -455.681 Td
(6795 ) 21.8426 Tj
0 -465.175 Td
(6796 struct backcmd {) 91.7388 Tj
0 -474.668 Td
(6797   int type;) 69.8962 Tj
0 -484.161 Td
(6798   struct cmd *cmd;) 100.476 Tj
0 -493.655 Td
(6799 };) 30.5796 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sh.c  Page 2) 152.898 Tj
0 -28.4801 Td
(6800 int fork1\(void\);  // Fork but panics on failure.) 231.531 Tj
0 -37.9735 Td
(6801 void panic\(char*\);) 100.476 Tj
0 -47.4668 Td
(6802 struct cmd *parsecmd\(char*\);) 144.161 Tj
0 -56.9602 Td
(6803 ) 21.8426 Tj
0 -66.4535 Td
(6804 // Execute cmd.  Never returns.) 157.267 Tj
0 -75.9469 Td
(6805 void) 39.3166 Tj
0 -85.4403 Td
(6806 runcmd\(struct cmd *cmd\)) 122.318 Tj
0 -94.9336 Td
(6807 {) 26.2111 Tj
0 -104.427 Td
(6808   int p[2];) 69.8962 Tj
0 -113.92 Td
(6809   struct backcmd *bcmd;) 122.318 Tj
0 -123.414 Td
(6810   struct execcmd *ecmd;) 122.318 Tj
0 -132.907 Td
(6811   struct listcmd *lcmd;) 122.318 Tj
0 -142.4 Td
(6812   struct pipecmd *pcmd;) 122.318 Tj
0 -151.894 Td
(6813   struct redircmd *rcmd;) 126.687 Tj
0 -161.387 Td
(6814 ) 21.8426 Tj
0 -170.88 Td
(6815   if\(cmd == 0\)) 83.0018 Tj
0 -180.374 Td
(6816     exit\(\);) 69.8962 Tj
0 -189.867 Td
(6817 ) 21.8426 Tj
0 -199.361 Td
(6818   switch\(cmd->type\){) 109.213 Tj
0 -208.854 Td
(6819   default:) 65.5277 Tj
0 -218.347 Td
(6820     panic\("runcmd"\);) 109.213 Tj
0 -227.841 Td
(6821 ) 21.8426 Tj
0 -237.334 Td
(6822   case EXEC:) 74.2647 Tj
0 -246.827 Td
(6823     ecmd = \(struct execcmd*\)cmd;) 161.635 Tj
0 -256.321 Td
(6824     if\(ecmd->argv[0] == 0\)) 135.424 Tj
0 -265.814 Td
(6825       exit\(\);) 78.6333 Tj
0 -275.307 Td
(6826     exec\(ecmd->argv[0], ecmd->argv\);) 179.109 Tj
0 -284.801 Td
(6827     printf\(2, "exec %s failed\\n", ecmd->argv[0]\);) 235.9 Tj
0 -294.294 Td
(6828     break;) 65.5277 Tj
0 -303.788 Td
(6829 ) 21.8426 Tj
0 -313.281 Td
(6830   case REDIR:) 78.6333 Tj
0 -322.774 Td
(6831     rcmd = \(struct redircmd*\)cmd;) 166.004 Tj
0 -332.268 Td
(6832     close\(rcmd->fd\);) 109.213 Tj
0 -341.761 Td
(6833     if\(open\(rcmd->file, rcmd->mode\) < 0\){) 200.952 Tj
0 -351.254 Td
(6834       printf\(2, "open %s failed\\n", rcmd->file\);) 231.531 Tj
0 -360.748 Td
(6835       exit\(\);) 78.6333 Tj
0 -370.241 Td
(6836     }) 43.6851 Tj
0 -379.734 Td
(6837     runcmd\(rcmd->cmd\);) 117.95 Tj
0 -389.228 Td
(6838     break;) 65.5277 Tj
0 -398.721 Td
(6839 ) 21.8426 Tj
0 -408.214 Td
(6840   case LIST:) 74.2647 Tj
0 -417.708 Td
(6841     lcmd = \(struct listcmd*\)cmd;) 161.635 Tj
0 -427.201 Td
(6842     if\(fork1\(\) == 0\)) 109.213 Tj
0 -436.695 Td
(6843       runcmd\(lcmd->left\);) 131.055 Tj
0 -446.188 Td
(6844     wait\(\);) 69.8962 Tj
0 -455.681 Td
(6845     runcmd\(lcmd->right\);) 126.687 Tj
0 -465.175 Td
(6846     break;) 65.5277 Tj
0 -474.668 Td
(6847 ) 21.8426 Tj
0 -484.161 Td
(6848 ) 21.8426 Tj
0 -493.655 Td
(6849 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sh.c  Page 3) 152.898 Tj
0 -28.4801 Td
(6850   case PIPE:) 74.2647 Tj
0 -37.9735 Td
(6851     pcmd = \(struct pipecmd*\)cmd;) 161.635 Tj
0 -47.4668 Td
(6852     if\(pipe\(p\) < 0\)) 104.844 Tj
0 -56.9602 Td
(6853       panic\("pipe"\);) 109.213 Tj
0 -66.4535 Td
(6854     if\(fork1\(\) == 0\){) 113.581 Tj
0 -75.9469 Td
(6855       close\(1\);) 87.3703 Tj
0 -85.4403 Td
(6856       dup\(p[1]\);) 91.7388 Tj
0 -94.9336 Td
(6857       close\(p[0]\);) 100.476 Tj
0 -104.427 Td
(6858       close\(p[1]\);) 100.476 Tj
0 -113.92 Td
(6859       runcmd\(pcmd->left\);) 131.055 Tj
0 -123.414 Td
(6860     }) 43.6851 Tj
0 -132.907 Td
(6861     if\(fork1\(\) == 0\){) 113.581 Tj
0 -142.4 Td
(6862       close\(0\);) 87.3703 Tj
0 -151.894 Td
(6863       dup\(p[0]\);) 91.7388 Tj
0 -161.387 Td
(6864       close\(p[0]\);) 100.476 Tj
0 -170.88 Td
(6865       close\(p[1]\);) 100.476 Tj
0 -180.374 Td
(6866       runcmd\(pcmd->right\);) 135.424 Tj
0 -189.867 Td
(6867     }) 43.6851 Tj
0 -199.361 Td
(6868     close\(p[0]\);) 91.7388 Tj
0 -208.854 Td
(6869     close\(p[1]\);) 91.7388 Tj
0 -218.347 Td
(6870     wait\(\);) 69.8962 Tj
0 -227.841 Td
(6871     wait\(\);) 69.8962 Tj
0 -237.334 Td
(6872     break;) 65.5277 Tj
0 -246.827 Td
(6873 ) 21.8426 Tj
0 -256.321 Td
(6874   case BACK:) 74.2647 Tj
0 -265.814 Td
(6875     bcmd = \(struct backcmd*\)cmd;) 161.635 Tj
0 -275.307 Td
(6876     if\(fork1\(\) == 0\)) 109.213 Tj
0 -284.801 Td
(6877       runcmd\(bcmd->cmd\);) 126.687 Tj
0 -294.294 Td
(6878     break;) 65.5277 Tj
0 -303.788 Td
(6879   }) 34.9481 Tj
0 -313.281 Td
(6880   exit\(\);) 61.1592 Tj
0 -322.774 Td
(6881 }) 26.2111 Tj
0 -332.268 Td
(6882 ) 21.8426 Tj
0 -341.761 Td
(6883 int) 34.9481 Tj
0 -351.254 Td
(6884 getcmd\(char *buf, int nbuf\)) 139.792 Tj
0 -360.748 Td
(6885 {) 26.2111 Tj
0 -370.241 Td
(6886   printf\(2, "$ "\);) 100.476 Tj
0 -379.734 Td
(6887   memset\(buf, 0, nbuf\);) 122.318 Tj
0 -389.228 Td
(6888   gets\(buf, nbuf\);) 100.476 Tj
0 -398.721 Td
(6889   if\(buf[0] == 0\) // EOF) 126.687 Tj
0 -408.214 Td
(6890     return -1;) 83.0018 Tj
0 -417.708 Td
(6891   return 0;) 69.8962 Tj
0 -427.201 Td
(6892 }) 26.2111 Tj
0 -436.695 Td
(6893 ) 21.8426 Tj
0 -446.188 Td
(6894 ) 21.8426 Tj
0 -455.681 Td
(6895 ) 21.8426 Tj
0 -465.175 Td
(6896 ) 21.8426 Tj
0 -474.668 Td
(6897 ) 21.8426 Tj
0 -484.161 Td
(6898 ) 21.8426 Tj
0 -493.655 Td
(6899 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sh.c  Page 4) 152.898 Tj
0 -28.4801 Td
(6900 int) 34.9481 Tj
0 -37.9735 Td
(6901 main\(void\)) 65.5277 Tj
0 -47.4668 Td
(6902 {) 26.2111 Tj
0 -56.9602 Td
(6903   static char buf[100];) 122.318 Tj
0 -66.4535 Td
(6904   int fd;) 61.1592 Tj
0 -75.9469 Td
(6905 ) 21.8426 Tj
0 -85.4403 Td
(6906   // Assumes three file descriptors open.) 200.952 Tj
0 -94.9336 Td
(6907   while\(\(fd = open\("console", O_RDWR\)\) >= 0\){) 218.426 Tj
0 -104.427 Td
(6908     if\(fd >= 3\){) 91.7388 Tj
0 -113.92 Td
(6909       close\(fd\);) 91.7388 Tj
0 -123.414 Td
(6910       break;) 74.2647 Tj
0 -132.907 Td
(6911     }) 43.6851 Tj
0 -142.4 Td
(6912   }) 34.9481 Tj
0 -151.894 Td
(6913 ) 21.8426 Tj
0 -161.387 Td
(6914   // Read and run input commands.) 166.004 Tj
0 -170.88 Td
(6915   while\(getcmd\(buf, sizeof\(buf\)\) >= 0\){) 192.215 Tj
0 -180.374 Td
(6916     if\(fork1\(\) == 0\)) 109.213 Tj
0 -189.867 Td
(6917       runcmd\(parsecmd\(buf\)\);) 144.161 Tj
0 -199.361 Td
(6918     wait\(\);) 69.8962 Tj
0 -208.854 Td
(6919   }) 34.9481 Tj
0 -218.347 Td
(6920   exit\(\);) 61.1592 Tj
0 -227.841 Td
(6921 }) 26.2111 Tj
0 -237.334 Td
(6922 ) 21.8426 Tj
0 -246.827 Td
(6923 void) 39.3166 Tj
0 -256.321 Td
(6924 panic\(char *s\)) 83.0018 Tj
0 -265.814 Td
(6925 {) 26.2111 Tj
0 -275.307 Td
(6926   printf\(2, "%s\\n", s\);) 122.318 Tj
0 -284.801 Td
(6927   exit\(\);) 61.1592 Tj
0 -294.294 Td
(6928 }) 26.2111 Tj
0 -303.788 Td
(6929 ) 21.8426 Tj
0 -313.281 Td
(6930 int) 34.9481 Tj
0 -322.774 Td
(6931 fork1\(void\)) 69.8962 Tj
0 -332.268 Td
(6932 {) 26.2111 Tj
0 -341.761 Td
(6933   int pid;) 65.5277 Tj
0 -351.254 Td
(6934 ) 21.8426 Tj
0 -360.748 Td
(6935   pid = fork\(\);) 87.3703 Tj
0 -370.241 Td
(6936   if\(pid == -1\)) 87.3703 Tj
0 -379.734 Td
(6937     panic\("fork"\);) 100.476 Tj
0 -389.228 Td
(6938   return pid;) 78.6333 Tj
0 -398.721 Td
(6939 }) 26.2111 Tj
0 -408.214 Td
(6940 ) 21.8426 Tj
0 -417.708 Td
(6941 ) 21.8426 Tj
0 -427.201 Td
(6942 ) 21.8426 Tj
0 -436.695 Td
(6943 ) 21.8426 Tj
0 -446.188 Td
(6944 ) 21.8426 Tj
0 -455.681 Td
(6945 ) 21.8426 Tj
0 -465.175 Td
(6946 ) 21.8426 Tj
0 -474.668 Td
(6947 ) 21.8426 Tj
0 -484.161 Td
(6948 ) 21.8426 Tj
0 -493.655 Td
(6949 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sh.c  Page 5) 152.898 Tj
0 -28.4801 Td
(6950 // Constructors) 87.3703 Tj
0 -37.9735 Td
(6951 ) 21.8426 Tj
0 -47.4668 Td
(6952 struct cmd*) 69.8962 Tj
0 -56.9602 Td
(6953 execcmd\(void\)) 78.6333 Tj
0 -66.4535 Td
(6954 {) 26.2111 Tj
0 -75.9469 Td
(6955   struct execcmd *cmd;) 117.95 Tj
0 -85.4403 Td
(6956 ) 21.8426 Tj
0 -94.9336 Td
(6957   cmd = malloc\(sizeof\(*cmd\)\);) 148.529 Tj
0 -104.427 Td
(6958   memset\(cmd, 0, sizeof\(*cmd\)\);) 157.267 Tj
0 -113.92 Td
(6959   cmd->type = EXEC;) 104.844 Tj
0 -123.414 Td
(6960   return \(struct cmd*\)cmd;) 135.424 Tj
0 -132.907 Td
(6961 }) 26.2111 Tj
0 -142.4 Td
(6962 ) 21.8426 Tj
0 -151.894 Td
(6963 struct cmd*) 69.8962 Tj
0 -161.387 Td
(6964 redircmd\(struct cmd *subcmd, char *file, char *efile, int\
 mode, int fd\)) 332.007 Tj
0 -170.88 Td
(6965 {) 26.2111 Tj
0 -180.374 Td
(6966   struct redircmd *cmd;) 122.318 Tj
0 -189.867 Td
(6967 ) 21.8426 Tj
0 -199.361 Td
(6968   cmd = malloc\(sizeof\(*cmd\)\);) 148.529 Tj
0 -208.854 Td
(6969   memset\(cmd, 0, sizeof\(*cmd\)\);) 157.267 Tj
0 -218.347 Td
(6970   cmd->type = REDIR;) 109.213 Tj
0 -227.841 Td
(6971   cmd->cmd = subcmd;) 109.213 Tj
0 -237.334 Td
(6972   cmd->file = file;) 104.844 Tj
0 -246.827 Td
(6973   cmd->efile = efile;) 113.581 Tj
0 -256.321 Td
(6974   cmd->mode = mode;) 104.844 Tj
0 -265.814 Td
(6975   cmd->fd = fd;) 87.3703 Tj
0 -275.307 Td
(6976   return \(struct cmd*\)cmd;) 135.424 Tj
0 -284.801 Td
(6977 }) 26.2111 Tj
0 -294.294 Td
(6978 ) 21.8426 Tj
0 -303.788 Td
(6979 struct cmd*) 69.8962 Tj
0 -313.281 Td
(6980 pipecmd\(struct cmd *left, struct cmd *right\)) 214.057 Tj
0 -322.774 Td
(6981 {) 26.2111 Tj
0 -332.268 Td
(6982   struct pipecmd *cmd;) 117.95 Tj
0 -341.761 Td
(6983 ) 21.8426 Tj
0 -351.254 Td
(6984   cmd = malloc\(sizeof\(*cmd\)\);) 148.529 Tj
0 -360.748 Td
(6985   memset\(cmd, 0, sizeof\(*cmd\)\);) 157.267 Tj
0 -370.241 Td
(6986   cmd->type = PIPE;) 104.844 Tj
0 -379.734 Td
(6987   cmd->left = left;) 104.844 Tj
0 -389.228 Td
(6988   cmd->right = right;) 113.581 Tj
0 -398.721 Td
(6989   return \(struct cmd*\)cmd;) 135.424 Tj
0 -408.214 Td
(6990 }) 26.2111 Tj
0 -417.708 Td
(6991 ) 21.8426 Tj
0 -427.201 Td
(6992 ) 21.8426 Tj
0 -436.695 Td
(6993 ) 21.8426 Tj
0 -446.188 Td
(6994 ) 21.8426 Tj
0 -455.681 Td
(6995 ) 21.8426 Tj
0 -465.175 Td
(6996 ) 21.8426 Tj
0 -474.668 Td
(6997 ) 21.8426 Tj
0 -484.161 Td
(6998 ) 21.8426 Tj
0 -493.655 Td
(6999 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sh.c  Page 6) 152.898 Tj
0 -28.4801 Td
(7000 struct cmd*) 69.8962 Tj
0 -37.9735 Td
(7001 listcmd\(struct cmd *left, struct cmd *right\)) 214.057 Tj
0 -47.4668 Td
(7002 {) 26.2111 Tj
0 -56.9602 Td
(7003   struct listcmd *cmd;) 117.95 Tj
0 -66.4535 Td
(7004 ) 21.8426 Tj
0 -75.9469 Td
(7005   cmd = malloc\(sizeof\(*cmd\)\);) 148.529 Tj
0 -85.4403 Td
(7006   memset\(cmd, 0, sizeof\(*cmd\)\);) 157.267 Tj
0 -94.9336 Td
(7007   cmd->type = LIST;) 104.844 Tj
0 -104.427 Td
(7008   cmd->left = left;) 104.844 Tj
0 -113.92 Td
(7009   cmd->right = right;) 113.581 Tj
0 -123.414 Td
(7010   return \(struct cmd*\)cmd;) 135.424 Tj
0 -132.907 Td
(7011 }) 26.2111 Tj
0 -142.4 Td
(7012 ) 21.8426 Tj
0 -151.894 Td
(7013 struct cmd*) 69.8962 Tj
0 -161.387 Td
(7014 backcmd\(struct cmd *subcmd\)) 139.792 Tj
0 -170.88 Td
(7015 {) 26.2111 Tj
0 -180.374 Td
(7016   struct backcmd *cmd;) 117.95 Tj
0 -189.867 Td
(7017 ) 21.8426 Tj
0 -199.361 Td
(7018   cmd = malloc\(sizeof\(*cmd\)\);) 148.529 Tj
0 -208.854 Td
(7019   memset\(cmd, 0, sizeof\(*cmd\)\);) 157.267 Tj
0 -218.347 Td
(7020   cmd->type = BACK;) 104.844 Tj
0 -227.841 Td
(7021   cmd->cmd = subcmd;) 109.213 Tj
0 -237.334 Td
(7022   return \(struct cmd*\)cmd;) 135.424 Tj
0 -246.827 Td
(7023 }) 26.2111 Tj
0 -256.321 Td
(7024 ) 21.8426 Tj
0 -265.814 Td
(7025 ) 21.8426 Tj
0 -275.307 Td
(7026 ) 21.8426 Tj
0 -284.801 Td
(7027 ) 21.8426 Tj
0 -294.294 Td
(7028 ) 21.8426 Tj
0 -303.788 Td
(7029 ) 21.8426 Tj
0 -313.281 Td
(7030 ) 21.8426 Tj
0 -322.774 Td
(7031 ) 21.8426 Tj
0 -332.268 Td
(7032 ) 21.8426 Tj
0 -341.761 Td
(7033 ) 21.8426 Tj
0 -351.254 Td
(7034 ) 21.8426 Tj
0 -360.748 Td
(7035 ) 21.8426 Tj
0 -370.241 Td
(7036 ) 21.8426 Tj
0 -379.734 Td
(7037 ) 21.8426 Tj
0 -389.228 Td
(7038 ) 21.8426 Tj
0 -398.721 Td
(7039 ) 21.8426 Tj
0 -408.214 Td
(7040 ) 21.8426 Tj
0 -417.708 Td
(7041 ) 21.8426 Tj
0 -427.201 Td
(7042 ) 21.8426 Tj
0 -436.695 Td
(7043 ) 21.8426 Tj
0 -446.188 Td
(7044 ) 21.8426 Tj
0 -455.681 Td
(7045 ) 21.8426 Tj
0 -465.175 Td
(7046 ) 21.8426 Tj
0 -474.668 Td
(7047 ) 21.8426 Tj
0 -484.161 Td
(7048 ) 21.8426 Tj
0 -493.655 Td
(7049 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sh.c  Page 7) 152.898 Tj
0 -28.4801 Td
(7050 // Parsing) 65.5277 Tj
0 -37.9735 Td
(7051 ) 21.8426 Tj
0 -47.4668 Td
(7052 char whitespace[] = " \\t\\r\\n\\v";) 161.635 Tj
0 -56.9602 Td
(7053 char symbols[] = "<|>&;\(\)";) 139.792 Tj
0 -66.4535 Td
(7054 ) 21.8426 Tj
0 -75.9469 Td
(7055 int) 34.9481 Tj
0 -85.4403 Td
(7056 gettoken\(char **ps, char *es, char **q, char **eq\)) 240.268 Tj
0 -94.9336 Td
(7057 {) 26.2111 Tj
0 -104.427 Td
(7058   char *s;) 65.5277 Tj
0 -113.92 Td
(7059   int ret;) 65.5277 Tj
0 -123.414 Td
(7060 ) 21.8426 Tj
0 -132.907 Td
(7061   s = *ps;) 65.5277 Tj
0 -142.4 Td
(7062   while\(s < es && strchr\(whitespace, *s\)\)) 200.952 Tj
0 -151.894 Td
(7063     s++;) 56.7907 Tj
0 -161.387 Td
(7064   if\(q\)) 52.4222 Tj
0 -170.88 Td
(7065     *q = s;) 69.8962 Tj
0 -180.374 Td
(7066   ret = *s;) 69.8962 Tj
0 -189.867 Td
(7067   switch\(*s\){) 78.6333 Tj
0 -199.361 Td
(7068   case 0:) 61.1592 Tj
0 -208.854 Td
(7069     break;) 65.5277 Tj
0 -218.347 Td
(7070   case '|':) 69.8962 Tj
0 -227.841 Td
(7071   case '\(':) 69.8962 Tj
0 -237.334 Td
(7072   case '\)':) 69.8962 Tj
0 -246.827 Td
(7073   case ';':) 69.8962 Tj
0 -256.321 Td
(7074   case '&':) 69.8962 Tj
0 -265.814 Td
(7075   case '<':) 69.8962 Tj
0 -275.307 Td
(7076     s++;) 56.7907 Tj
0 -284.801 Td
(7077     break;) 65.5277 Tj
0 -294.294 Td
(7078   case '>':) 69.8962 Tj
0 -303.788 Td
(7079     s++;) 56.7907 Tj
0 -313.281 Td
(7080     if\(*s == '>'\){) 100.476 Tj
0 -322.774 Td
(7081       ret = '+';) 91.7388 Tj
0 -332.268 Td
(7082       s++;) 65.5277 Tj
0 -341.761 Td
(7083     }) 43.6851 Tj
0 -351.254 Td
(7084     break;) 65.5277 Tj
0 -360.748 Td
(7085   default:) 65.5277 Tj
0 -370.241 Td
(7086     ret = 'a';) 83.0018 Tj
0 -379.734 Td
(7087     while\(s < es && !strchr\(whitespace, *s\) && !strchr\(\
symbols, *s\)\)) 318.902 Tj
0 -389.228 Td
(7088       s++;) 65.5277 Tj
0 -398.721 Td
(7089     break;) 65.5277 Tj
0 -408.214 Td
(7090   }) 34.9481 Tj
0 -417.708 Td
(7091   if\(eq\)) 56.7907 Tj
0 -427.201 Td
(7092     *eq = s;) 74.2647 Tj
0 -436.695 Td
(7093 ) 21.8426 Tj
0 -446.188 Td
(7094   while\(s < es && strchr\(whitespace, *s\)\)) 200.952 Tj
0 -455.681 Td
(7095     s++;) 56.7907 Tj
0 -465.175 Td
(7096   *ps = s;) 65.5277 Tj
0 -474.668 Td
(7097   return ret;) 78.6333 Tj
0 -484.161 Td
(7098 }) 26.2111 Tj
0 -493.655 Td
(7099 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sh.c  Page 8) 152.898 Tj
0 -28.4801 Td
(7100 int) 34.9481 Tj
0 -37.9735 Td
(7101 peek\(char **ps, char *es, char *toks\)) 183.478 Tj
0 -47.4668 Td
(7102 {) 26.2111 Tj
0 -56.9602 Td
(7103   char *s;) 65.5277 Tj
0 -66.4535 Td
(7104 ) 21.8426 Tj
0 -75.9469 Td
(7105   s = *ps;) 65.5277 Tj
0 -85.4403 Td
(7106   while\(s < es && strchr\(whitespace, *s\)\)) 200.952 Tj
0 -94.9336 Td
(7107     s++;) 56.7907 Tj
0 -104.427 Td
(7108   *ps = s;) 65.5277 Tj
0 -113.92 Td
(7109   return *s && strchr\(toks, *s\);) 161.635 Tj
0 -123.414 Td
(7110 }) 26.2111 Tj
0 -132.907 Td
(7111 ) 21.8426 Tj
0 -142.4 Td
(7112 struct cmd *parseline\(char**, char*\);) 183.478 Tj
0 -151.894 Td
(7113 struct cmd *parsepipe\(char**, char*\);) 183.478 Tj
0 -161.387 Td
(7114 struct cmd *parseexec\(char**, char*\);) 183.478 Tj
0 -170.88 Td
(7115 struct cmd *nulterminate\(struct cmd*\);) 187.846 Tj
0 -180.374 Td
(7116 ) 21.8426 Tj
0 -189.867 Td
(7117 struct cmd*) 69.8962 Tj
0 -199.361 Td
(7118 parsecmd\(char *s\)) 96.1073 Tj
0 -208.854 Td
(7119 {) 26.2111 Tj
0 -218.347 Td
(7120   char *es;) 69.8962 Tj
0 -227.841 Td
(7121   struct cmd *cmd;) 100.476 Tj
0 -237.334 Td
(7122 ) 21.8426 Tj
0 -246.827 Td
(7123   es = s + strlen\(s\);) 113.581 Tj
0 -256.321 Td
(7124   cmd = parseline\(&s, es\);) 135.424 Tj
0 -265.814 Td
(7125   peek\(&s, es, ""\);) 104.844 Tj
0 -275.307 Td
(7126   if\(s != es\){) 83.0018 Tj
0 -284.801 Td
(7127     printf\(2, "leftovers: %s\\n", s\);) 179.109 Tj
0 -294.294 Td
(7128     panic\("syntax"\);) 109.213 Tj
0 -303.788 Td
(7129   }) 34.9481 Tj
0 -313.281 Td
(7130   nulterminate\(cmd\);) 109.213 Tj
0 -322.774 Td
(7131   return cmd;) 78.6333 Tj
0 -332.268 Td
(7132 }) 26.2111 Tj
0 -341.761 Td
(7133 ) 21.8426 Tj
0 -351.254 Td
(7134 struct cmd*) 69.8962 Tj
0 -360.748 Td
(7135 parseline\(char **ps, char *es\)) 152.898 Tj
0 -370.241 Td
(7136 {) 26.2111 Tj
0 -379.734 Td
(7137   struct cmd *cmd;) 100.476 Tj
0 -389.228 Td
(7138 ) 21.8426 Tj
0 -398.721 Td
(7139   cmd = parsepipe\(ps, es\);) 135.424 Tj
0 -408.214 Td
(7140   while\(peek\(ps, es, "&"\)\){) 139.792 Tj
0 -417.708 Td
(7141     gettoken\(ps, es, 0, 0\);) 139.792 Tj
0 -427.201 Td
(7142     cmd = backcmd\(cmd\);) 122.318 Tj
0 -436.695 Td
(7143   }) 34.9481 Tj
0 -446.188 Td
(7144   if\(peek\(ps, es, ";"\)\){) 126.687 Tj
0 -455.681 Td
(7145     gettoken\(ps, es, 0, 0\);) 139.792 Tj
0 -465.175 Td
(7146     cmd = listcmd\(cmd, parseline\(ps, es\)\);) 205.32 Tj
0 -474.668 Td
(7147   }) 34.9481 Tj
0 -484.161 Td
(7148   return cmd;) 78.6333 Tj
0 -493.655 Td
(7149 }) 26.2111 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sh.c  Page 9) 152.898 Tj
0 -28.4801 Td
(7150 struct cmd*) 69.8962 Tj
0 -37.9735 Td
(7151 parsepipe\(char **ps, char *es\)) 152.898 Tj
0 -47.4668 Td
(7152 {) 26.2111 Tj
0 -56.9602 Td
(7153   struct cmd *cmd;) 100.476 Tj
0 -66.4535 Td
(7154 ) 21.8426 Tj
0 -75.9469 Td
(7155   cmd = parseexec\(ps, es\);) 135.424 Tj
0 -85.4403 Td
(7156   if\(peek\(ps, es, "|"\)\){) 126.687 Tj
0 -94.9336 Td
(7157     gettoken\(ps, es, 0, 0\);) 139.792 Tj
0 -104.427 Td
(7158     cmd = pipecmd\(cmd, parsepipe\(ps, es\)\);) 205.32 Tj
0 -113.92 Td
(7159   }) 34.9481 Tj
0 -123.414 Td
(7160   return cmd;) 78.6333 Tj
0 -132.907 Td
(7161 }) 26.2111 Tj
0 -142.4 Td
(7162 ) 21.8426 Tj
0 -151.894 Td
(7163 struct cmd*) 69.8962 Tj
0 -161.387 Td
(7164 parseredirs\(struct cmd *cmd, char **ps, char *es\)) 235.9 Tj
0 -170.88 Td
(7165 {) 26.2111 Tj
0 -180.374 Td
(7166   int tok;) 65.5277 Tj
0 -189.867 Td
(7167   char *q, *eq;) 87.3703 Tj
0 -199.361 Td
(7168 ) 21.8426 Tj
0 -208.854 Td
(7169   while\(peek\(ps, es, "<>"\)\){) 144.161 Tj
0 -218.347 Td
(7170     tok = gettoken\(ps, es, 0, 0\);) 166.004 Tj
0 -227.841 Td
(7171     if\(gettoken\(ps, es, &q, &eq\) != 'a'\)) 196.583 Tj
0 -237.334 Td
(7172       panic\("missing file for redirection"\);) 214.057 Tj
0 -246.827 Td
(7173     switch\(tok\){) 91.7388 Tj
0 -256.321 Td
(7174     case '<':) 78.6333 Tj
0 -265.814 Td
(7175       cmd = redircmd\(cmd, q, eq, O_RDONLY, 0\);) 222.794 Tj
0 -275.307 Td
(7176       break;) 74.2647 Tj
0 -284.801 Td
(7177     case '>':) 78.6333 Tj
0 -294.294 Td
(7178       cmd = redircmd\(cmd, q, eq, O_WRONLY|O_CREATE, 1\);) 262.111 Tj
0 -303.788 Td
(7179       break;) 74.2647 Tj
0 -313.281 Td
(7180     case '+':  // >>) 109.213 Tj
0 -322.774 Td
(7181       cmd = redircmd\(cmd, q, eq, O_WRONLY|O_CREATE, 1\);) 262.111 Tj
0 -332.268 Td
(7182       break;) 74.2647 Tj
0 -341.761 Td
(7183     }) 43.6851 Tj
0 -351.254 Td
(7184   }) 34.9481 Tj
0 -360.748 Td
(7185   return cmd;) 78.6333 Tj
0 -370.241 Td
(7186 }) 26.2111 Tj
0 -379.734 Td
(7187 ) 21.8426 Tj
0 -389.228 Td
(7188 ) 21.8426 Tj
0 -398.721 Td
(7189 ) 21.8426 Tj
0 -408.214 Td
(7190 ) 21.8426 Tj
0 -417.708 Td
(7191 ) 21.8426 Tj
0 -427.201 Td
(7192 ) 21.8426 Tj
0 -436.695 Td
(7193 ) 21.8426 Tj
0 -446.188 Td
(7194 ) 21.8426 Tj
0 -455.681 Td
(7195 ) 21.8426 Tj
0 -465.175 Td
(7196 ) 21.8426 Tj
0 -474.668 Td
(7197 ) 21.8426 Tj
0 -484.161 Td
(7198 ) 21.8426 Tj
0 -493.655 Td
(7199 ) 21.8426 Tj
0 -522.135 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
0 0 612 792 re
W
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.967854 1 0 564.72 738.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sh.c  Page 10) 157.267 Tj
0 -28.4801 Td
(7200 struct cmd*) 69.8962 Tj
0 -37.9735 Td
(7201 parseblock\(char **ps, char *es\)) 157.267 Tj
0 -47.4668 Td
(7202 {) 26.2111 Tj
0 -56.9602 Td
(7203   struct cmd *cmd;) 100.476 Tj
0 -66.4535 Td
(7204 ) 21.8426 Tj
0 -75.9469 Td
(7205   if\(!peek\(ps, es, "\("\)\)) 126.687 Tj
0 -85.4403 Td
(7206     panic\("parseblock"\);) 126.687 Tj
0 -94.9336 Td
(7207   gettoken\(ps, es, 0, 0\);) 131.055 Tj
0 -104.427 Td
(7208   cmd = parseline\(ps, es\);) 135.424 Tj
0 -113.92 Td
(7209   if\(!peek\(ps, es, "\)"\)\)) 126.687 Tj
0 -123.414 Td
(7210     panic\("syntax - missing \)"\);) 161.635 Tj
0 -132.907 Td
(7211   gettoken\(ps, es, 0, 0\);) 131.055 Tj
0 -142.4 Td
(7212   cmd = parseredirs\(cmd, ps, es\);) 166.004 Tj
0 -151.894 Td
(7213   return cmd;) 78.6333 Tj
0 -161.387 Td
(7214 }) 26.2111 Tj
0 -170.88 Td
(7215 ) 21.8426 Tj
0 -180.374 Td
(7216 struct cmd*) 69.8962 Tj
0 -189.867 Td
(7217 parseexec\(char **ps, char *es\)) 152.898 Tj
0 -199.361 Td
(7218 {) 26.2111 Tj
0 -208.854 Td
(7219   char *q, *eq;) 87.3703 Tj
0 -218.347 Td
(7220   int tok, argc;) 91.7388 Tj
0 -227.841 Td
(7221   struct execcmd *cmd;) 117.95 Tj
0 -237.334 Td
(7222   struct cmd *ret;) 100.476 Tj
0 -246.827 Td
(7223 ) 21.8426 Tj
0 -256.321 Td
(7224   if\(peek\(ps, es, "\("\)\)) 122.318 Tj
0 -265.814 Td
(7225     return parseblock\(ps, es\);) 152.898 Tj
0 -275.307 Td
(7226 ) 21.8426 Tj
0 -284.801 Td
(7227   ret = execcmd\(\);) 100.476 Tj
0 -294.294 Td
(7228   cmd = \(struct execcmd*\)ret;) 148.529 Tj
0 -303.788 Td
(7229 ) 21.8426 Tj
0 -313.281 Td
(7230   argc = 0;) 69.8962 Tj
0 -322.774 Td
(7231   ret = parseredirs\(ret, ps, es\);) 166.004 Tj
0 -332.268 Td
(7232   while\(!peek\(ps, es, "|\)&;"\)\){) 157.267 Tj
0 -341.761 Td
(7233     if\(\(tok=gettoken\(ps, es, &q, &eq\)\) == 0\)) 214.057 Tj
0 -351.254 Td
(7234       break;) 74.2647 Tj
0 -360.748 Td
(7235     if\(tok != 'a'\)) 100.476 Tj
0 -370.241 Td
(7236       panic\("syntax"\);) 117.95 Tj
0 -379.734 Td
(7237     cmd->argv[argc] = q;) 126.687 Tj
0 -389.228 Td
(7238     cmd->eargv[argc] = eq;) 135.424 Tj
0 -398.721 Td
(7239     argc++;) 69.8962 Tj
0 -408.214 Td
(7240     if\(argc >= MAXARGS\)) 122.318 Tj
0 -417.708 Td
(7241       panic\("too many args"\);) 148.529 Tj
0 -427.201 Td
(7242     ret = parseredirs\(ret, ps, es\);) 174.741 Tj
0 -436.695 Td
(7243   }) 34.9481 Tj
0 -446.188 Td
(7244   cmd->argv[argc] = 0;) 117.95 Tj
0 -455.681 Td
(7245   cmd->eargv[argc] = 0;) 122.318 Tj
0 -465.175 Td
(7246   return ret;) 78.6333 Tj
0 -474.668 Td
(7247 }) 26.2111 Tj
0 -484.161 Td
(7248 ) 21.8426 Tj
0 -493.655 Td
(7249 ) 21.8426 Tj
0 -522.135 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.967854 1 0 564.72 392.864] Tm
0 0 Td
/F9_0 8.70222 Tf
(Aug 30 10:08 2007  xv6/sh.c  Page 11) 157.267 Tj
0 -28.4801 Td
(7250 // NUL-terminate all the counted strings.) 200.952 Tj
0 -37.9735 Td
(7251 struct cmd*) 69.8962 Tj
0 -47.4668 Td
(7252 nulterminate\(struct cmd *cmd\)) 148.529 Tj
0 -56.9602 Td
(7253 {) 26.2111 Tj
0 -66.4535 Td
(7254   int i;) 56.7907 Tj
0 -75.9469 Td
(7255   struct backcmd *bcmd;) 122.318 Tj
0 -85.4403 Td
(7256   struct execcmd *ecmd;) 122.318 Tj
0 -94.9336 Td
(7257   struct listcmd *lcmd;) 122.318 Tj
0 -104.427 Td
(7258   struct pipecmd *pcmd;) 122.318 Tj
0 -113.92 Td
(7259   struct redircmd *rcmd;) 126.687 Tj
0 -123.414 Td
(7260 ) 21.8426 Tj
0 -132.907 Td
(7261   if\(cmd == 0\)) 83.0018 Tj
0 -142.4 Td
(7262     return 0;) 78.6333 Tj
0 -151.894 Td
(7263 ) 21.8426 Tj
0 -161.387 Td
(7264   switch\(cmd->type\){) 109.213 Tj
0 -170.88 Td
(7265   case EXEC:) 74.2647 Tj
0 -180.374 Td
(7266     ecmd = \(struct execcmd*\)cmd;) 161.635 Tj
0 -189.867 Td
(7267     for\(i=0; ecmd->argv[i]; i++\)) 161.635 Tj
0 -199.361 Td
(7268       *ecmd->eargv[i] = 0;) 135.424 Tj
0 -208.854 Td
(7269     break;) 65.5277 Tj
0 -218.347 Td
(7270 ) 21.8426 Tj
0 -227.841 Td
(7271   case REDIR:) 78.6333 Tj
0 -237.334 Td
(7272     rcmd = \(struct redircmd*\)cmd;) 166.004 Tj
0 -246.827 Td
(7273     nulterminate\(rcmd->cmd\);) 144.161 Tj
0 -256.321 Td
(7274     *rcmd->efile = 0;) 113.581 Tj
0 -265.814 Td
(7275     break;) 65.5277 Tj
0 -275.307 Td
(7276 ) 21.8426 Tj
0 -284.801 Td
(7277   case PIPE:) 74.2647 Tj
0 -294.294 Td
(7278     pcmd = \(struct pipecmd*\)cmd;) 161.635 Tj
0 -303.788 Td
(7279     nulterminate\(pcmd->left\);) 148.529 Tj
0 -313.281 Td
(7280     nulterminate\(pcmd->right\);) 152.898 Tj
0 -322.774 Td
(7281     break;) 65.5277 Tj
0 -332.268 Td
(7282 ) 21.8426 Tj
0 -341.761 Td
(7283   case LIST:) 74.2647 Tj
0 -351.254 Td
(7284     lcmd = \(struct listcmd*\)cmd;) 161.635 Tj
0 -360.748 Td
(7285     nulterminate\(lcmd->left\);) 148.529 Tj
0 -370.241 Td
(7286     nulterminate\(lcmd->right\);) 152.898 Tj
0 -379.734 Td
(7287     break;) 65.5277 Tj
0 -389.228 Td
(7288 ) 21.8426 Tj
0 -398.721 Td
(7289   case BACK:) 74.2647 Tj
0 -408.214 Td
(7290     bcmd = \(struct backcmd*\)cmd;) 161.635 Tj
0 -417.708 Td
(7291     nulterminate\(bcmd->cmd\);) 144.161 Tj
0 -427.201 Td
(7292     break;) 65.5277 Tj
0 -436.695 Td
(7293   }) 34.9481 Tj
0 -446.188 Td
(7294   return cmd;) 78.6333 Tj
0 -455.681 Td
(7295 }) 26.2111 Tj
0 -465.175 Td
(7296 ) 21.8426 Tj
0 -474.668 Td
(7297 ) 21.8426 Tj
0 -484.161 Td
(7298 ) 21.8426 Tj
0 -493.655 Td
(7299 ) 21.8426 Tj
0 -522.135 Td
(Sheet 72) 34.9481 Tj
Q
Q
Q
Q
showpage
%%PageTrailer
pdfEndPage
%%Trailer
end
%%DocumentSuppliedResources:
%%+ font LucidaSans-Typewriter83
%%EOF