All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bob Pflederer <krp@rsn.hp.com>
To: Ryan Bradetich <rbradetich@uswest.net>, parisc-linux@thepuffingroup.com
Subject: Re: [parisc-linux] Boot error on C200+
Date: Sat, 2 Sep 2000 21:07:13 -0500	[thread overview]
Message-ID: <20000902210713.C987@localhost.localdomain> (raw)
In-Reply-To: <39B1822A.4E8F20AB@uswest.net>; from rbradetich@uswest.net on Sat, Sep 02, 2000 at 04:41:46PM -0600

[-- Attachment #1: Type: text/plain, Size: 3293 bytes --]

I see this on C180.  It goes away if you modify entry.S to use
PA2.0-style tlb inserts instead of the PA1.1-style tlb inserts.
Try the attached patch.  It modifies the tlb miss handlers at startup to
use PA2.0 tlb inserts if you have a PA2.0 cpu.  PA-8000 docs claim
that PA1.1 tlb inserts are not supported, so I suspect we're hitting
a case that doesn't work.

Would someone who has CVS write access be willing to commit this
patch?  It's the last thing I need to make C180 work.

-Bob

On Sat, Sep 02, 2000 at 04:41:46PM -0600, Ryan Bradetich wrote:
> Hello,
> 
> I am getting the following error when I attempt to boot parisc-linux on
> the
> C200+.
> 
> VFS: Mounted root (nfs filesystem) readonly.
> execve /sbin/init c0270008 c0270030
> 
> Kernel Fault: Code=7 regs=c7f98248 (Addr=00000110)
> 
> PSW  : 0004000b  GR 1 : 00002000  GR 2 : 00013403  GR 3 : 00000000
> GR 4 : 2001ff74  GR 5 : 00000000  GR 6 : 000777f4  GR 7 : 000010c4
> GR 8 : 000011bc  GR 9 : c7f98000  GR10 : c022fa78  GR11 : c0270030
> GR12 : c0270008  GR13 : c022fe14  GR14 : c0270000  GR15 : 617bfdfb
> GR16 : c027c60c  GR17 : 00000000  GR18 : c02b0000  GR19 : 00000001
> GR20 : 00000037  GR21 : 00089b9c  GR22 : 00089bd8  GR23 : 000010c4
> GR24 : 2001ff74  GR25 : 00000001  GR26 : 00000000  GR27 : 00088f00
> GR28 : b64d8e60  GR29 : b44302d0  GR30 : 20020140  GR31 : 00022d63
> SR0  : 00002000  SR1  : fffd2dff  SR2  : 00000000  SR3  : 00002000
> SR4  : 00000000  SR5  : 00002000  SR6  : 00002000  SR7  : 00002000
> 
> IASQ : 00000000 00000000 IAOQ : 00000110 00000114 ORIG_R28 : ffdf7fff
>  IIR : 43ffff40 ISR : 00000000 IOR : 00000000
> 
> 
> 
> Paul Bame helped me start tracking this error down.  I wanted to post
> his
> analysis along with the boot message to this list for further comment.
> (Hopefully his analysis will help other how to start debugging these
> errors
> as Paul helped me.)
> 
> - Kernel Fault Code 7 is an Instruction Memory Protection Trap.
> 
> - Stack Pointer (GR30) is in user space.   Most of the time if the
> kernel
> is in kernel space GR30 will look like this: 0xcxxxxxxx.
> 
> - GR2 is often the address where a subroutine will return, so it tells
> where
> it was called from.  In this case: 00013403.
> 
> - The last two bits of GR2 are non-zero, which is consistent with a
> userspace program.
> 
> - Perform an objdump -d on sash and look for address 133f8.
>         (GR2 & 0xfffffffc) - 0x8 (two instructions).
> 
>    133f8:       e8 47 12 b4     b,l 22d58 <__libc_fcntl>,rp
>    133fc:       34 19 00 02     ldi 1,r25
>    13400:       8f 9f 20 50     cmpib,<> -1,ret0,13430
> <check_one_fd+0x44>
>    13404:       4b c2 3f 59     ldw -54(sr0,sp),rp
> 
> - Find out who/what called your kernel, by looking up the sysmbols in
> sash (Note the sasy binary must contain symbols):
> 
>     hppa-linux-nm -n sash | grep 22d58
> 
> 00022d58 W __fcntl
> 00022d58 T __libc_fcntl
> 00022d58 W fcntl
> 
> 
> I am going to start digging around in sash and glibc to see if I can
> figure out
> anymore information on this problem.  Any help/advice is appreciated.
> 
> Thanks,
> 
> Ryan
> 
> 
> 
> ---------------------------------------------------------------------------
> To unsubscribe: send e-mail to parisc-linux-request@thepuffingroup.com with
> `unsubscribe' as the subject.

[-- Attachment #2: tlb.patch --]
[-- Type: text/plain, Size: 5528 bytes --]

Index: arch/parisc/kernel/entry.S
===================================================================
RCS file: /home/cvs/parisc/linux-2.3/arch/parisc/kernel/entry.S,v
retrieving revision 1.32
diff -u -p -r1.32 entry.S
--- entry.S	2000/08/30 22:28:35	1.32
+++ entry.S	2000/09/02 04:20:06
@@ -655,12 +655,18 @@ dtlb_miss:
 	depi		1,12,1,prot
 	extru,=         pte,_PAGE_USER_BIT,1,r0
 	depi		7,11,3,prot   /* Set for user space (1 rsvd for read) */
+	extru,= 	pte,_PAGE_GATEWAY_BIT,1,r0
+	depi		0,11,2,prot	/* If Gateway, Set PL2 to 0 */
 
 	/* Get rid of prot bits and convert to page addr for idtlba */
 
 	depi		0,31,12,pte
 	extru		pte,24,25,pte
 
+
+	/* The following may get patched with idtlb_insert_pa20 */
+	.export		idtlb_insert0,code
+idtlb_insert0:
 	mfsp		%sr1,t0  /* Save sr1 so we can use it in tlb inserts */
 	mtsp		spc,%sr1
 
@@ -671,6 +677,8 @@ dtlb_miss:
 
 	rfir
 	nop
+	.export		idtlb_insert0_end,code
+idtlb_insert0_end:
 
 itlb_miss:
 
@@ -712,6 +720,8 @@ itlb_miss_common:
 	copy            spc,prot        /* init prot with faulting space */
 	dep		pte,8,7,prot
 
+	extru,=		pte,_PAGE_NO_CACHE_BIT,1,r0
+	depi		1,12,1,prot
 	extru,=         pte,_PAGE_USER_BIT,1,r0
 	depi		7,11,3,prot   /* Set for user space (1 rsvd for read) */
 	extru,= 	pte,_PAGE_GATEWAY_BIT,1,r0
@@ -722,6 +732,9 @@ itlb_miss_common:
 	depi		0,31,12,pte
 	extru		pte,24,25,pte
 
+	/* The following may get patched with idtlb_insert_pa20 */
+	.export		iitlb_insert,code
+iitlb_insert:
 	mfsp		%sr1,t0  /* Save sr1 so we can use it in tlb inserts */
 	mtsp		spc,%sr1
 
@@ -732,6 +745,8 @@ itlb_miss_common:
 
 	rfir
 	nop
+	.export		iitlb_insert_end,code
+iitlb_insert_end:
 
 itlb_miss_kernel:
 	b               itlb_miss_common
@@ -773,12 +788,18 @@ dbit_trap:
 	depi		1,12,1,prot
 	extru,=         pte,_PAGE_USER_BIT,1,r0
 	depi		7,11,3,prot /* Set for user space (1 rsvd for read) */
+	extru,= 	pte,_PAGE_GATEWAY_BIT,1,r0
+	depi		0,11,2,prot	/* If Gateway, Set PL2 to 0 */
 
 	/* Get rid of prot bits and convert to page addr for idtlba */
 
 	depi		0,31,12,pte
 	extru		pte,24,25,pte
 
+
+	/* The following may get patched with idtlb_insert_pa20 */
+	.export		idtlb_insert1,code
+idtlb_insert1:
 	mfsp		%sr1,t0  /* Save sr1 so we can use it in tlb inserts */
 	mtsp		spc,%sr1
 
@@ -789,7 +810,37 @@ dbit_trap:
 
 	rfir
 	nop
+	.export		idtlb_insert1_end,code
+idtlb_insert1_end:
+
+	.level		2.0
+	.text
+	.export		idtlb_insert_pa20,code
+idtlb_insert_pa20:
+        depd    	%r17,31,32,%r17
+        depdi   	0,46,15,%r17
+	idtlbt		%r16,%r17
+	rfir
+	nop
+	nop
+	nop
+	.export		idtlb_insert_pa20_end,code
+idtlb_insert_pa20_end:
+
+	.export		iitlb_insert_pa20,code
+iitlb_insert_pa20:
+        depd    	%r17,31,32,%r17
+        depdi   	0,46,15,%r17
+	iitlbt		%r16,%r17
+	rfir
+	nop
+	nop
+	nop
+	.export		iitlb_insert_pa20_end,code
+iitlb_insert_pa20_end:
 
+	.level		1.1
+	.text
 	.import handle_interruption,code
 
 kernel_bad_space:
Index: arch/parisc/kernel/traps.c
===================================================================
RCS file: /home/cvs/parisc/linux-2.3/arch/parisc/kernel/traps.c,v
retrieving revision 1.18
diff -u -p -r1.18 traps.c
--- traps.c	2000/08/28 20:16:11	1.18
+++ traps.c	2000/09/02 04:20:06
@@ -29,6 +29,7 @@
 #include <asm/atomic.h>
 
 #include <asm/smp.h>
+#include <asm/pgalloc.h>
 
 static inline void console_verbose(void)
 {
@@ -350,8 +351,7 @@ extern void fault_vector(void);
 
 int __init check_ivt(char * iva)
 {
-	int i;
-	u32 check = 0, *p;
+	u32 *p;
 
 	if(strcmp(iva, "cows can fly"))
 		return -1;
@@ -375,7 +375,55 @@ int __init check_ivt(char * iva)
 
 	return 0;
 }
+
+extern void iitlb_insert(), idtlb_insert0(), idtlb_insert1();
+extern void iitlb_insert_end(), idtlb_insert0_end(), idtlb_insert1_end();
+extern void iitlb_insert_pa20(), idtlb_insert_pa20();
+extern void iitlb_insert_pa20_end(), idtlb_insert_pa20_end();
+
+static inline void
+flush_kernel_icache_range(unsigned long start, unsigned long size)
+{
+	register unsigned long end = start + size;
+	register unsigned long i;
+
+	for (i = start; i <= end; i += L1_CACHE_BYTES) {
+		asm volatile("fic 0(%%sr0, %0)" : : "r" (i));
+	}
+}
+
+void
+trap_patch_tlb_inserts()
+{
+	int ilen = iitlb_insert_pa20_end-iitlb_insert_pa20;
+	int dlen = idtlb_insert_pa20_end-idtlb_insert_pa20;
 	
+	if(ilen != (iitlb_insert_end-iitlb_insert)) {
+		panic("trap_patch_tlb_inserts: iitlb_insert_pa20 bad size");
+	}
+	if(dlen != (idtlb_insert0_end-idtlb_insert0)) {
+		panic("trap_patch_tlb_inserts: idtlb_insert_pa20 bad size");
+	}
+	if(dlen != (idtlb_insert0_end-idtlb_insert0)) {
+		panic("trap_patch_tlb_inserts: idtlb_insert_pa20 bad size");
+	}
+
+	memcpy (iitlb_insert, iitlb_insert_pa20, ilen);
+	memcpy (idtlb_insert0, idtlb_insert_pa20, dlen);
+	memcpy (idtlb_insert1, idtlb_insert_pa20, dlen);
+
+	flush_kernel_dcache_range((unsigned long)iitlb_insert, ilen);
+	flush_kernel_dcache_range((unsigned long)idtlb_insert0, dlen);
+	flush_kernel_dcache_range((unsigned long)idtlb_insert1, dlen);
+
+	flush_kernel_icache_range((unsigned long)iitlb_insert, ilen);
+	flush_kernel_icache_range((unsigned long)idtlb_insert0, dlen);
+	flush_kernel_icache_range((unsigned long)idtlb_insert1, dlen);
+
+        asm volatile("sync");
+
+}
+
 void __init trap_init(void)
 {
 	volatile long eiem;
@@ -385,6 +433,9 @@ void __init trap_init(void)
 	
 	if(check_ivt((void *)fault_vector))
 		panic("IVT invalid");
+	if(boot_cpu_data.cpu_type >= pcxu) {
+		trap_patch_tlb_inserts();
+	}
 
 	mtctl(__pa(&fault_vector), 14);
 	mtctl(0, 30);

  parent reply	other threads:[~2000-09-03  2:04 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-09-02 22:41 [parisc-linux] Boot error on C200+ Ryan Bradetich
2000-09-03  1:00 ` David Huggins-Daines
2000-09-03  2:26   ` Ryan Bradetich
2000-09-03  5:16     ` David Huggins-Daines
2000-09-03 16:57   ` bame
2000-09-03  2:07 ` Bob Pflederer [this message]
2000-09-03  2:29   ` Ryan Bradetich
  -- strict thread matches above, loose matches on Subject: below --
2000-09-03  3:29 John Marvin
2000-09-05 17:02 ` Bob Pflederer
2000-09-06  1:45   ` Ryan Bradetich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20000902210713.C987@localhost.localdomain \
    --to=krp@rsn.hp.com \
    --cc=parisc-linux@thepuffingroup.com \
    --cc=rbradetich@uswest.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.