system comments
This commit is contained in:
+77
-70
@@ -190,31 +190,34 @@
|
||||
"** 01-s1.pdf page 10
|
||||
jmp okexit
|
||||
|
||||
" open system call
|
||||
" sys open; filename_ptr; flags (0 for read, 1 for write)
|
||||
" returns w/ "fd" in AC (or -1 if not found)
|
||||
.open:
|
||||
jms arg
|
||||
dac 0f
|
||||
jms arg
|
||||
sza
|
||||
lac d1
|
||||
sna
|
||||
lac d2 " mode bit 2 (read?)
|
||||
jms arg " get filename
|
||||
dac 0f " save for namei
|
||||
jms arg " get flags
|
||||
sza " zero (read)
|
||||
lac d1 " no: get write mode bit
|
||||
sna " non-zero (write)?
|
||||
lac d2 " no: get read mode bot
|
||||
dac mode " save for access call
|
||||
lac u.cdir
|
||||
jms namei; 0:0
|
||||
jms error
|
||||
lac u.cdir " get current working directory
|
||||
jms namei; 0:0 " search for file
|
||||
jms error " error: return -1
|
||||
jms iget
|
||||
jms access
|
||||
lac i.flags
|
||||
and o20
|
||||
sna
|
||||
jmp open1
|
||||
lac mode
|
||||
and d1
|
||||
sna
|
||||
jmp open1
|
||||
lac u.uid
|
||||
sma
|
||||
jms error
|
||||
jms access " check access (may return w/ error to user)
|
||||
lac i.flags " get file flags
|
||||
and o20 " get directory bit
|
||||
sna " is directory?
|
||||
jmp open1 " no
|
||||
lac mode " get access mode
|
||||
and d1 " get write bit
|
||||
sna " write access?
|
||||
jmp open1 " no, continue
|
||||
lac u.uid " yes: get uid?
|
||||
sma " negative (-1 is superuser)
|
||||
jms error " no: return error
|
||||
jmp open1
|
||||
|
||||
.creat:
|
||||
@@ -275,63 +278,67 @@ open1:
|
||||
and d1
|
||||
sza
|
||||
jms error
|
||||
lac i.flags
|
||||
and o40
|
||||
sna
|
||||
jmp 1f
|
||||
iof
|
||||
lac ii
|
||||
tad swr
|
||||
lac i.flags " get inode flags
|
||||
and o40 " get special file bit
|
||||
sna " special?
|
||||
jmp 1f " no
|
||||
iof " yes: disable interrupts
|
||||
lac ii " get i number
|
||||
tad swr " get read routine table addr
|
||||
dac .+1
|
||||
jmp .. i
|
||||
jmp .. i " dispatch to read routine
|
||||
1:
|
||||
lac u.base
|
||||
dac 1f+1
|
||||
lac u.count
|
||||
dac 1f+2
|
||||
lac f.badd
|
||||
lac u.base " get user base
|
||||
dac 1f+1 " save as iread base
|
||||
lac u.count " get user count
|
||||
dac 1f+2 " save as iread count
|
||||
lac f.badd " get file offset
|
||||
1:
|
||||
jms iread; ..; ..
|
||||
jmp exitrw
|
||||
|
||||
" write system call:
|
||||
" AC/ fd
|
||||
" sys write; buffer; count
|
||||
" AC/ count or -1 on error
|
||||
.write:
|
||||
jms arg
|
||||
and o17777
|
||||
dac u.base
|
||||
jms arg
|
||||
dac u.count
|
||||
tad u.base
|
||||
jms betwen; u.base; o17777
|
||||
jms error
|
||||
dac u.limit
|
||||
jms finac
|
||||
lac f.flags
|
||||
and d1
|
||||
sna
|
||||
jms error
|
||||
lac i.flags
|
||||
and o40
|
||||
jms arg " pick up buffer
|
||||
and o17777 " mask to addr
|
||||
dac u.base " save as I/O base
|
||||
jms arg " pick up count
|
||||
dac u.count " save as count
|
||||
tad u.base " add base (get limit)
|
||||
jms betwen; u.base; o17777 " check between base and end of memory
|
||||
jms error " no: error
|
||||
dac u.limit " yes: save as limit
|
||||
jms finac " get fnode with fd from user AC
|
||||
lac f.flags " get file table flags
|
||||
and d1 " open for write?
|
||||
sna " yes, skip
|
||||
jms error " no: error
|
||||
lac i.flags " get inode flags
|
||||
and o40 " get special bit?
|
||||
"** 01-s1.pdf page 12
|
||||
sna
|
||||
jmp 1f
|
||||
iof
|
||||
lac ii
|
||||
tad sww
|
||||
sna " special?
|
||||
jmp 1f " no
|
||||
iof " special file (device node)
|
||||
lac ii " get i number
|
||||
tad sww " get write routine
|
||||
dac .+1
|
||||
jmp .. i
|
||||
jmp .. i " dispatch to write routine
|
||||
1: " here with regular file
|
||||
lac u.base " get base
|
||||
dac 1f+1 " save as iwrite arg 1
|
||||
lac u.count " get count
|
||||
dac 1f+2 " save as iwrite 2
|
||||
lac f.badd " get fd offset
|
||||
1:
|
||||
lac u.base
|
||||
dac 1f+1
|
||||
lac u.count
|
||||
dac 1f+2
|
||||
lac f.badd
|
||||
1:
|
||||
jms iwrite; ..; ..
|
||||
jms iwrite; ..; .. " write to file
|
||||
|
||||
exitrw:
|
||||
dac u.ac
|
||||
exitrw: " common exit for read/write system calls
|
||||
dac u.ac " save return in user AC
|
||||
tad f.badd
|
||||
dac f.badd
|
||||
jms iput
|
||||
jms fput
|
||||
jmp sysexit
|
||||
dac f.badd " update file offset
|
||||
jms iput " release inode
|
||||
jms fput " release fnode
|
||||
jmp sysexit " return to user
|
||||
|
||||
Reference in New Issue
Block a user