[Back to TIMING SWAG index] [Back to Main SWAG index] [Original]

    {
    CEES BINKHORST

    >  Has anyone ever succeeded in setting the timer rate at a higher frequency
    > than 21KHz in protected mode? I've tried every possible thing, and it
    Could you give details on that 21KHz? Sounds rather a high rate.

    > don't know whether I have enough IOPL as to make CLI and STI to work, but
    Try the following:
    }

    {dr. dobb's 80286/386 #185}
    Function SensitiveOK : Boolean; Assembler; {sensitive instructions are: }
                                        {IN    read a port           }
                                        {OUT   Write to a port       }
                                        {INS   read a String from a port}
                                        {OUTS  Write a String to a port}
                                        {CLI   disable interrupts    }
                                        {STI   enable interrupts     }
    Asm
      push  ax
      push  bx
      pushf                             {put flags 'I/O privilege level' (IOPL)}
      pop   ax                          { into ax }
      and   ax, 3000h                   {00110000 00000000 - mask all but iopl}
                                        {ax = 00??0000 00000000 now}
      shr   ax, 12                      {ax -> 00000000 000000??}
                                        {compile With 286 instructions enabled!!}
      mov   iopl, al
      mov   bx, cs                      {current privilege level (cpl) is in cs}
      and   bx, 3                       {00000000 00000011 - mask all but cpl}
      mov   cpl, bl
      cmp   bx, ax                      {compare cpl and iopl}
      ja    @not_sensitive              {jump  if cpl > iopl}
      clc
      mov   @result, True               {sensitive instructions ok}
      jmp   @exit
     @not_sensitive:
      stc
      mov   @result, False              {sensitive instructions not ok}
     @exit:
      pop   bx
      pop   ax
    end;

    Function PrivilegeOK: Boolean; Assembler; {privileged instructions are:}
                                        {HLT   halt the processor    }
                                        {LGDT  load the GDT register }
                                        {LIDT  load the interrupt-descriptor-}
                                        {      table register        }
                                        {LLDT  load the LDT register  }
                                        {CLTS  clear the task-switched flag}
                                        {LMSW  load the MSW          }
                                        {LTR   load the task register}
    Asm
      push  ax
      mov   ax, cs                    {cpl resides in cs}
      and   ax, 3                     {00000000 00000011 - mask all but cpl}
                                      {ax = 00000000 000000?? now}
      jnz   @lbl1
      mov   @result, True             {privileged}
      jmp   @exit
     @lbl1:
      mov   @result, False            {not privileged}
     @exit:
      pop   ax
    end;

[Back to TIMING SWAG index] [Back to Main SWAG index] [Original]