⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os.tcl

📁 一个用在mips体系结构中的操作系统
💻 TCL
字号:
## Copyright (C) 1998 by the Board of Trustees#    of Leland Stanford Junior University.# Copyright (C) 1998 Digital Equipment Corporation## This file is part of the SimOS distribution.# See LICENSE file for terms of the license.### Copyright (C) 1996-1998 by the Board of Trustees#    of Leland Stanford Junior University.# # This file is part of the SimOS distribution. # See LICENSE file for terms of the license. ####### This file is responsible for raising OS level annotations and tracking### the current process.############## init this module####FileSourced osf/os.tclsource syscalls.tclsource osfpal.tclannotation type osEvent enum {    startUser   endUser    startKernel endKernel    startPal    endPal    startIdle   endIdle    startSync   endSync    switchIn    switchOut    procstart   procexit   procexec  procwait}# must agree with cpus-alpha/alpha-shared/ev5.cannotation type exc enum {    reset mchk arith interrupt ndtb_miss pdtb_miss unalign dtb_fault itb_miss itb_acv opdec fen pal}proc inUserMode {} {    global IPR    set IPR_PS 0x10f    set PS $IPR(0x10f)    return [expr ($PS & 24) != 0]}######## the annotations ######## process and idle tracking##annotation set simos enter {    set palCodeCount($CPU) 0    set PCBB($CPU) $IPR(0x157)    if {$PCBB($CPU)==0} {	### only if booting	### hack to make it unique across processors	###	set PCBB($CPU) [expr -1 * $CPU]    }    console "OS.TCl: entering for cpu $CPU. pc=$pc \n"    set PID($CPU) $PCBB($CPU)    if [catch {currentProcess}] {        # booting        set PROCESS($CPU) "boot"        set OSPID($CPU) boot$CPU            } elseif {(([hex $pc] >= [symbol read vmunix::idle_thread:START])               && ([hex $pc] <= ([symbol read vmunix::idle_thread:END] + 4)))              || ((![catch {symbol read vmunix::checkRunq:START}]) &&                   ([hex $pc] >= [symbol read vmunix::checkRunq:START])                  && ([hex $pc] <= ([symbol read vmunix::checkRunq:END] + 4)))} {        # idle        set PROCESS($CPU) "idle"        set OSPID($CPU) idle$CPU            } else {        set PROCESS($CPU) "someprocess"        set OSPID($CPU) "someprocess$CPU"    }    console "OS.TCL entering for cpu=$CPU with pid=$OSPID($CPU) pcbb=$PCBB($CPU) process=$PROCESS($CPU) \n"}proc newproc { pid process comment } {    global CPU PROCESS PID PCBB OSPID    if {($PCBB($CPU) != $PID($CPU))} {         annotation exec osEvent switchOut        set PROCESS($CPU) $process        set OSPID($CPU) $pid        set PID($CPU) $PCBB($CPU)        #console "XXX newproc $comment $pid $process \n"        annotation exec osEvent switchIn	if {$PROCESS($CPU) == "kernel idle"} {	    annotation exec osEvent startIdle	}    } else {        console "newproc. Switching to the same (pid,process)=($OSPID($CPU),$PROCESS($CPU)) and same PCBB comment=$comment \n"                   }}proc currentProcess {} {    global sp    global MEMORY PROCESS PID  UU_COMM  UTASK_OFFSET UPROC_OFFSET a0 CPU CYCLES    set stack_layout [hex [expr $sp & ~0x3fff]]    set task  [symbol read "vmunix::((struct stack_layout *)$stack_layout)->uthread.utask"]    set newPROCESS [symbol read "vmunix::((struct utask *)$task)->uu_comm"]    return $newPROCESS}proc currentPID {} {    global sp    global MEMORY PROCESS PID  UU_COMM  UTASK_OFFSET UPROC_OFFSET a0 CPU CYCLES    set stack_layout [hex [expr $sp & ~0x3fff]]    set pproc [symbol read "vmunix::((struct stack_layout *)$stack_layout)->uthread.proc"]     set newPID [symbol read "vmunix::((struct proc *)$pproc)->p_pid"]     return $newPID}proc currentPPID {} {    global sp    global MEMORY PROCESS PID  UU_COMM  UTASK_OFFSET UPROC_OFFSET a0 CPU CYCLES    set stack_layout [hex [expr $sp & ~0x3fff]]    set pproc [symbol read "vmunix::((struct stack_layout *)$stack_layout)->uthread.proc"]     set ppid [symbol read "vmunix::((struct proc *)$pproc)->p_ppid"]     return $ppid}proc ContextSwitch { ptr} {        global MEMORY PROCESS PID  UU_COMM  UTASK_OFFSET UPROC_OFFSET a0 CPU CYCLES       set stack_layout [hex $ptr]     ##    ## find base of get_sp()->uthread    ##     set task  [symbol read "vmunix::((struct stack_layout *)$stack_layout)->uthread.utask"]    set pproc [symbol read "vmunix::((struct stack_layout *)$stack_layout)->uthread.proc"]         set newPROCESS [symbol read "vmunix::((struct utask *)$task)->uu_comm"]    set newPID [symbol read "vmunix::((struct proc *)$pproc)->p_pid"]     if {($newPROCESS != $PROCESS($CPU)) || ($newPID != $OSPID($CPU))} { 	newproc  $newPID $newPROCESS ContextSwitch    }}##########################################################  Annotations ######################################################### PALENTRY(0x6c01) == callpal_swpctxannotation set pc 0x6c01 {    #console "CALL_PAL swpctxt $a0 \n"    set PCBB($CPU) $a0}    annotation set pc vmunix::idle_thread:START {    #newproc  idle$CPU "idle" idle_thread_START    set OSPID($CPU) idle$CPU    set PROCESS($CPU) idle    annotation exec osEvent startIdle}annotation set pc vmunix::idle_thread:END {    if {$PROCESS($CPU) != "idle"} {        # this can happen when we take an interrupt on idle end        console "OS.TCL: ignoring end idle when process != idle $CYCLES\n"    } else {        annotation exec osEvent endIdle        newproc  runq$CPU "runq" idle_threadEND    }}annotation set pc vmunix::swtch:START {    newproc  runq$CPU "runq" swtchSTART}annotation set pc vmunix::swtch:END {    newproc  [currentPID] [currentProcess] swtchEND}annotation set pc vmunix::swtch_pri:START {    newproc  runq$CPU "runq" swtch_pri_START}annotation set pc vmunix::swtch_pri:END {    newproc  [currentPID] [currentProcess] swtch_pri_END}######## This is the key annotation. Ocurs just after the callpal swpctx####annotation  set pc vmunix::thread_continue {    newproc [currentPID] [currentProcess] thread_continue}#annotation set pc vmunix::thread_ex_end {    # console "Reached thread_ex_end \n"   # newproc [currentPID] [currentProcess] thread_ex_end#}console "@@@ adding annotation to vmunix::newproc:END\n"annotation set pc vmunix::newproc:END {    global a1 sp v0    global MEMORY PROCESS PID  UU_COMM  UTASK_OFFSET UPROC_OFFSET a0 CPU CYCLES CHILD_PID    if {$v0 != 0} {	set th $v0	set ptask [symbol read "vmunix::((struct thread *)$th)->task"]	set newPID [symbol read "vmunix::((struct super_task *)$ptask)->proc.p_pid"]	# child process of the fork	log "newproc in os.tcl: current PID is $OSPID($CPU), new pid is $newPID\n"	set CHILD_OSPID($CPU) $newPID	annotation exec osEvent procstart	# does not cause a process switch    }}annotation set pc vmunix::waitf:END {    ## process join    global CHILD_PID CPU a3 v0    set CHILD_OSPID($CPU) 0    if {$v0 == 0} {	catch {set CHILD_OSPID($CPU) [Double $a3]} err    }    annotation exec osEvent procwait}annotation set pc vmunix::common_exec:END {    annotation exec osEvent switchOut    set PROCESS($CPU) [currentProcess]    annotation exec osEvent procexec    annotation exec osEvent switchIn}annotation set pc vmunix::exit:START {    global a0 a1 sp v0 ra    global MEMORY PROCESS PID  UU_COMM  UTASK_OFFSET UPROC_OFFSET a0 CPU CYCLES    set pproc $a0    set pid [symbol read "vmunix::((struct proc *)$pproc)->p_pid"]#    console "exit:START: current PID is $OSPID($CPU), exiting pid is $pid (ra=$ra)\n"    set sym [symbol find vmunix $ra]#    console "\t ra is in $sym\n"#    annotation exec osEvent procexit}if {$detailLevel >= 2} {    ##    ## kernel - user transitions    ##    set MAX_CPUS 256    for {set i 0} {$i < $MAX_CPUS} {incr i} {        set utlb($i) 0    }        annotation set utlb {        set utlb($CPU) 1	    # should be looking at $IPR(EXC_ADDR)?	console "UTLB: os.tcl\n"        exit# 	if {![inUserMode]} {#             annotation exec osEvent endUser#         }#         annotation exec osEvent startKernel    }        ###    ### 0x70c1 callsys   0x4101 interrupt  0x4381 DTB_FAULT  0x4481 ITB_ACV    ### 0x6f41 retsys    0x6fc1 rti    ### 0x6241 cserve a2==9 --> jToPal    annotation set exc {        set currentPalEntry($CPU) $PALENTRY($pc)        incr palCodeCount($CPU)        #log "PALCODE $CYCLES $CPU $palCodeCount($CPU) entry excAddr=$IPR(0x10b) entry $PALENTRY($pc)\n"        if {($pc==0x70c1) || ($pc==0x4101) || ($pc==0x4381) ||($pc==0x4081)} {             annotation exec osEvent startKernel        }        if {($pc==0x6f41) || ($pc==0x6fc1)} {             #console "OS.TCL $CYCLES RTI/RETSYS pc=$pc exc=$IPR(0x10b) \n"            annotation exec osEvent endKernel        }        if {($pc==0x6241) && $a2==0x9} {            console "OS.TCL:: cServe jToPal. Pusing extra startPal state\n"            annotation exec osEvent startPal        }       	annotation exec osEvent startPal            }    if {0} {         global IPR        	set exc_addr $IPR(0x10b)        console "OS.TCL:: EXC  $exc_addr $pc $PALENTRY($pc) \n"	if {$exc_addr & 1 } {            incr palCodeCount($CPU) -1            #log "PALCODE $CYCLES $CPU $palCodeCount($CPU) exit\n"	    annotation exec osEvent endPal	} elseif [inUserMode] {	    annotation exec osEvent endUser        } else {	    annotation exec osEvent endKernel	}	annotation exec osEvent startPal        set utlb($CPU) 0    }            annotation set inst rfe {        incr palCodeCount($CPU) -1        #log "PALCODE $CYCLES

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -