public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Re: [Bug 13484] System report Int 6 error if E820 table reserve the memory above 4G
       [not found] ` <200906080543.n585hQYj017771@demeter.kernel.org>
@ 2009-06-08  6:49   ` Yinghai Lu
  2009-06-08  9:41     ` Peer Chen
  0 siblings, 1 reply; 3+ messages in thread
From: Yinghai Lu @ 2009-06-08  6:49 UTC (permalink / raw)
  To: bugzilla-daemon, Ingo Molnar, H. Peter Anvin, Thomas Gleixner,
	H. Peter Anvin, linux-kernel@vger.kernel.org, Peer Chen,
	Bernhard Walle

bugzilla-daemon@bugzilla.kernel.org wrote:
> http://bugzilla.kernel.org/show_bug.cgi?id=13484
> 
> 
> 
> 
> 
> --- Comment #3 from Peer Chen <pchen@nvidia.com>  2009-06-08 05:43:25 ---
> I'm using 64bit CPU, Intel P8400.
> 
> Yes, if set CONFIG_PHYS_ADDR_T_64BIT, the problem goes away.
> 

please check

---
 drivers/firmware/memmap.c    |   12 +++++-------
 include/linux/firmware-map.h |   12 ++++--------
 2 files changed, 9 insertions(+), 15 deletions(-)

Index: linux-2.6/drivers/firmware/memmap.c
===================================================================
--- linux-2.6.orig/drivers/firmware/memmap.c
+++ linux-2.6/drivers/firmware/memmap.c
@@ -31,8 +31,8 @@
  * information is necessary as for the resource tree.
  */
 struct firmware_map_entry {
-	resource_size_t		start;	/* start of the memory range */
-	resource_size_t		end;	/* end of the memory range (incl.) */
+	u64			start;	/* start of the memory range */
+	u64			end;	/* end of the memory range (incl.) */
 	const char		*type;	/* type of the memory range */
 	struct list_head	list;	/* entry for the linked list */
 	struct kobject		kobj;   /* kobject for each entry */
@@ -101,7 +101,7 @@ static LIST_HEAD(map_entries);
  * Common implementation of firmware_map_add() and firmware_map_add_early()
  * which expects a pre-allocated struct firmware_map_entry.
  **/
-static int firmware_map_add_entry(resource_size_t start, resource_size_t end,
+static int firmware_map_add_entry(u64 start, u64 end,
 				  const char *type,
 				  struct firmware_map_entry *entry)
 {
@@ -132,8 +132,7 @@ static int firmware_map_add_entry(resour
  *
  * Returns 0 on success, or -ENOMEM if no memory could be allocated.
  **/
-int firmware_map_add(resource_size_t start, resource_size_t end,
-		     const char *type)
+int firmware_map_add(u64 start, u64 end, const char *type)
 {
 	struct firmware_map_entry *entry;
 
@@ -157,8 +156,7 @@ int firmware_map_add(resource_size_t sta
  *
  * Returns 0 on success, or -ENOMEM if no memory could be allocated.
  **/
-int __init firmware_map_add_early(resource_size_t start, resource_size_t end,
-				  const char *type)
+int __init firmware_map_add_early(u64 start, u64 end, const char *type)
 {
 	struct firmware_map_entry *entry;
 
Index: linux-2.6/include/linux/firmware-map.h
===================================================================
--- linux-2.6.orig/include/linux/firmware-map.h
+++ linux-2.6/include/linux/firmware-map.h
@@ -24,21 +24,17 @@
  */
 #ifdef CONFIG_FIRMWARE_MEMMAP
 
-int firmware_map_add(resource_size_t start, resource_size_t end,
-		     const char *type);
-int firmware_map_add_early(resource_size_t start, resource_size_t end,
-			   const char *type);
+int firmware_map_add(u64 start, u64 end, const char *type);
+int firmware_map_add_early(u64 start, u64 end, const char *type);
 
 #else /* CONFIG_FIRMWARE_MEMMAP */
 
-static inline int firmware_map_add(resource_size_t start, resource_size_t end,
-				   const char *type)
+static inline int firmware_map_add(u64 start, u64 end, const char *type)
 {
 	return 0;
 }
 
-static inline int firmware_map_add_early(resource_size_t start,
-					 resource_size_t end, const char *type)
+static inline int firmware_map_add_early(u64 start, u64 end, const char *type)
 {
 	return 0;
 }

^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [Bug 13484] System report Int 6 error if E820 table reserve the memory above 4G
  2009-06-08  6:49   ` [Bug 13484] System report Int 6 error if E820 table reserve the memory above 4G Yinghai Lu
@ 2009-06-08  9:41     ` Peer Chen
  2009-06-08 17:54       ` [PATCH] firmware_map: fix hang with x86/32bit Yinghai Lu
  0 siblings, 1 reply; 3+ messages in thread
From: Peer Chen @ 2009-06-08  9:41 UTC (permalink / raw)
  To: Yinghai Lu, bugzilla-daemon, Ingo Molnar, H. Peter Anvin,
	Thomas Gleixner, H. Peter Anvin, linux-kernel, Bernhard Walle

Yinghai,

The patch works, thanks.

BRs
Peer Chen
> -----Original Message-----
> From: Yinghai Lu [mailto:yinghai@kernel.org]
> Sent: Monday, June 08, 2009 2:50 PM
> To: bugzilla-daemon@bugzilla.kernel.org; Ingo Molnar; H. Peter Anvin;
Thomas Gleixner; H. Peter Anvin; linux-kernel@vger.kernel.org;
> Peer Chen; Bernhard Walle
> Subject: Re: [Bug 13484] System report Int 6 error if E820 table
reserve the memory above 4G
> 
> bugzilla-daemon@bugzilla.kernel.org wrote:
> > http://bugzilla.kernel.org/show_bug.cgi?id=13484
> >
> >
> >
> >
> >
> > --- Comment #3 from Peer Chen <pchen@nvidia.com>  2009-06-08
05:43:25 ---
> > I'm using 64bit CPU, Intel P8400.
> >
> > Yes, if set CONFIG_PHYS_ADDR_T_64BIT, the problem goes away.
> >
> 
> please check
> 
> ---
>  drivers/firmware/memmap.c    |   12 +++++-------
>  include/linux/firmware-map.h |   12 ++++--------
>  2 files changed, 9 insertions(+), 15 deletions(-)
> 
> Index: linux-2.6/drivers/firmware/memmap.c
> ===================================================================
> --- linux-2.6.orig/drivers/firmware/memmap.c
> +++ linux-2.6/drivers/firmware/memmap.c
> @@ -31,8 +31,8 @@
>   * information is necessary as for the resource tree.
>   */
>  struct firmware_map_entry {
> -	resource_size_t		start;	/* start of the memory range */
> -	resource_size_t		end;	/* end of the memory range
(incl.) */
> +	u64			start;	/* start of the memory range */
> +	u64			end;	/* end of the memory range
(incl.) */
>  	const char		*type;	/* type of the memory range */
>  	struct list_head	list;	/* entry for the linked list */
>  	struct kobject		kobj;   /* kobject for each entry */
> @@ -101,7 +101,7 @@ static LIST_HEAD(map_entries);
>   * Common implementation of firmware_map_add() and
firmware_map_add_early()
>   * which expects a pre-allocated struct firmware_map_entry.
>   **/
> -static int firmware_map_add_entry(resource_size_t start,
resource_size_t end,
> +static int firmware_map_add_entry(u64 start, u64 end,
>  				  const char *type,
>  				  struct firmware_map_entry *entry)
>  {
> @@ -132,8 +132,7 @@ static int firmware_map_add_entry(resour
>   *
>   * Returns 0 on success, or -ENOMEM if no memory could be allocated.
>   **/
> -int firmware_map_add(resource_size_t start, resource_size_t end,
> -		     const char *type)
> +int firmware_map_add(u64 start, u64 end, const char *type)
>  {
>  	struct firmware_map_entry *entry;
> 
> @@ -157,8 +156,7 @@ int firmware_map_add(resource_size_t sta
>   *
>   * Returns 0 on success, or -ENOMEM if no memory could be allocated.
>   **/
> -int __init firmware_map_add_early(resource_size_t start,
resource_size_t end,
> -				  const char *type)
> +int __init firmware_map_add_early(u64 start, u64 end, const char
*type)
>  {
>  	struct firmware_map_entry *entry;
> 
> Index: linux-2.6/include/linux/firmware-map.h
> ===================================================================
> --- linux-2.6.orig/include/linux/firmware-map.h
> +++ linux-2.6/include/linux/firmware-map.h
> @@ -24,21 +24,17 @@
>   */
>  #ifdef CONFIG_FIRMWARE_MEMMAP
> 
> -int firmware_map_add(resource_size_t start, resource_size_t end,
> -		     const char *type);
> -int firmware_map_add_early(resource_size_t start, resource_size_t
end,
> -			   const char *type);
> +int firmware_map_add(u64 start, u64 end, const char *type);
> +int firmware_map_add_early(u64 start, u64 end, const char *type);
> 
>  #else /* CONFIG_FIRMWARE_MEMMAP */
> 
> -static inline int firmware_map_add(resource_size_t start,
resource_size_t end,
> -				   const char *type)
> +static inline int firmware_map_add(u64 start, u64 end, const char
*type)
>  {
>  	return 0;
>  }
> 
> -static inline int firmware_map_add_early(resource_size_t start,
> -					 resource_size_t end, const char
*type)
> +static inline int firmware_map_add_early(u64 start, u64 end, const
char *type)
>  {
>  	return 0;
>  }
-----------------------------------------------------------------------------------
This email message is for the sole use of the intended recipient(s) and may contain
confidential information.  Any unauthorized review, use, disclosure or distribution
is prohibited.  If you are not the intended recipient, please contact the sender by
reply email and destroy all copies of the original message.
-----------------------------------------------------------------------------------

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH] firmware_map: fix hang with x86/32bit
  2009-06-08  9:41     ` Peer Chen
@ 2009-06-08 17:54       ` Yinghai Lu
  0 siblings, 0 replies; 3+ messages in thread
From: Yinghai Lu @ 2009-06-08 17:54 UTC (permalink / raw)
  To: Andrew Morton, Ingo Molnar, H. Peter Anvin, Thomas Gleixner
  Cc: Peer Chen, linux-kernel


http://bugzilla.kernel.org/show_bug.cgi?id=13484

Peer reported:
| The bug is introduced from kernel 2.6.27, if E820 table reserve the memory
| above 4G in 32bit OS(BIOS-e820: 00000000fff80000 - 0000000120000000
| (reserved)), system will report Int 6 error and hang up. The bug is caused by
| the following code in drivers/firmware/memmap.c, the resource_size_t is 32bit
| variable in 32bit OS, the BUG_ON() will be invoked to result in the Int 6
| error. I try the latest 32bit Ubuntu and Fedora distributions, all hit this
| bug.
|======
|static int firmware_map_add_entry(resource_size_t start, resource_size_t end,
|                  const char *type,
|                  struct firmware_map_entry *entry)

and it only happen with CONFIG_PHYS_ADDR_T_64BIT is not set.

it turns out we need to pass u64 instead of resource_size_t for that.

Reported-and-tested-by: Peer Chen <pchen@nvidia.com>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: Bernhard Walle
Cc: stable@kernel.org

---
 drivers/firmware/memmap.c    |   12 +++++-------
 include/linux/firmware-map.h |   12 ++++--------
 2 files changed, 9 insertions(+), 15 deletions(-)

Index: linux-2.6/drivers/firmware/memmap.c
===================================================================
--- linux-2.6.orig/drivers/firmware/memmap.c
+++ linux-2.6/drivers/firmware/memmap.c
@@ -31,8 +31,8 @@
  * information is necessary as for the resource tree.
  */
 struct firmware_map_entry {
-	resource_size_t		start;	/* start of the memory range */
-	resource_size_t		end;	/* end of the memory range (incl.) */
+	u64			start;	/* start of the memory range */
+	u64			end;	/* end of the memory range (incl.) */
 	const char		*type;	/* type of the memory range */
 	struct list_head	list;	/* entry for the linked list */
 	struct kobject		kobj;   /* kobject for each entry */
@@ -101,7 +101,7 @@ static LIST_HEAD(map_entries);
  * Common implementation of firmware_map_add() and firmware_map_add_early()
  * which expects a pre-allocated struct firmware_map_entry.
  **/
-static int firmware_map_add_entry(resource_size_t start, resource_size_t end,
+static int firmware_map_add_entry(u64 start, u64 end,
 				  const char *type,
 				  struct firmware_map_entry *entry)
 {
@@ -132,8 +132,7 @@ static int firmware_map_add_entry(resour
  *
  * Returns 0 on success, or -ENOMEM if no memory could be allocated.
  **/
-int firmware_map_add(resource_size_t start, resource_size_t end,
-		     const char *type)
+int firmware_map_add(u64 start, u64 end, const char *type)
 {
 	struct firmware_map_entry *entry;
 
@@ -157,8 +156,7 @@ int firmware_map_add(resource_size_t sta
  *
  * Returns 0 on success, or -ENOMEM if no memory could be allocated.
  **/
-int __init firmware_map_add_early(resource_size_t start, resource_size_t end,
-				  const char *type)
+int __init firmware_map_add_early(u64 start, u64 end, const char *type)
 {
 	struct firmware_map_entry *entry;
 
Index: linux-2.6/include/linux/firmware-map.h
===================================================================
--- linux-2.6.orig/include/linux/firmware-map.h
+++ linux-2.6/include/linux/firmware-map.h
@@ -24,21 +24,17 @@
  */
 #ifdef CONFIG_FIRMWARE_MEMMAP
 
-int firmware_map_add(resource_size_t start, resource_size_t end,
-		     const char *type);
-int firmware_map_add_early(resource_size_t start, resource_size_t end,
-			   const char *type);
+int firmware_map_add(u64 start, u64 end, const char *type);
+int firmware_map_add_early(u64 start, u64 end, const char *type);
 
 #else /* CONFIG_FIRMWARE_MEMMAP */
 
-static inline int firmware_map_add(resource_size_t start, resource_size_t end,
-				   const char *type)
+static inline int firmware_map_add(u64 start, u64 end, const char *type)
 {
 	return 0;
 }
 
-static inline int firmware_map_add_early(resource_size_t start,
-					 resource_size_t end, const char *type)
+static inline int firmware_map_add_early(u64 start, u64 end, const char *type)
 {
 	return 0;
 }

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2009-06-08 17:55 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <bug-13484-13546@http.bugzilla.kernel.org/>
     [not found] ` <200906080543.n585hQYj017771@demeter.kernel.org>
2009-06-08  6:49   ` [Bug 13484] System report Int 6 error if E820 table reserve the memory above 4G Yinghai Lu
2009-06-08  9:41     ` Peer Chen
2009-06-08 17:54       ` [PATCH] firmware_map: fix hang with x86/32bit Yinghai Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox