(2.6.0-test1 bk) ivt rearrangement and sn2-specific boot-time replacement code
PATCH 1/1 (2.6.0-test1 bk) ivt rearrangement and sn2-specific boot-time replacement code
David,
Again, no screams about the 2.4.x version of this so I thought I'd try my luck with 2.5.x.
I'd love to see this merged if flames come my way :/
kernel/ivt.S | 86 +++++++++++++++++++++----------------- sn/kernel/Makefile | 1 sn/kernel/setup.c | 73 ++++++++++++++++++++++++++++++++ sn/kernel/sn_ivt.S | 96 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 217 insertions(+), 39 deletions(-)
As best as I can tell this doesn't hurt anyone else (I have problems with your bk tree on zx1 right now so I couldn't thoroughly test but I don't expect any gothas).
Thanks,
--cw
# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas:
# ChangeSet 1.1394 -> 1.1395
# arch/ia64/sn/kernel/Makefile 1.14 -> 1.15
# arch/ia64/kernel/ivt.S 1.23 -> 1.24
# arch/ia64/sn/kernel/setup.c 1.16 -> 1.17
# (new) -> 1.1 arch/ia64/sn/kernel/sn_ivt.S
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 03/07/16 [email protected] 1.1395
# Add code so that the SN2 platform code replaces the alt-dtlb-miss handler on boot. # --------------------------------------------
#
arch/ia64/kernel/ivt.S +47 -39
@@ -162,7 +162,7 @@ ;; (p10) itc.i r18 // insert the instruction TLB entry (p11) itc.d r18 // insert the data TLB entry -(p6) br.cond.spnt.many page_fault // handle bad address/page not present (page fault) +(p6) br.cond.spnt.many ia64_ivt_page_fault // handle bad address/page not present (page fault) mov cr.ifa=r22 #ifdef CONFIG_HUGETLB_PAGE
@@ -222,7 +222,7 @@ ;; mov b0=r29 tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared? -(p6) br.cond.spnt page_fault +(p6) br.cond.spnt ia64_ivt_page_fault ;; itc.i r18 ;;
@@ -260,7 +260,7 @@ ;; mov b0=r29 tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared? -(p6) br.cond.spnt page_fault +(p6) br.cond.spnt ia64_ivt_page_fault ;; itc.d r18 ;;
@@ -307,7 +307,7 @@ or r19=r17,r19 // insert PTE control bits into r19 ;; or r19=r19,r18 // set bit 4 (uncached) if the access was to region 6 -(p8) br.cond.spnt page_fault +(p8) br.cond.spnt ia64_ivt_page_fault ;; itc.i r19 // insert the TLB entry mov pr=r31,-1
@@ -317,6 +317,7 @@ .org ia64_ivt+0x1000 ///////////////////////////////////////////////////////////////////////////////////////// // 0x1000 Entry 4 (size 64 bundles) Alt DTLB (7,46) + .global alt_dtlb_miss ENTRY(alt_dtlb_miss) DBG_FAULT(4) mov r16=cr.ifa // get address that caused the TLB miss
@@ -347,7 +348,7 @@ andcm r18=0x10,r18 // bit 4=~address-bit(61) cmp.ne p8,p0=r0,r23 (p9) cmp.eq.or.andcm p6,p7=IA64_ISR_CODE_LFETCH,r22 // check isr.code field -(p8) br.cond.spnt page_fault +(p8) br.cond.spnt ia64_ivt_page_fault dep r21=-1,r21,IA64_PSR_ED_BIT,1 or r19=r19,r17 // insert PTE control bits into r19
@@ -360,33 +361,6 @@ rfi END(alt_dtlb_miss) - //----------------------------------------------------------------------------------- - // call do_page_fault (predicates are in r31, psr.dt may be off, r16 is faulting address) -ENTRY(page_fault) - ssm psr.dt - ;; - srlz.i - ;; - SAVE_MIN_WITH_COVER - alloc r15=ar.pfs,0,0,3,0 - mov out0=cr.ifa - mov out1=cr.isr - adds r3=8,r2 // set up second base pointer - ;; - ssm psr.ic | PSR_DEFAULT_BITS - ;; - srlz.i // guarantee that interruption collectin is on - ;; -(p15) ssm psr.i // restore psr.i - movl r14=ia64_leave_kernel - ;; - SAVE_REST - mov rp=r14 - ;; - adds out2,r12 // out2 = pointer to pt_regs - br.call.sptk.many b6=ia64_do_page_fault // ignore return address -END(page_fault) - .org ia64_ivt+0x1400 ///////////////////////////////////////////////////////////////////////////////////////// // 0x1400 Entry 5 (size 64 bundles) Data nested TLB (6,45)
@@ -398,8 +372,8 @@ * table is missing, a nested TLB miss fault is triggered and control is * transferred to this point. When this happens, we lookup the pte for the * faulting address by walking the page table in physical mode and return to the - * continuation point passed in register r30 (or call page_fault if the address is - * not mapped). + * continuation point passed in register r30 (or call ia64_ivt_page_fault if the + * address is not mapped). * * Input: r16: faulting address * r29: saved b0
@@ -446,7 +420,7 @@ ;; (p7) cmp.eq.or.andcm p6,p7=r17,r0 // was L2 entry NULL? dep r17=r19,r17,3,(PAGE_SHIFT-3) // compute address of L3 page table entry -(p6) br.cond.spnt page_fault +(p6) br.cond.spnt ia64_ivt_page_fault mov b0=r30 br.sptk.many b0 // return to continuation point END(nested_dtlb_miss)
@@ -936,6 +910,40 @@ DBG_FAULT(16) FAULT(16) + /* + * Squatting in this space... There is no particular reason for this code to be + * here, other than that there happens to be space here that would go unused + * otherwise. If this fault ever gets "unreserved", simply moved the following + * code to a more suitable spot... + */ + //----------------------------------------------------------------------------------- + // call do_page_fault (predicates are in r31, psr.dt may be off, r16 is faulting address) + .global ia64_ivt_page_fault +ENTRY(ia64_ivt_page_fault) + ssm psr.dt + ;; + srlz.i + ;; + SAVE_MIN_WITH_COVER + alloc r15=ar.pfs,0,0,3,0 + mov out0=cr.ifa + mov out1=cr.isr + adds r3=8,r2 // set up second base pointer + ;; + ssm psr.ic | PSR_DEFAULT_BITS + ;; + srlz.i // guarantee that interruption collectin is on + ;; +(p15) ssm psr.i // restore psr.i + movl r14=ia64_leave_kernel + ;; + SAVE_REST + mov rp=r14 + ;; + adds out2,r12 // out2 = pointer to pt_regs + br.call.sptk.many b6=ia64_do_page_fault // ignore return address +END(ia64_ivt_page_fault) + .org ia64_ivt+0x4400 ///////////////////////////////////////////////////////////////////////////////////////// // 0x4400 Entry 17 (size 64 bundles) Reserved
@@ -1065,7 +1073,7 @@ ;; mov r31=pr srlz.d - br.sptk.many page_fault + br.sptk.many ia64_ivt_page_fault END(page_not_present) .org ia64_ivt+0x5100
@@ -1078,7 +1086,7 @@ mov r31=pr ;; srlz.d - br.sptk.many page_fault + br.sptk.many ia64_ivt_page_fault END(key_permission) .org ia64_ivt+0x5200
@@ -1091,7 +1099,7 @@ mov r31=pr ;; srlz.d - br.sptk.many page_fault + br.sptk.many ia64_ivt_page_fault END(iaccess_rights) .org ia64_ivt+0x5300
@@ -1104,7 +1112,7 @@ mov r31=pr ;; srlz.d - br.sptk.many page_fault + br.sptk.many ia64_ivt_page_fault END(daccess_rights) .org ia64_ivt+0x5400
arch/ia64/sn/kernel/Makefile +1 -0
@@ -11,6 +11,7 @@ obj-y := probe.o setup.o sv.o bte.o irq.o mca.o \ idle.o sn2/ +obj-y += sn_ivt.o obj-$(CONFIG_IA64_GENERIC) += machvec.o obj-$(CONFIG_MODULES) += sn_ksyms.o
arch/ia64/sn/kernel/setup.c +73 -0
92 lines not on this page · raw message
arch/ia64/sn/kernel/sn_ivt.S new file +96 -0
96 lines not on this page · raw message
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line · Christopher Wedgwood
Chris> David,
Chris> Again, no screams about the 2.4.x version of this so I thought I'd try Chris> my luck with 2.5.x.
Screams don't transmit well over the Internet. But I assure you, there were there nonetheless...
Please see Bjorn's comment about the patch.
--david
Quoted 4 lines · David Mosberger
Screams don't transmit well over the Internet. But I assure you, there were there nonetheless...
Please see Bjorn's comment about the patch.
Actually, for this patch there were no nasty comments :)
I had hoped this really wouldn't be a problem for most people as all I'm doing is moving some code about and changing a symbol name.
I've been running this for months in one form or another on on hp and intel hardware too.
I guess it goes without saying whatever objections people have I'll address promptly so long as I hear them.
Thanks,
--cw