From nobody@FreeBSD.org  Wed May 20 10:11:16 2009
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id B3509106566C
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 20 May 2009 10:11:16 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 869988FC20
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 20 May 2009 10:11:16 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.3/8.14.3) with ESMTP id n4KABFPr080782
	for <freebsd-gnats-submit@FreeBSD.org>; Wed, 20 May 2009 10:11:15 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.3/8.14.3/Submit) id n4KABFXT080781;
	Wed, 20 May 2009 10:11:15 GMT
	(envelope-from nobody)
Message-Id: <200905201011.n4KABFXT080781@www.freebsd.org>
Date: Wed, 20 May 2009 10:11:15 GMT
From: Alexandr <timon@masterhost.ru>
To: freebsd-gnats-submit@FreeBSD.org
Subject: mmcsd.ko produce kernel panic
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         134745
>Category:       kern
>Synopsis:       [mmcsd] [panic] mmcsd.ko produce kernel panic
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed May 20 10:20:01 UTC 2009
>Closed-Date:    Sat Apr 21 00:30:00 UTC 2012
>Last-Modified:  Sat Apr 21 00:30:00 UTC 2012
>Originator:     Alexandr
>Release:        FreeBSD 8-CURRENT
>Organization:
.masterhost
>Environment:
FreeBSD tim 8.0-CURRENT FreeBSD 8.0-CURRENT #5: Wed May 20 00:38:30 MSD 2009     root@tim:/usr/obj/usr/src/sys/GENERIC  i386
>Description:
Computer: Lenovo Thinkpad T61
Built-in card reader: sdhci0@pci0:21:0:2:     class=0x080500 card=0x20c817aa chip=0x08221180 rev=0x21 hdr=0x00
    vendor     = 'Ricoh Company, Ltd.'
    device     = 'R5C832, R5C843 SDA Standard Compliant SD Host Controller'
    class      = base peripheral
    subclass   = SD host controller

mmc.ko, mmcsd.ko, sdhci.ko loaded as mobules into kernel

Problem:
Kernel panic after insert SD-card to card reader slot:

Fatal trap 12: page fault while in kernel mode
cpuid = 0; apic id = 00
fault virtual address = 0xffffffe8
fault code = supervisor read, page not present
instruction pointer = 0x20:0xc0e42f7e
stack pointer = 0x28:0xc1820be4
frame pointer = 0x28:0x0
<...>
Stopped at mmcsd_attach+0xce: movl 0xffffffe8(%ebp),%eax

>How-To-Repeat:
Insert SD-card to hardware card controller
>Fix:


Patch attached with submission follows:

diff -u mmc.old/mmc.c mmc/mmc.c
--- mmc.old/mmc.c	2009-05-20 00:22:58.000000000 +0400
+++ mmc/mmc.c	2009-05-20 12:39:05.000000000 +0400
@@ -1448,7 +1448,7 @@
 		*(int *)result = ivar->csd.dsr_imp;
 		break;
 	case MMC_IVAR_MEDIA_SIZE:
-		*(off_t *)result = ivar->sec_count;
+		*(int *)result = ivar->sec_count;
 		break;
 	case MMC_IVAR_RCA:
 		*(int *)result = ivar->rca;
diff -u mmc.old/mmcsd.c mmc/mmcsd.c
--- mmc.old/mmcsd.c	2009-05-20 00:22:58.000000000 +0400
+++ mmc/mmcsd.c	2009-05-20 12:44:21.000000000 +0400
@@ -137,7 +137,7 @@
 	d->d_drv1 = sc;
 	d->d_maxsize = 4*1024*1024;	/* Maximum defined SD card AU size. */
 	d->d_sectorsize = mmc_get_sector_size(dev);
-	d->d_mediasize = mmc_get_media_size(dev) * d->d_sectorsize;
+	d->d_mediasize = (off_t)mmc_get_media_size(dev) * d->d_sectorsize;
 	d->d_stripeoffset = 0;
 	d->d_stripesize = mmc_get_erase_sector(dev) * d->d_sectorsize;
 	d->d_unit = device_get_unit(dev);
Only in mmc: mmcsd.c~
diff -u mmc.old/mmcvar.h mmc/mmcvar.h
--- mmc.old/mmcvar.h	2009-05-20 00:22:58.000000000 +0400
+++ mmc/mmcvar.h	2009-05-20 12:39:05.000000000 +0400
@@ -79,7 +79,7 @@
 	__BUS_ACCESSOR(mmc, var, MMC, ivar, type)
 
 MMC_ACCESSOR(dsr_imp, DSR_IMP, int)
-MMC_ACCESSOR(media_size, MEDIA_SIZE, off_t)
+MMC_ACCESSOR(media_size, MEDIA_SIZE, int)
 MMC_ACCESSOR(rca, RCA, int)
 MMC_ACCESSOR(sector_size, SECTOR_SIZE, int)
 MMC_ACCESSOR(tran_speed, TRAN_SPEED, int)


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-i386->freebsd-bugs 
Responsible-Changed-By: linimon 
Responsible-Changed-When: Mon Jun 15 05:04:54 UTC 2009 
Responsible-Changed-Why:  
This does not sound i386-specific. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=134745 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/134745: commit references a PR
Date: Fri, 20 Apr 2012 14:46:51 +0000 (UTC)

 Author: marius
 Date: Fri Apr 20 14:45:57 2012
 New Revision: 234492
 URL: http://svn.freebsd.org/changeset/base/234492
 
 Log:
   MFC: r222475
   
   Fix read_ivar implementation for MMC and SD.
   
   1. Both mmc_read_ivar() and sdhci_read_ivar() use the expression
   '*(int *)result = val' to assign to result which is uintptr_t *.
   This does not work on big-endian 64 bit systems.
   
   2. The media_size ivar is declared as 'off_t' which does not fit
   into uintptr_t in 32bit systems, change this to long.
   
   Submitted by:	kanthms at netlogicmicro com (initial version)
   
   PR:		134745
 
 Modified:
   stable/8/sys/dev/mmc/mmc.c
   stable/8/sys/dev/mmc/mmcvar.h
   stable/8/sys/dev/sdhci/sdhci.c
 Directory Properties:
   stable/8/sys/   (props changed)
   stable/8/sys/amd64/include/xen/   (props changed)
   stable/8/sys/boot/   (props changed)
   stable/8/sys/cddl/contrib/opensolaris/   (props changed)
   stable/8/sys/contrib/dev/acpica/   (props changed)
   stable/8/sys/contrib/pf/   (props changed)
   stable/8/sys/dev/e1000/   (props changed)
   stable/8/sys/i386/conf/XENHVM   (props changed)
 
 Modified: stable/8/sys/dev/mmc/mmc.c
 ==============================================================================
 --- stable/8/sys/dev/mmc/mmc.c	Fri Apr 20 14:29:45 2012	(r234491)
 +++ stable/8/sys/dev/mmc/mmc.c	Fri Apr 20 14:45:57 2012	(r234492)
 @@ -1445,37 +1445,37 @@ mmc_read_ivar(device_t bus, device_t chi
  	default:
  		return (EINVAL);
  	case MMC_IVAR_DSR_IMP:
 -		*(int *)result = ivar->csd.dsr_imp;
 +		*result = ivar->csd.dsr_imp;
  		break;
  	case MMC_IVAR_MEDIA_SIZE:
 -		*(off_t *)result = ivar->sec_count;
 +		*result = ivar->sec_count;
  		break;
  	case MMC_IVAR_RCA:
 -		*(int *)result = ivar->rca;
 +		*result = ivar->rca;
  		break;
  	case MMC_IVAR_SECTOR_SIZE:
 -		*(int *)result = MMC_SECTOR_SIZE;
 +		*result = MMC_SECTOR_SIZE;
  		break;
  	case MMC_IVAR_TRAN_SPEED:
 -		*(int *)result = mmcbr_get_clock(bus);
 +		*result = mmcbr_get_clock(bus);
  		break;
  	case MMC_IVAR_READ_ONLY:
 -		*(int *)result = ivar->read_only;
 +		*result = ivar->read_only;
  		break;
  	case MMC_IVAR_HIGH_CAP:
 -		*(int *)result = ivar->high_cap;
 +		*result = ivar->high_cap;
  		break;
  	case MMC_IVAR_CARD_TYPE:
 -		*(int *)result = ivar->mode;
 +		*result = ivar->mode;
  		break;
  	case MMC_IVAR_BUS_WIDTH:
 -		*(int *)result = ivar->bus_width;
 +		*result = ivar->bus_width;
  		break;
  	case MMC_IVAR_ERASE_SECTOR:
 -		*(int *)result = ivar->erase_sector;
 +		*result = ivar->erase_sector;
  		break;
  	case MMC_IVAR_MAX_DATA:
 -		*(int *)result = mmcbr_get_max_data(bus);
 +		*result = mmcbr_get_max_data(bus);
  		break;
  	}
  	return (0);
 
 Modified: stable/8/sys/dev/mmc/mmcvar.h
 ==============================================================================
 --- stable/8/sys/dev/mmc/mmcvar.h	Fri Apr 20 14:29:45 2012	(r234491)
 +++ stable/8/sys/dev/mmc/mmcvar.h	Fri Apr 20 14:45:57 2012	(r234492)
 @@ -79,7 +79,7 @@ enum mmc_device_ivars {
  	__BUS_ACCESSOR(mmc, var, MMC, ivar, type)
  
  MMC_ACCESSOR(dsr_imp, DSR_IMP, int)
 -MMC_ACCESSOR(media_size, MEDIA_SIZE, off_t)
 +MMC_ACCESSOR(media_size, MEDIA_SIZE, long)
  MMC_ACCESSOR(rca, RCA, int)
  MMC_ACCESSOR(sector_size, SECTOR_SIZE, int)
  MMC_ACCESSOR(tran_speed, TRAN_SPEED, int)
 
 Modified: stable/8/sys/dev/sdhci/sdhci.c
 ==============================================================================
 --- stable/8/sys/dev/sdhci/sdhci.c	Fri Apr 20 14:29:45 2012	(r234491)
 +++ stable/8/sys/dev/sdhci/sdhci.c	Fri Apr 20 14:45:57 2012	(r234492)
 @@ -1441,46 +1441,46 @@ sdhci_read_ivar(device_t bus, device_t c
  	default:
  		return (EINVAL);
  	case MMCBR_IVAR_BUS_MODE:
 -		*(int *)result = slot->host.ios.bus_mode;
 +		*result = slot->host.ios.bus_mode;
  		break;
  	case MMCBR_IVAR_BUS_WIDTH:
 -		*(int *)result = slot->host.ios.bus_width;
 +		*result = slot->host.ios.bus_width;
  		break;
  	case MMCBR_IVAR_CHIP_SELECT:
 -		*(int *)result = slot->host.ios.chip_select;
 +		*result = slot->host.ios.chip_select;
  		break;
  	case MMCBR_IVAR_CLOCK:
 -		*(int *)result = slot->host.ios.clock;
 +		*result = slot->host.ios.clock;
  		break;
  	case MMCBR_IVAR_F_MIN:
 -		*(int *)result = slot->host.f_min;
 +		*result = slot->host.f_min;
  		break;
  	case MMCBR_IVAR_F_MAX:
 -		*(int *)result = slot->host.f_max;
 +		*result = slot->host.f_max;
  		break;
  	case MMCBR_IVAR_HOST_OCR:
 -		*(int *)result = slot->host.host_ocr;
 +		*result = slot->host.host_ocr;
  		break;
  	case MMCBR_IVAR_MODE:
 -		*(int *)result = slot->host.mode;
 +		*result = slot->host.mode;
  		break;
  	case MMCBR_IVAR_OCR:
 -		*(int *)result = slot->host.ocr;
 +		*result = slot->host.ocr;
  		break;
  	case MMCBR_IVAR_POWER_MODE:
 -		*(int *)result = slot->host.ios.power_mode;
 +		*result = slot->host.ios.power_mode;
  		break;
  	case MMCBR_IVAR_VDD:
 -		*(int *)result = slot->host.ios.vdd;
 +		*result = slot->host.ios.vdd;
  		break;
  	case MMCBR_IVAR_CAPS:
 -		*(int *)result = slot->host.caps;
 +		*result = slot->host.caps;
  		break;
  	case MMCBR_IVAR_TIMING:
 -		*(int *)result = slot->host.ios.timing;
 +		*result = slot->host.ios.timing;
  		break;
  	case MMCBR_IVAR_MAX_DATA:
 -		*(int *)result = 65535;
 +		*result = 65535;
  		break;
  	}
  	return (0);
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/134745: commit references a PR
Date: Fri, 20 Apr 2012 15:57:01 +0000 (UTC)

 Author: marius
 Date: Fri Apr 20 15:56:51 2012
 New Revision: 234495
 URL: http://svn.freebsd.org/changeset/base/234495
 
 Log:
   MFC: r222475
   
   Fix read_ivar implementation for MMC and SD.
   
   1. Both mmc_read_ivar() and sdhci_read_ivar() use the expression
   '*(int *)result = val' to assign to result which is uintptr_t *.
   This does not work on big-endian 64 bit systems.
   
   2. The media_size ivar is declared as 'off_t' which does not fit
   into uintptr_t in 32bit systems, change this to long.
   
   Submitted by:	kanthms at netlogicmicro com (initial version)
   
   PR:		134745
 
 Modified:
   stable/7/sys/dev/mmc/mmc.c
   stable/7/sys/dev/mmc/mmcvar.h
   stable/7/sys/dev/sdhci/sdhci.c
 Directory Properties:
   stable/7/sys/   (props changed)
   stable/7/sys/cddl/contrib/opensolaris/   (props changed)
   stable/7/sys/contrib/dev/acpica/   (props changed)
   stable/7/sys/contrib/pf/   (props changed)
 
 Modified: stable/7/sys/dev/mmc/mmc.c
 ==============================================================================
 --- stable/7/sys/dev/mmc/mmc.c	Fri Apr 20 15:32:36 2012	(r234494)
 +++ stable/7/sys/dev/mmc/mmc.c	Fri Apr 20 15:56:51 2012	(r234495)
 @@ -1445,37 +1445,37 @@ mmc_read_ivar(device_t bus, device_t chi
  	default:
  		return (EINVAL);
  	case MMC_IVAR_DSR_IMP:
 -		*(int *)result = ivar->csd.dsr_imp;
 +		*result = ivar->csd.dsr_imp;
  		break;
  	case MMC_IVAR_MEDIA_SIZE:
 -		*(off_t *)result = ivar->sec_count;
 +		*result = ivar->sec_count;
  		break;
  	case MMC_IVAR_RCA:
 -		*(int *)result = ivar->rca;
 +		*result = ivar->rca;
  		break;
  	case MMC_IVAR_SECTOR_SIZE:
 -		*(int *)result = MMC_SECTOR_SIZE;
 +		*result = MMC_SECTOR_SIZE;
  		break;
  	case MMC_IVAR_TRAN_SPEED:
 -		*(int *)result = mmcbr_get_clock(bus);
 +		*result = mmcbr_get_clock(bus);
  		break;
  	case MMC_IVAR_READ_ONLY:
 -		*(int *)result = ivar->read_only;
 +		*result = ivar->read_only;
  		break;
  	case MMC_IVAR_HIGH_CAP:
 -		*(int *)result = ivar->high_cap;
 +		*result = ivar->high_cap;
  		break;
  	case MMC_IVAR_CARD_TYPE:
 -		*(int *)result = ivar->mode;
 +		*result = ivar->mode;
  		break;
  	case MMC_IVAR_BUS_WIDTH:
 -		*(int *)result = ivar->bus_width;
 +		*result = ivar->bus_width;
  		break;
  	case MMC_IVAR_ERASE_SECTOR:
 -		*(int *)result = ivar->erase_sector;
 +		*result = ivar->erase_sector;
  		break;
  	case MMC_IVAR_MAX_DATA:
 -		*(int *)result = mmcbr_get_max_data(bus);
 +		*result = mmcbr_get_max_data(bus);
  		break;
  	}
  	return (0);
 
 Modified: stable/7/sys/dev/mmc/mmcvar.h
 ==============================================================================
 --- stable/7/sys/dev/mmc/mmcvar.h	Fri Apr 20 15:32:36 2012	(r234494)
 +++ stable/7/sys/dev/mmc/mmcvar.h	Fri Apr 20 15:56:51 2012	(r234495)
 @@ -79,7 +79,7 @@ enum mmc_device_ivars {
  	__BUS_ACCESSOR(mmc, var, MMC, ivar, type)
  
  MMC_ACCESSOR(dsr_imp, DSR_IMP, int)
 -MMC_ACCESSOR(media_size, MEDIA_SIZE, off_t)
 +MMC_ACCESSOR(media_size, MEDIA_SIZE, long)
  MMC_ACCESSOR(rca, RCA, int)
  MMC_ACCESSOR(sector_size, SECTOR_SIZE, int)
  MMC_ACCESSOR(tran_speed, TRAN_SPEED, int)
 
 Modified: stable/7/sys/dev/sdhci/sdhci.c
 ==============================================================================
 --- stable/7/sys/dev/sdhci/sdhci.c	Fri Apr 20 15:32:36 2012	(r234494)
 +++ stable/7/sys/dev/sdhci/sdhci.c	Fri Apr 20 15:56:51 2012	(r234495)
 @@ -1441,46 +1441,46 @@ sdhci_read_ivar(device_t bus, device_t c
  	default:
  		return (EINVAL);
  	case MMCBR_IVAR_BUS_MODE:
 -		*(int *)result = slot->host.ios.bus_mode;
 +		*result = slot->host.ios.bus_mode;
  		break;
  	case MMCBR_IVAR_BUS_WIDTH:
 -		*(int *)result = slot->host.ios.bus_width;
 +		*result = slot->host.ios.bus_width;
  		break;
  	case MMCBR_IVAR_CHIP_SELECT:
 -		*(int *)result = slot->host.ios.chip_select;
 +		*result = slot->host.ios.chip_select;
  		break;
  	case MMCBR_IVAR_CLOCK:
 -		*(int *)result = slot->host.ios.clock;
 +		*result = slot->host.ios.clock;
  		break;
  	case MMCBR_IVAR_F_MIN:
 -		*(int *)result = slot->host.f_min;
 +		*result = slot->host.f_min;
  		break;
  	case MMCBR_IVAR_F_MAX:
 -		*(int *)result = slot->host.f_max;
 +		*result = slot->host.f_max;
  		break;
  	case MMCBR_IVAR_HOST_OCR:
 -		*(int *)result = slot->host.host_ocr;
 +		*result = slot->host.host_ocr;
  		break;
  	case MMCBR_IVAR_MODE:
 -		*(int *)result = slot->host.mode;
 +		*result = slot->host.mode;
  		break;
  	case MMCBR_IVAR_OCR:
 -		*(int *)result = slot->host.ocr;
 +		*result = slot->host.ocr;
  		break;
  	case MMCBR_IVAR_POWER_MODE:
 -		*(int *)result = slot->host.ios.power_mode;
 +		*result = slot->host.ios.power_mode;
  		break;
  	case MMCBR_IVAR_VDD:
 -		*(int *)result = slot->host.ios.vdd;
 +		*result = slot->host.ios.vdd;
  		break;
  	case MMCBR_IVAR_CAPS:
 -		*(int *)result = slot->host.caps;
 +		*result = slot->host.caps;
  		break;
  	case MMCBR_IVAR_TIMING:
 -		*(int *)result = slot->host.ios.timing;
 +		*result = slot->host.ios.timing;
  		break;
  	case MMCBR_IVAR_MAX_DATA:
 -		*(int *)result = 65535;
 +		*result = 65535;
  		break;
  	}
  	return (0);
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: open->closed 
State-Changed-By: marius 
State-Changed-When: Sat Apr 21 00:29:46 UTC 2012 
State-Changed-Why:  
close 

http://www.freebsd.org/cgi/query-pr.cgi?pr=134745 
>Unformatted:
