AnsweredAssumed Answered

where is sdhci_esdhc_imx_driver_init ???

Question asked by Ed Sutter on Nov 15, 2013
Latest reply on Nov 18, 2013 by Ed Sutter

This one really has me stumped...

I'm trying to trace through some of the kernel code to understand why I can't access eMMC.

I put a dump_stack() call at the top of the function sdhci_add_host() (in drivers/mmc/host/sdhci.c kernel=3.11.4).

When I boot up, I get a stack trace that looks something like this...

 

CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.11.4 #22

Backtrace:

[<80011ddc>] (dump_backtrace+0x0/0x10c) from [<80011f78>] (show_stack+0x18/0x1c)

r6:bfba82c0 r5:bfba82c0 r4:00000000 r3:00000000

[<80011f60>] (show_stack+0x0/0x1c) from [<80548398>] (dump_stack+0x80/0x9c)

[<80548318>] (dump_stack+0x0/0x9c) from [<8040d388>] (sdhci_add_host+0x24/0xbb4)

r4:bfb21d10 r3:00000000

[<8040d364>] (sdhci_add_host+0x0/0xbb4) from [<8040ef4c>] (sdhci_esdhc_imx_probe+0x28c/0x560)

[<8040ecc0>] (sdhci_esdhc_imx_probe+0x0/0x560) from [<802f8740>] (platform_drv_probe+0x20/0x24)

r8:80705e38 r7:80756c38 r6:00000000 r5:bf981e10 r4:807b2178

[<802f8720>] (platform_drv_probe+0x0/0x24) from [<802f739c>] (driver_probe_device+0x10c/0x224)

[<802f7290>] (driver_probe_device+0x0/0x224) from [<802f7548>] (__driver_attach+0x94/0x98)

r7:00000000 r6:bf981e44 r5:80756c38 r4:bf981e10

[<802f74b4>] (__driver_attach+0x0/0x98) from [<802f58a8>] (bus_for_each_dev+0x5c/0x90)

r6:802f74b4 r5:80756c38 r4:00000000 r3:bf83c85c

[<802f584c>] (bus_for_each_dev+0x0/0x90) from [<802f6e90>] (driver_attach+0x20/0x28)

r6:80746068 r5:bfb21c80 r4:80756c38

[<802f6e70>] (driver_attach+0x0/0x28) from [<802f6a08>] (bus_add_driver+0xdc/0x238)

[<802f692c>] (bus_add_driver+0x0/0x238) from [<802f7a6c>] (driver_register+0x80/0x154)

r8:80705e38 r7:806e746c r6:80762800 r5:00000006 r4:80756c38

[<802f79ec>] (driver_register+0x0/0x154) from [<802f8964>] (__platform_driver_register+0x50/0x64)

[<802f8914>] (__platform_driver_register+0x0/0x64) from [<80705e50>] (sdhci_esdhc_imx_driver_init+0x18/0x20)

[<80705e38>] (sdhci_esdhc_imx_driver_init+0x0/0x20) from [<80008798>] (do_one_initcall+0xf4/0x154)

[<800086a4>] (do_one_initcall+0x0/0x154) from [<806e7c24>] (kernel_init_freeable+0x104/0x1d0)

[<806e7b20>] (kernel_init_freeable+0x0/0x1d0) from [<805441f8>] (kernel_init+0x10/0xec)

[<805441e8>] (kernel_init+0x0/0xec) from [<8000e8b8>] (ret_from_fork+0x14/0x3c)

r4:00000000 r3:ffffffff                                                

 

Referring to the stack trace, I see that the function sdhci_esdhc_imx_driver_init is called, so I tried to look at that code in the kernel...

Its not there; yet it does show up in the System.map (and several other .o) files.  Then I thought maybe my browser wasn't showing

me the function, so I did a brute force find/grep on the whole tree...

 

First I did it on the tree that I had built and it showed me that the function name was in several .o files and also in the System.map file...

find . -type f -exec grep -l sdhci_esdhc_imx_driver_init {} \;

./drivers/built-in.o

./drivers/mmc/host/built-in.o

./drivers/mmc/host/sdhci-esdhc-imx.o

./drivers/mmc/built-in.o

./System.map

./.tmp_vmlinux1

./.tmp_System.map

./vmlinux.o

./.tmp_vmlinux2

./vmlinux

 

then I did it on a clean source tree and it came back empty.

Whats up with that?  How can the function exist symbolically but not be in the source code somewhere?

Ed

Outcomes