All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shin-ichiro KAWASAKI <kawasaki@juno.dti.ne.jp>
To: "linux-sh@vger.kernel.org" <linux-sh@vger.kernel.org>
Cc: qemu-devel@nongnu.org
Subject: sh: dcache flush breaks text region?
Date: Sat, 10 Jan 2009 17:38:48 +0000	[thread overview]
Message-ID: <4968DD28.3030709@juno.dti.ne.jp> (raw)

Hi, all.

I'm now working on to expand qemu-sh to emulate
"Solution Engine 7750", and found one odd thing.
Could you give me some advice?

My SH7750 emulation environment fails to boot up.
I made some investigation and found that,
 - the linux kernel for SE7750(se7750_defconfig) flushes
   dcache on its boot sequence.
 - SH7750's dcache is 16KB and direct-map.
   Then 16KB memory region are touched and modified to flush it.
 - empty_zero_page is used for this flush, but it only has
   4KB.  The text region after it has got broken and causes
   boot failure.

I added a patch against linux kernel to this mail for a reference.
It only reduces the flush region size to 4KB=PAGE_SIZE, but avoids
the problem and let the kernel boot up cleanly.
Of course it is not a good solution, because it does not flush all
caches.

I wonder two points.
 - Does this problem happen on real SE7750 board?
   In other words, does the current linux kernel work on it?
   I don't have it, and can't check it out by myself.
 - How should I solve the problem?
   16KB region should be allocated for flush by kernel?

The patches for SE7750 emulation is not yet posted
to qemu-devel. Before it, I'd like to solve the problem.

Any comments will be appreciated.

Regards,
Shin-ichiro KAWASAKI



diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c
index 5cfe08d..4042c8c 100644
--- a/arch/sh/mm/cache-sh4.c
+++ b/arch/sh/mm/cache-sh4.c
@@ -612,6 +612,9 @@ static void __flush_dcache_segment_1way(unsigned long start,
 
 	a0 = base_addr;
 	a0e = base_addr + extent_per_way;
+	if (a0e > ((unsigned long)&empty_zero_page[0]) + PAGE_SIZE) {
+	    a0e = ((unsigned long)&empty_zero_page[0]) + PAGE_SIZE;
+	}
 	do {
 		asm volatile("ldc %0, sr" : : "r" (sr_with_bl));
 		asm volatile("movca.l r0, @%0\n\t"

WARNING: multiple messages have this Message-ID (diff)
From: Shin-ichiro KAWASAKI <kawasaki@juno.dti.ne.jp>
To: "linux-sh@vger.kernel.org" <linux-sh@vger.kernel.org>
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] sh: dcache flush breaks text region?
Date: Sun, 11 Jan 2009 02:38:48 +0900	[thread overview]
Message-ID: <4968DD28.3030709@juno.dti.ne.jp> (raw)

Hi, all.

I'm now working on to expand qemu-sh to emulate
"Solution Engine 7750", and found one odd thing.
Could you give me some advice?

My SH7750 emulation environment fails to boot up.
I made some investigation and found that,
 - the linux kernel for SE7750(se7750_defconfig) flushes
   dcache on its boot sequence.
 - SH7750's dcache is 16KB and direct-map.
   Then 16KB memory region are touched and modified to flush it.
 - empty_zero_page is used for this flush, but it only has
   4KB.  The text region after it has got broken and causes
   boot failure.

I added a patch against linux kernel to this mail for a reference.
It only reduces the flush region size to 4KB=PAGE_SIZE, but avoids
the problem and let the kernel boot up cleanly.
Of course it is not a good solution, because it does not flush all
caches.

I wonder two points.
 - Does this problem happen on real SE7750 board?
   In other words, does the current linux kernel work on it?
   I don't have it, and can't check it out by myself.
 - How should I solve the problem?
   16KB region should be allocated for flush by kernel?

The patches for SE7750 emulation is not yet posted
to qemu-devel. Before it, I'd like to solve the problem.

Any comments will be appreciated.

Regards,
Shin-ichiro KAWASAKI



diff --git a/arch/sh/mm/cache-sh4.c b/arch/sh/mm/cache-sh4.c
index 5cfe08d..4042c8c 100644
--- a/arch/sh/mm/cache-sh4.c
+++ b/arch/sh/mm/cache-sh4.c
@@ -612,6 +612,9 @@ static void __flush_dcache_segment_1way(unsigned long start,
 
 	a0 = base_addr;
 	a0e = base_addr + extent_per_way;
+	if (a0e > ((unsigned long)&empty_zero_page[0]) + PAGE_SIZE) {
+	    a0e = ((unsigned long)&empty_zero_page[0]) + PAGE_SIZE;
+	}
 	do {
 		asm volatile("ldc %0, sr" : : "r" (sr_with_bl));
 		asm volatile("movca.l r0, @%0\n\t"

             reply	other threads:[~2009-01-10 17:38 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-10 17:38 Shin-ichiro KAWASAKI [this message]
2009-01-10 17:38 ` [Qemu-devel] sh: dcache flush breaks text region? Shin-ichiro KAWASAKI
2009-01-10 19:53 ` Edgar E. Iglesias
2009-01-10 19:53   ` Edgar E. Iglesias
2009-01-11  3:58   ` Shin-ichiro KAWASAKI
2009-01-11  3:58     ` Shin-ichiro KAWASAKI
2009-01-11 10:42     ` Edgar E. Iglesias
2009-01-11 10:42       ` Edgar E. Iglesias
2009-01-13  2:57       ` Edgar E. Iglesias
2009-01-13  2:57         ` Edgar E. Iglesias
2009-01-12 12:58     ` Paul Mundt
2009-01-12 12:58       ` Paul Mundt
2009-01-13  0:58       ` Edgar E. Iglesias
2009-01-13  0:58         ` Edgar E. Iglesias

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=4968DD28.3030709@juno.dti.ne.jp \
    --to=kawasaki@juno.dti.ne.jp \
    --cc=linux-sh@vger.kernel.org \
    --cc=qemu-devel@nongnu.org \
    /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.