Annotation of coherent/d/286_KERNEL/USRSRC/io/clocked.s, revision 1.1

1.1     ! root        1: ////////
        !             2: /
        !             3: / Clocked Functions - schedule function 'f' to be periodically invoked.
        !             4: /                  - invocation is at clock interrupt level
        !             5: /                  - only one function can be clocked
        !             6: /
        !             7: /      clocked( f, hz )
        !             8: /      void (*f)();
        !             9: /      int hz;
        !            10: /
        !            11: ////////
        !            12: 
        !            13:        .globl  clocked_
        !            14: 
        !            15: ////////
        !            16: /
        !            17: / Hardware Dependant Constants
        !            18: /
        !            19: ////////
        !            20: 
        !            21:        EOI     = 0x20          / Non-specific End of Interrupt command
        !            22:        PIC     = 0x20          / 8259 pic   base address
        !            23:        PIT     = 0x40          / 8253 timer base address
        !            24: 
        !            25: ////////
        !            26: /
        !            27: / Private Data Declarations
        !            28: /
        !            29: ////////
        !            30: 
        !            31:        .bssd
        !            32: stack: .blkb   256             / Run time stack for the clocked function.
        !            33: stktop:
        !            34: 
        !            35:        .shri   / CODE SPACE!
        !            36: uss:   .word   0               / User stack segment
        !            37: usp:   .word   0               / User stack pointer
        !            38: kds:   .word   0               / Kernel data segment
        !            39: oldclk:        .word   0               / Previous clock interrupt entry point.
        !            40: reload:        .word   0               / Number of polls per logical clock tick.
        !            41: resid: .word   0               / Number of polls left in logical clock tick.
        !            42: cfunc: .word   0               / Clocked function
        !            43:        .shri
        !            44: 
        !            45: ////////
        !            46: /
        !            47: / clocked( f, hz )
        !            48: / void (*f)();
        !            49: / int hz;
        !            50: /
        !            51: /      Input:  f  = function to be clocked.
        !            52: /              hz = desired clock rate in invocations/second.
        !            53: /
        !            54: /      Action: Calculate the number of polls per logical clock tick.
        !            55: /              Seize the clock hardware interrupt.
        !            56: /              Preserve the previous clock interrupt handler.
        !            57: /              Reprogram the hardware clock to the desired rate.
        !            58: /
        !            59: /      Return:  0 = clock interrupt seized.
        !            60: /              -1 = clock interrupt previously seized.
        !            61: /
        !            62: /      Notes:  The logical clock rate to the OS will be unchanged.
        !            63: /
        !            64: ////////
        !            65: 
        !            66: clocked_:
        !            67:        pop     ax              / Convert IP into PSW,CS,IP so can use iret.
        !            68:        pushf
        !            69:        push    cs
        !            70:        push    ax
        !            71: 
        !            72:        mov     cs:kds, ds      / Remember the kernel data segment
        !            73: 
        !            74:        cli                     / Disable interrupts
        !            75: 
        !            76:        push    es              / Seize clock interrupt vector
        !            77:        sub     ax, ax
        !            78:        mov     es, ax
        !            79:        mov     ax, es:0x0020
        !            80:        cmp     ax, $clocker
        !            81:        jne     0f
        !            82:        mov     ax, $-1
        !            83:        pop     es
        !            84:        iret
        !            85: 
        !            86: 0:     mov     cs:oldclk, ax
        !            87:        mov     es:0x0020, $clocker
        !            88:        pop     es
        !            89: 
        !            90:        mov     bx, sp          / Remember the function to be clocked.
        !            91:        mov     ax, ss:6(bx)
        !            92:        mov     cs:cfunc, ax
        !            93: 
        !            94:        mov     ax, ss:8(bx)    / Compute polling rate relative to 20 hz.
        !            95:        sub     dx, dx
        !            96:        mov     cx, $20
        !            97:        div     cx
        !            98:        mov     cs:reload, ax
        !            99:        mov     cs:resid, ax
        !           100: 
        !           101:        movb    al, $0x36       / Timer 0, LSB, MSB, mode 3
        !           102:        outb    PIT+3, al
        !           103:        mov     ax, $59659
        !           104:        sub     dx, dx
        !           105:        div     cs:reload
        !           106:        outb    PIT, al         / LSB of 59659/reload
        !           107:        jmp     0f
        !           108: 0:     movb    al, ah
        !           109:        outb    PIT, al         / MSB of 59659/reload
        !           110: 
        !           111:        sub     ax, ax
        !           112:        iret
        !           113: 
        !           114: ////////
        !           115: /
        !           116: /      clocker()       - initiate clocked function.
        !           117: /
        !           118: /      Action: Every hardware clock tick, invoke the clocked function.
        !           119: /              Every 'reload' hardware clock ticks,
        !           120: /                      simulate a logical clock interrupt to the OS.
        !           121: /
        !           122: ////////
        !           123: 
        !           124: clocker:
        !           125:        push    ax              / Save registers.
        !           126:        push    bx
        !           127:        push    cx
        !           128:        push    dx
        !           129:        push    ds
        !           130:        push    es
        !           131: 
        !           132:        mov     cs:uss, ss      / Save current stack.
        !           133:        mov     cs:usp, sp
        !           134: 
        !           135:        mov     ax, cs:kds      / Remap Data/Extra/Stack Segments into Kernel.
        !           136:        mov     ds, ax
        !           137:        mov     es, ax
        !           138:        mov     ss, ax
        !           139:        mov     sp, $stktop     / Remap stack pointer onto private intr stack.
        !           140: 
        !           141:        icall   cs:cfunc        / Call the clocked function.
        !           142: 
        !           143:        mov     ss, cs:uss      / Restore previous stack.
        !           144:        mov     sp, cs:usp
        !           145:        
        !           146:        pop     es              / Restore registers.
        !           147:        pop     ds
        !           148:        pop     dx
        !           149:        pop     cx
        !           150:        pop     bx
        !           151: 
        !           152:        dec     cs:resid
        !           153:        je      0f
        !           154:        movb    al, $EOI
        !           155:        outb    PIC, al
        !           156:        pop     ax
        !           157:        iret
        !           158: 
        !           159: 0:     mov     ax, cs:reload
        !           160:        mov     cs:resid, ax
        !           161:        pop     ax
        !           162:        ijmp    cs:oldclk

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.