SEQSTAT in level 3 is the same as that in consequent software raised level 5. So, it is on the stack frame.
Graf is trying a better solution to avoid cplb missing by load missing cplb of current kernel stack into cplb table before raise level 5 in level 3. Sonic -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Robin Getz Sent: Wednesday, July 22, 2009 9:47 PM To: [email protected] Cc: [email protected] Subject: Re: [Linux-kernel-commits] [7059] trunk/arch/blackfin: Bug [#5153],fix mmap05 fail, the SAVE_ALL_SYS cause seqstat changed,so send a wrong signal. On Wed 22 Jul 2009 07:56, [email protected] pondered: > Revision > 7059 <http://blackfin.uclinux.org/gf/project/linux-kernel/scmsvn/?action=brow se&path=/&view=rev&root=linux-kernel&revision=7059> > Author > gyang <http://blackfin.uclinux.org/gf/user/gyang/> > Date > 2009-07-22 06:56:24 -0500 (Wed, 22 Jul 2009) > > > Log Message > > Bug [#5153] <http://blackfin.uclinux.org/gf/tracker/5153> , fix mmap05 fail, the SAVE_ALL_SYS cause seqstat changed, so send a wrong signal. > > Modified Paths > > > * trunk/arch/blackfin/include/asm/pda.h > * trunk/arch/blackfin/kernel/asm-offsets.c > * trunk/arch/blackfin/mach-common/entry.S > > > Diff > > > Modified: trunk/arch/blackfin/include/asm/pda.h (7058 => 7059) > > > --- trunk/arch/blackfin/include/asm/pda.h 2009-07-22 11:56:09 UTC (rev 7058) > +++ trunk/arch/blackfin/include/asm/pda.h 2009-07-22 11:56:24 UTC (rev 7059) > @@ -60,6 +60,7 @@ > unsigned long icplb_fault_addr; > unsigned long retx; > unsigned long seqstat; > + unsigned long seqstat_l5; /* saved seqstat in _exception_to_level5 */ > unsigned int __nmi_count; /* number of times NMI asserted on this CPU */ > }; > > > > Modified: trunk/arch/blackfin/kernel/asm-offsets.c (7058 => 7059) > > > --- trunk/arch/blackfin/kernel/asm-offsets.c 2009-07-22 11:56:09 UTC (rev 7058) > +++ trunk/arch/blackfin/kernel/asm-offsets.c 2009-07-22 11:56:24 UTC (rev 7059) > @@ -153,6 +153,7 @@ > DEFINE(PDA_ICPLB, offsetof(struct blackfin_pda, icplb_fault_addr)); > DEFINE(PDA_RETX, offsetof(struct blackfin_pda, retx)); > DEFINE(PDA_SEQSTAT, offsetof(struct blackfin_pda, seqstat)); > + DEFINE(PDA_SEQSTAT_L5, offsetof(struct blackfin_pda, seqstat_l5)); > #ifdef CONFIG_SMP > /* Inter-core lock (in L2 SRAM) */ > DEFINE(SIZEOF_CORELOCK, sizeof(struct corelock_slot)); > > > Modified: trunk/arch/blackfin/mach-common/entry.S (7058 => 7059) > > > --- trunk/arch/blackfin/mach-common/entry.S 2009-07-22 11:56:09 UTC (rev 7058) > +++ trunk/arch/blackfin/mach-common/entry.S 2009-07-22 11:56:24 UTC (rev 7059) > @@ -435,6 +435,22 @@ > ENDPROC(_double_fault) > > ENTRY(_exception_to_level5) > + /* > + * The call of SAVE_ALL_SYS may cause cplb exceptions, > + * the seqstat then be changed, so we save the seqstat to pda. > + */ > + EX_SCRATCH_REG = sp; > + GET_PDA_SAFE(sp); > + sp = [sp + PDA_EXSTACK]; > + [--sp] = (r7:7,p5:5); > + > + GET_PDA(p5, r7); > + r7 = SEQSTAT; > + [p5 + PDA_SEQSTAT_L5] = r7; > + > + (r7:7,p5:5) = [sp++]; > + sp = EX_SCRATCH_REG; > + > SAVE_ALL_SYS > > GET_PDA(p5, r7); /* Fetch current PDA */ > @@ -444,6 +460,9 @@ > r6 = [p5 + PDA_SYSCFG]; > [sp + PT_SYSCFG] = r6; > > + r6 = [p5 + PDA_SEQSTAT_L5]; /* Read back the seqstat */ > + [sp + PT_SEQSTAT] = r6; ? Don't you want the Level3 SEQSTAT on the frame? otherwise - it will print out the wrong seqstat when the traps_c code is run. _______________________________________________ Linux-kernel-commits mailing list [email protected] https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits _______________________________________________ Linux-kernel-commits mailing list [email protected] https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits
