Return to BSD News archive
Received: by minnie.vk1xwt.ampr.org with NNTP id AA108 ; Thu, 28 Jan 93 17:00:29 EST Path: sserve!manuel.anu.edu.au!munnari.oz.au!spool.mu.edu!darwin.sura.net!newsserver.jvnc.net!gmd.de!Germany.EU.net!mcsun!sunic!chalmers.se!cs.chalmers.se!augustss From: augustss@cs.chalmers.se (Lennart Augustsson) Newsgroups: comp.unix.bsd Subject: Big kernel speedup Message-ID: <1993Jan27.153106.2174@cs.chalmers.se> Date: 27 Jan 93 15:31:06 GMT Sender: news@cs.chalmers.se (News administrator) Organization: Dept. of CS, Chalmers, Sweden Lines: 1285 Here are some patches that on my system (a noname 33Mhz 486) just about *halves* the system time (at least for recompiling the kernel). It also enables profiling of the assembly language routines in locore.s and icu.s. The patch does a few things: - if you put the NONOP option in your system configuration file the NOP and NOP1 macros will be empty. These two macros are used to introduce delays for certain operations. On my machine these delays are not necessary. I suggest that you try with the NONOP option, but be careful. Bad I/O timing can wreak havoc. The best is to try this from a floppy first. If you can use the NONOP option this is a big save. - The old spl routines manipulated the ICU as soon as they were called. The new ones check if what they are about to write to the ICU is the same as the old interrupt mask (quite common) and skips the out instruction if it is. This saves a bit since I/O can be very slow. - Unrelated to performance, but important for profiling the kernel, most assembly routines now call mcount if the system is compiled with profiling. There are some new spl routines that do not call mcount (called nmsplXXX); they are needed in the profiling code itself. I've been running with these fixes installed for several months now without any problems. The patch should be applied to a system where the patches in patchkit version 0.2 have already been applied. Good luck -- Lennart Augustsson *** ./kern/subr_mcount.c.pre Mon Jan 25 23:31:58 1993 --- ./kern/subr_mcount.c Mon Jan 25 23:32:23 1993 *************** *** 185,191 **** asm("movw sr,%0" : "=g" (s)); asm("movw #0x2700,sr"); #else ! s = splhigh(); #endif /* * Check that frompcindex is a reasonable pc value. --- 185,191 ---- asm("movw sr,%0" : "=g" (s)); asm("movw #0x2700,sr"); #else ! s = nmsplhigh(); #endif /* * Check that frompcindex is a reasonable pc value. *************** *** 267,273 **** #if defined(hp300) asm("movw %0,sr" : : "g" (s)); #else ! splx(s); #endif /* and fall through */ out: --- 267,273 ---- #if defined(hp300) asm("movw %0,sr" : : "g" (s)); #else ! nmsplx(s); #endif /* and fall through */ out: *** ./i386/i386/locore.s.pre Sun Jan 24 22:58:29 1993 --- ./i386/i386/locore.s Wed Jan 27 02:13:42 1993 *************** *** 60,65 **** --- 60,77 ---- #include "machine/trap.h" + #ifdef GPROF + #define CENTRY(x) .globl _/**/x; \ + .data; 1:; .long 0; .text; .align 2; _/**/x: \ + movl $1b,%eax; call mcount + #define CENTRY2(x,y) .globl _/**/x; .globl _/**/y; \ + .data; 1:; .long 0; .text; .align 2; _/**/x: ; _/**/y: \ + movl $1b,%eax; call mcount + #else /* GPROF */ + #define CENTRY(x) .globl _/**/x; .text; .align 2; _/**/x: + #define CENTRY2(x,y) .globl _/**/x; .globl _/**/y; .text; .align 2; _/**/x: ; _/**/y: + #endif /* GPROF */ + /* * Note: This version greatly munged to avoid various assembler errors * that may be fixed in newer versions of gas. Perhaps newer versions *************** *** 71,77 **** --- 83,97 ---- /*note: gas copys sign bit (e.g. arithmetic >>), can't do SYSTEM>>22! */ .set SYSPDROFF,0x3F8 # Page dir index of System Base + /* Some machines do not require nops. A big speedup! */ + #if defined(NONOP) + #define NOP ; + #define NOP1 ; + #else #define NOP inb $0x84, %al ; inb $0x84, %al + #define NOP1 inb $0x84,%al + #endif + #define ALIGN32 .align 2 /* 2^2 = 4 */ /* *************** *** 105,114 **** --- 125,136 ---- .set PPDROFF,0x3F6 .set PPTEOFF,0x400-UPAGES # 0x3FE + #if 0 #define ENTRY(name) \ .globl _/**/name; _/**/name: #define ALTENTRY(name) \ .globl _/**/name; _/**/name: + #endif /* * Initialization *************** *** 401,409 **** /* * I/O bus instructions via C */ ! .globl _inb ! ALIGN32 ! _inb: movl 4(%esp),%edx subl %eax,%eax # clr eax NOP inb %dx,%al --- 423,430 ---- /* * I/O bus instructions via C */ ! CENTRY(inb) ! movl 4(%esp),%edx subl %eax,%eax # clr eax NOP inb %dx,%al *************** *** 410,418 **** ret ! .globl _inw ! ALIGN32 ! _inw: movl 4(%esp),%edx subl %eax,%eax # clr eax NOP inw %dx,%ax --- 431,438 ---- ret ! CENTRY(inw) ! movl 4(%esp),%edx subl %eax,%eax # clr eax NOP inw %dx,%ax *************** *** 419,435 **** ret ! .globl _rtcin ! ALIGN32 ! _rtcin: movl 4(%esp),%eax outb %al,$0x70 subl %eax,%eax # clr eax inb $0x71,%al # Compaq SystemPro ret ! .globl _outb ! ALIGN32 ! _outb: movl 4(%esp),%edx NOP movl 8(%esp),%eax outb %al,%dx --- 439,453 ---- ret ! CENTRY(rtcin) ! movl 4(%esp),%eax outb %al,$0x70 subl %eax,%eax # clr eax inb $0x71,%al # Compaq SystemPro ret ! CENTRY(outb) ! movl 4(%esp),%edx NOP movl 8(%esp),%eax outb %al,%dx *************** *** 436,444 **** NOP ret ! .globl _outw ! ALIGN32 ! _outw: movl 4(%esp),%edx NOP movl 8(%esp),%eax outw %ax,%dx --- 454,461 ---- NOP ret ! CENTRY(outw) ! movl 4(%esp),%edx NOP movl 8(%esp),%eax outw %ax,%dx *************** *** 449,457 **** * void bzero(void *base, u_int cnt) */ ! .globl _bzero ! ALIGN32 ! _bzero: pushl %edi movl 8(%esp),%edi movl 12(%esp),%ecx --- 466,472 ---- * void bzero(void *base, u_int cnt) */ ! CENTRY(bzero) pushl %edi movl 8(%esp),%edi movl 12(%esp),%ecx *************** *** 471,479 **** * fillw (pat,base,cnt) */ ! .globl _fillw ! ALIGN32 ! _fillw: pushl %edi movl 8(%esp),%eax movl 12(%esp),%edi --- 486,492 ---- * fillw (pat,base,cnt) */ ! CENTRY(fillw) pushl %edi movl 8(%esp),%eax movl 12(%esp),%edi *************** *** 484,492 **** popl %edi ret ! .globl _bcopyb ! ALIGN32 ! _bcopyb: pushl %esi pushl %edi movl 12(%esp),%esi --- 497,503 ---- popl %edi ret ! CENTRY(bcopyb) pushl %esi pushl %edi movl 12(%esp),%esi *************** *** 505,514 **** * ws@tools.de (Wolfgang Solfrank, TooLs GmbH) +49-228-985800 */ ! .globl _bcopy,_ovbcopy ! ALIGN32 ! _ovbcopy: ! _bcopy: pushl %esi pushl %edi movl 12(%esp),%esi --- 516,523 ---- * ws@tools.de (Wolfgang Solfrank, TooLs GmbH) +49-228-985800 */ ! ! CENTRY2(ovbcopy,bcopy) pushl %esi pushl %edi movl 12(%esp),%esi *************** *** 551,559 **** ret #ifdef notdef ! .globl _copyout ! ALIGN32 ! _copyout: movl _curpcb, %eax movl $cpyflt, PCB_ONFAULT(%eax) # in case we page/protection violate pushl %esi --- 560,566 ---- ret #ifdef notdef ! CENTRY(copyout) movl _curpcb, %eax movl $cpyflt, PCB_ONFAULT(%eax) # in case we page/protection violate pushl %esi *************** *** 655,663 **** movl $ EFAULT,%eax ret #else ! .globl _copyout ! ALIGN32 ! _copyout: movl _curpcb,%eax movl $cpyflt,PCB_ONFAULT(%eax) # in case we page/protection violate pushl %esi --- 662,668 ---- movl $ EFAULT,%eax ret #else ! CENTRY(copyout) movl _curpcb,%eax movl $cpyflt,PCB_ONFAULT(%eax) # in case we page/protection violate pushl %esi *************** *** 680,688 **** movl %eax,PCB_ONFAULT(%edx) ret ! .globl _copyin ! ALIGN32 ! _copyin: movl _curpcb,%eax movl $cpyflt,PCB_ONFAULT(%eax) # in case we page/protection violate pushl %esi --- 685,691 ---- movl %eax,PCB_ONFAULT(%edx) ret ! CENTRY(copyin) movl _curpcb,%eax movl $cpyflt,PCB_ONFAULT(%eax) # in case we page/protection violate pushl %esi *************** *** 716,724 **** #endif # insb(port,addr,cnt) ! .globl _insb ! ALIGN32 ! _insb: pushl %edi movw 8(%esp),%dx movl 12(%esp),%edi --- 719,725 ---- #endif # insb(port,addr,cnt) ! CENTRY(insb) pushl %edi movw 8(%esp),%dx movl 12(%esp),%edi *************** *** 733,741 **** ret # insw(port,addr,cnt) ! .globl _insw ! ALIGN32 ! _insw: pushl %edi movw 8(%esp),%dx movl 12(%esp),%edi --- 734,740 ---- ret # insw(port,addr,cnt) ! CENTRY(insw) pushl %edi movw 8(%esp),%dx movl 12(%esp),%edi *************** *** 749,757 **** ret # outsw(port,addr,cnt) ! .globl _outsw ! ALIGN32 ! _outsw: pushl %esi movw 8(%esp),%dx movl 12(%esp),%esi --- 748,754 ---- ret # outsw(port,addr,cnt) ! CENTRY(outsw) pushl %esi movw 8(%esp),%dx movl 12(%esp),%esi *************** *** 765,773 **** ret # outsb(port,addr,cnt) ! .globl _outsb ! ALIGN32 ! _outsb: pushl %esi movw 8(%esp),%dx movl 12(%esp),%esi --- 762,768 ---- ret # outsb(port,addr,cnt) ! CENTRY(outsb) pushl %esi movw 8(%esp),%dx movl 12(%esp),%esi *************** *** 784,792 **** /* * void lgdt(struct region_descriptor *rdp); */ ! .globl _lgdt ! ALIGN32 ! _lgdt: /* reload the descriptor table */ movl 4(%esp),%eax lgdt (%eax) --- 779,785 ---- /* * void lgdt(struct region_descriptor *rdp); */ ! CENTRY(lgdt) /* reload the descriptor table */ movl 4(%esp),%eax lgdt (%eax) *************** *** 811,819 **** /* * void lidt(struct region_descriptor *rdp); */ ! .globl _lidt ! ALIGN32 ! _lidt: movl 4(%esp),%eax lidt (%eax) ret --- 804,810 ---- /* * void lidt(struct region_descriptor *rdp); */ ! CENTRY(lidt) movl 4(%esp),%eax lidt (%eax) ret *************** *** 821,829 **** /* * void lldt(u_short sel) */ ! .globl _lldt ! ALIGN32 ! _lldt: lldt 4(%esp) ret --- 812,818 ---- /* * void lldt(u_short sel) */ ! CENTRY(lldt) lldt 4(%esp) ret *************** *** 830,838 **** /* * void ltr(u_short sel) */ ! .globl _ltr ! ALIGN32 ! _ltr: ltr 4(%esp) ret --- 819,825 ---- /* * void ltr(u_short sel) */ ! CENTRY(ltr) ltr 4(%esp) ret *************** *** 839,872 **** /* * void lcr3(caddr_t cr3) */ ! .globl _lcr3 ! .globl _load_cr3 ! ALIGN32 ! _load_cr3: ! _lcr3: ! inb $0x84,%al # check wristwatch movl 4(%esp),%eax orl $ I386_CR3PAT,%eax movl %eax,%cr3 ! inb $0x84,%al # check wristwatch ret # tlbflush() ! .globl _tlbflush ! ALIGN32 ! _tlbflush: ! inb $0x84,%al # check wristwatch movl %cr3,%eax orl $ I386_CR3PAT,%eax movl %eax,%cr3 ! inb $0x84,%al # check wristwatch ret # lcr0(cr0) ! .globl _lcr0,_load_cr0 ! ALIGN32 ! _lcr0: ! _load_cr0: movl 4(%esp),%eax movl %eax,%cr0 ret --- 826,850 ---- /* * void lcr3(caddr_t cr3) */ ! CENTRY2(lcr3,load_cr3) ! NOP1 movl 4(%esp),%eax orl $ I386_CR3PAT,%eax movl %eax,%cr3 ! NOP1 ret # tlbflush() ! CENTRY(tlbflush) ! NOP1 movl %cr3,%eax orl $ I386_CR3PAT,%eax movl %eax,%cr3 ! NOP1 ret # lcr0(cr0) ! CENTRY2(lcr0,load_cr0) movl 4(%esp),%eax movl %eax,%cr0 ret *************** *** 895,903 **** ret # ssdtosd(*ssdp,*sdp) ! .globl _ssdtosd ! ALIGN32 ! _ssdtosd: pushl %ebx movl 8(%esp),%ecx movl 8(%ecx),%ebx --- 873,879 ---- ret # ssdtosd(*ssdp,*sdp) ! CENTRY(ssdtosd) pushl %ebx movl 8(%esp),%ecx movl 8(%ecx),%ebx *************** *** 920,928 **** /* * {fu,su},{byte,word} */ ! ALIGN32 ! ALTENTRY(fuiword) ! ENTRY(fuword) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) movl 4(%esp),%edx --- 896,902 ---- /* * {fu,su},{byte,word} */ ! CENTRY2(fuword,fuiword) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) movl 4(%esp),%edx *************** *** 931,938 **** movl $0,PCB_ONFAULT(%ecx) ret ! ALIGN32 ! ENTRY(fusword) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) #in case we page/protection violate movl 4(%esp),%edx --- 905,911 ---- movl $0,PCB_ONFAULT(%ecx) ret ! CENTRY(fusword) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) #in case we page/protection violate movl 4(%esp),%edx *************** *** 941,949 **** movl $0,PCB_ONFAULT(%ecx) ret ! ALIGN32 ! ALTENTRY(fuibyte) ! ENTRY(fubyte) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) #in case we page/protection violate movl 4(%esp),%edx --- 914,920 ---- movl $0,PCB_ONFAULT(%ecx) ret ! CENTRY2(fubyte,fuibyte) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) #in case we page/protection violate movl 4(%esp),%edx *************** *** 960,968 **** decl %eax ret ! ALIGN32 ! ALTENTRY(suiword) ! ENTRY(suword) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) #in case we page/protection violate movl 4(%esp),%edx --- 931,937 ---- decl %eax ret ! CENTRY2(suword,suiword) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) #in case we page/protection violate movl 4(%esp),%edx *************** *** 992,999 **** movl %eax,PCB_ONFAULT(%ecx) #in case we page/protection violate ret ! ALIGN32 ! ENTRY(susword) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) #in case we page/protection violate movl 4(%esp),%edx --- 961,967 ---- movl %eax,PCB_ONFAULT(%ecx) #in case we page/protection violate ret ! CENTRY(susword) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) #in case we page/protection violate movl 4(%esp),%edx *************** *** 1021,1029 **** movl %eax,PCB_ONFAULT(%ecx) #in case we page/protection violate ret ! ALIGN32 ! ALTENTRY(suibyte) ! ENTRY(subyte) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) #in case we page/protection violate movl 4(%esp),%edx --- 989,995 ---- movl %eax,PCB_ONFAULT(%ecx) #in case we page/protection violate ret ! CENTRY2(subyte,suibyte) movl _curpcb,%ecx movl $fusufault,PCB_ONFAULT(%ecx) #in case we page/protection violate movl 4(%esp),%edx *************** *** 1051,1058 **** movl %eax,PCB_ONFAULT(%ecx) #in case we page/protection violate ret ! ALIGN32 ! ENTRY(setjmp) movl 4(%esp),%eax movl %ebx, 0(%eax) # save ebx movl %esp, 4(%eax) # save esp --- 1017,1023 ---- movl %eax,PCB_ONFAULT(%ecx) #in case we page/protection violate ret ! CENTRY(setjmp) movl 4(%esp),%eax movl %ebx, 0(%eax) # save ebx movl %esp, 4(%eax) # save esp *************** *** 1064,1071 **** xorl %eax,%eax # return (0); ret ! ALIGN32 ! ENTRY(longjmp) movl 4(%esp),%eax movl 0(%eax),%ebx # restore ebx movl 4(%eax),%esp # restore esp --- 1029,1035 ---- xorl %eax,%eax # return (0); ret ! CENTRY(longjmp) movl 4(%esp),%eax movl 0(%eax),%ebx # restore ebx movl 4(%eax),%esp # restore esp *************** *** 1096,1103 **** * * Call should be made at spl6(), and p->p_stat should be SRUN */ ! ALIGN32 ! ENTRY(setrq) movl 4(%esp),%eax cmpl $0,P_RLINK(%eax) # should not be on q already je set1 --- 1060,1066 ---- * * Call should be made at spl6(), and p->p_stat should be SRUN */ ! CENTRY(setrq) movl 4(%esp),%eax cmpl $0,P_RLINK(%eax) # should not be on q already je set1 *************** *** 1123,1130 **** * * Call should be made at spl6(). */ ! ALIGN32 ! ENTRY(remrq) movl 4(%esp),%eax movzbl P_PRI(%eax),%edx shrl $2,%edx --- 1086,1092 ---- * * Call should be made at spl6(). */ ! CENTRY(remrq) movl 4(%esp),%eax movzbl P_PRI(%eax),%edx shrl $2,%edx *************** *** 1163,1169 **** ALIGN32 Idle: idle: ! call _spl0 cmpl $0,_whichqs jne sw1 hlt # wait for interrupt --- 1125,1131 ---- ALIGN32 Idle: idle: ! call _nmspl0 cmpl $0,_whichqs jne sw1 hlt # wait for interrupt *************** *** 1178,1185 **** /* * Swtch() */ ! ALIGN32 ! ENTRY(swtch) incl _cnt+V_SWTCH --- 1140,1146 ---- /* * Swtch() */ ! CENTRY(swtch) incl _cnt+V_SWTCH *************** *** 1303,1316 **** movl %edx,_curpcb /* pushl PCB_IML(%edx) ! call _splx popl %eax*/ movl %edx,%eax # return (1); ret - .globl _mvesp ALIGN32 _mvesp: movl %esp,%eax ret /* --- 1264,1277 ---- movl %edx,_curpcb /* pushl PCB_IML(%edx) ! call _nmsplx popl %eax*/ movl %edx,%eax # return (1); ret ALIGN32 + .globl _mvesp _mvesp: movl %esp,%eax ret /* *************** *** 1322,1329 **** * Since this code requires a parameter from the "old" stack, * pass it back as a return value. */ ! ALIGN32 ! ENTRY(swtch_to_inactive) popl %edx # old pc popl %eax # arg, our return value movl _IdlePTD,%ecx --- 1283,1289 ---- * Since this code requires a parameter from the "old" stack, * pass it back as a return value. */ ! CENTRY(swtch_to_inactive) popl %edx # old pc popl %eax # arg, our return value movl _IdlePTD,%ecx *************** *** 1337,1344 **** * Update pcb, saving current processor state and arranging * for alternate return ala longjmp in swtch if altreturn is true. */ ! ALIGN32 ! ENTRY(savectx) movl 4(%esp), %ecx movw _cpl, %ax movw %ax, PCB_IML(%ecx) --- 1297,1303 ---- * Update pcb, saving current processor state and arranging * for alternate return ala longjmp in swtch if altreturn is true. */ ! CENTRY(savectx) movl 4(%esp), %ecx movw _cpl, %ax movw %ax, PCB_IML(%ecx) *************** *** 1388,1395 **** * update profiling information for the user process. */ ! ALIGN32 ! ENTRY(addupc) pushl %ebp movl %esp,%ebp movl 12(%ebp),%edx /* up */ --- 1347,1353 ---- * update profiling information for the user process. */ ! CENTRY(addupc) pushl %ebp movl %esp,%ebp movl 12(%ebp),%edx /* up */ *************** *** 1541,1547 **** calltrap: incl _cnt+V_TRAP call _trap ! call _spl0 pop %es pop %ds popal --- 1499,1505 ---- calltrap: incl _cnt+V_TRAP call _trap ! call _nmspl0 pop %es pop %ds popal *************** *** 1585,1591 **** movw %ax,%ds movw %ax,%es call _syscall ! call _spl0 movw __udatasel,%ax # switch back to user segments movw %ax,%ds movw %ax,%es --- 1543,1549 ---- movw %ax,%ds movw %ax,%es call _syscall ! call _nmspl0 movw __udatasel,%ax # switch back to user segments movw %ax,%ds movw %ax,%es *************** *** 1594,1602 **** popfl lret ! ALIGN32 ! ENTRY(htonl) ! ENTRY(ntohl) movl 4(%esp),%eax xchgb %al,%ah roll $16,%eax --- 1552,1558 ---- popfl lret ! CENTRY2(ntohl,htonl) movl 4(%esp),%eax xchgb %al,%ah roll $16,%eax *************** *** 1603,1611 **** xchgb %al,%ah ret ! ALIGN32 ! ENTRY(htons) ! ENTRY(ntohs) movzwl 4(%esp),%eax xchgb %al,%ah ret --- 1559,1565 ---- xchgb %al,%ah ret ! CENTRY2(ntohs,htons) movzwl 4(%esp),%eax xchgb %al,%ah ret *** ./i386/isa/icu.s.pre Sun Jan 24 22:58:30 1993 --- ./i386/isa/icu.s Wed Jan 27 02:14:37 1993 *************** *** 123,129 **** call c ; \ 1: ! call _splnet DONET(NETISR_RAW,_rawintr) #ifdef INET --- 123,129 ---- call c ; \ 1: ! call _nmsplnet DONET(NETISR_RAW,_rawintr) #ifdef INET *************** *** 147,163 **** outb %al,$ IO_ICU2+1 NOP #else ! call _spl0 #endif btrl $ NETISR_SCLK,_netisr jnb 1f # back to an interrupt frame for a moment ! call _splsoftclock pushl $0xff # dummy intr call _softclock popl %eax ! call _spl0 # jmp 2f --- 147,163 ---- outb %al,$ IO_ICU2+1 NOP #else ! call _nmspl0 #endif btrl $ NETISR_SCLK,_netisr jnb 1f # back to an interrupt frame for a moment ! call _nmsplsoftclock pushl $0xff # dummy intr call _softclock popl %eax ! call _nmspl0 # jmp 2f *************** *** 177,296 **** /* * Interrupt priority mechanism * - * Two flavors -- imlXX masks relative to ISA noemenclature (for PC compat sw) * -- splXX masks with group mechanism for BSD purposes */ ! .globl _splhigh ! .globl _splclock ! ALIGN32 ! _splhigh: ! _splclock: ! cli # disable interrupts ! NOP ! movw $0xffff,%ax # set new priority level ! movw %ax,%dx ! # orw _imen,%ax # mask off those not enabled yet ! movw %ax,%cx ! outb %al,$ IO_ICU1+1 /* update icu's */ ! NOP ! movb %ah,%al ! outb %al,$ IO_ICU2+1 ! NOP ! movzwl _cpl,%eax # return old priority ! movw %dx,_cpl # set new priority level ! sti # enable interrupts ! ret ! ! .globl _spltty # block clists ! ALIGN32 ! _spltty: ! cli # disable interrupts ! NOP ! movw _cpl,%ax ! orw _ttymask,%ax ! movw %ax,%dx ! orw _imen,%ax # mask off those not enabled yet ! movw %ax,%cx ! outb %al,$ IO_ICU1+1 /* update icu's */ ! NOP ! movb %ah,%al ! outb %al,$ IO_ICU2+1 ! NOP ! movzwl _cpl,%eax # return old priority ! movw %dx,_cpl # set new priority level ! sti # enable interrupts ! ret ! .globl _splimp ! .globl _splnet ! ALIGN32 ! _splimp: ! _splnet: ! cli # disable interrupts ! NOP ! movw _cpl,%ax ! orw _netmask,%ax ! movw %ax,%dx ! orw _imen,%ax # mask off those not enabled yet ! movw %ax,%cx ! outb %al,$ IO_ICU1+1 /* update icu's */ ! NOP ! movb %ah,%al ! outb %al,$ IO_ICU2+1 ! NOP ! movzwl _cpl,%eax # return old priority ! movw %dx,_cpl # set new priority level ! sti # enable interrupts ret - .globl _splbio - ALIGN32 - _splbio: - cli # disable interrupts - NOP - movw _cpl,%ax - orw _biomask,%ax - movw %ax,%dx - orw _imen,%ax # mask off those not enabled yet - movw %ax,%cx - outb %al,$ IO_ICU1+1 /* update icu's */ - NOP - movb %ah,%al - outb %al,$ IO_ICU2+1 - NOP - movzwl _cpl,%eax # return old priority - movw %dx,_cpl # set new priority level - sti # enable interrupts - ret ! .globl _splsoftclock ! ALIGN32 ! _splsoftclock: cli # disable interrupts NOP ! movw _cpl,%ax ! orw $0x8000,%ax # set new priority level ! movw %ax,%dx ! orw _imen,%ax # mask off those not enabled yet ! movw %ax,%cx ! outb %al,$ IO_ICU1+1 /* update icu's */ ! NOP ! movb %ah,%al ! outb %al,$ IO_ICU2+1 ! NOP ! movzwl _cpl,%eax # return old priority ! movw %dx,_cpl # set new priority level ! sti # enable interrupts ! ret - .globl _splnone - .globl _spl0 - ALIGN32 - _splnone: - _spl0: - cli # disable interrupts - NOP pushl _cpl # save old priority movw _cpl,%ax orw _netmask,%ax # mask off those network devices --- 177,235 ---- /* * Interrupt priority mechanism * * -- splXX masks with group mechanism for BSD purposes */ ! #define NMENTRY(x) .globl _nm/**/x; _nm/**/x: ! #define SPL(mask) \ ! cli ; /* turn off interrupts */ \ ! NOP ; /* wait a little */ \ ! movzwl _cpl,%eax ; /* get cpl */ \ ! movl %eax,%ecx ; /* ... and save it */ \ ! orw mask,%ax ; /* compute new cpl */ \ ! cmpw %ax,%cx ; /* same as old? */ \ ! je 1f ; /* yes, skip ICU manipulation */ \ ! movw %ax,_cpl ; /* save new cpl */ \ ! orw _imen,%ax ; /* mask off disabled interrupts */ \ ! outb %al,$ IO_ICU1+1 ; /* juggle the ICU */ \ ! NOP ; \ ! movb %ah,%al ; \ ! outb %al,$ IO_ICU2+1 ; \ ! NOP ; \ ! movl %ecx,%eax ; /* use old cpl as return value */ \ ! 1: ; \ ! sti ; /* enable interrupts again */ \ ret ! CENTRY2(splhigh,splclock) ! NMENTRY(splhigh) ! NMENTRY(splclock) ! SPL($0xffff) ! ! CENTRY(spltty) # block clists ! SPL(_ttymask) ! ! CENTRY2(splimp,splnet) ! NMENTRY(splnet) ! SPL(_netmask) ! ! CENTRY(splbio) ! SPL(_biomask) ! ! CENTRY(splsoftclock) ! NMENTRY(splsoftclock) ! SPL($0x8000) ! ! CENTRY2(splnone,spl0) ! NMENTRY(spl0) ! Lspl0jmp: cli # disable interrupts NOP ! cmpl $0,_netisr ! je Lspl0 pushl _cpl # save old priority movw _cpl,%ax orw _netmask,%ax # mask off those network devices *************** *** 310,319 **** cli # disable interrupts popl _cpl # save old priority NOP ! movw $0,%ax # set new priority level ! movw %ax,%dx ! orw _imen,%ax # mask off those not enabled yet ! movw %ax,%cx outb %al,$ IO_ICU1+1 /* update icu's */ NOP movb %ah,%al --- 249,256 ---- cli # disable interrupts popl _cpl # save old priority NOP ! Lspl0: ! movw _imen,%ax # mask off those not enabled yet outb %al,$ IO_ICU1+1 /* update icu's */ NOP movb %ah,%al *************** *** 320,339 **** outb %al,$ IO_ICU2+1 NOP movzwl _cpl,%eax # return old priority ! movw %dx,_cpl # set new priority level sti # enable interrupts ret ! .globl _splx ! ALIGN32 ! _splx: cli # disable interrupts NOP movw 4(%esp),%ax # new priority level movw %ax,%dx cmpw $0,%dx ! je _spl0 # going to "zero level" is special orw _imen,%ax # mask off those not enabled yet movw %ax,%cx outb %al,$ IO_ICU1+1 /* update icu's */ --- 257,278 ---- outb %al,$ IO_ICU2+1 NOP movzwl _cpl,%eax # return old priority ! movw $0,_cpl # set new priority level sti # enable interrupts ret ! CENTRY(splx) ! NMENTRY(splx) cli # disable interrupts NOP movw 4(%esp),%ax # new priority level movw %ax,%dx cmpw $0,%dx ! je Lspl0jmp # going to "zero level" is special + cmpw %dx,_cpl # same as we have now ? + je 1f # yes, skip ICU handling + orw _imen,%ax # mask off those not enabled yet movw %ax,%cx outb %al,$ IO_ICU1+1 /* update icu's */ *************** *** 341,346 **** --- 280,286 ---- movb %ah,%al outb %al,$ IO_ICU2+1 NOP + 1: movzwl _cpl,%eax # return old priority movw %dx,_cpl # set new priority level sti # enable interrupts -- -- Lennart Augustsson [This signature is intentionally left blank.]