Skip to contentSkip to conversation

mmap, PCI, segmentation fault, Dell Dimension 4550

DISCUSSION Scott Jacobsen 1 participant 1 message Aug 7, 2003

lore
Share & tools
lore
#0 lore raw

Oops. Private variable for the Software_Radio class.

unsigned long * bar0, *bar1, *bar2, *bar3, *bar4

Thx.

Quoted 107 lines · David B. Stevens

Scott,

Maybe I'm blind but where is bar0[x] ... defined.

Cheers,
Dave

Quoted 94 lines · Scott Jacobsen

Hi. Sorry for the intrusion but I've searched the archives and can't seem to find the answer for my problem.

After using mmap() map a peripheral card's PCI base address registers to user space on my Dell Dimension 4550 (Dell BIOS), I cause a segmentation fault by accessing the mapped memory.

My OS is Redhat 9 and the underlying kernel is 2.4.20-8. The code works fine on a generic computer (Award BIOS) running exactly the same kernel.

My driver for the card also maps the PCI base address registers in kernel space for the driver's usage, but like I mentioned, the code works fine on the other computer.

Here's my code and command line output (please pardon my non-gdb testing procedure):

////////////////////// code /////////////////////////

int Software_Radio::get_bars()
{
printf("get_bars\n"); // TEST LINE
uchar config_data[256];
off_t physical_bars[5];

  if(ioctl(filep, CONFIG_READ, config_data) == -1)
    perror("\nSoftware_Radio::get_bars() ioctl() CONFIG_READ failed");

  physical_bars[0]=((off_t)config_data[PCI_BASE_ADDRESS_0] |
           ((off_t)config_data[PCI_BASE_ADDRESS_0 + 1] << 8) |
           ((off_t)config_data[PCI_BASE_ADDRESS_0 + 2] << 16) |
           ((off_t)config_data[PCI_BASE_ADDRESS_0 + 3] << 24) );
  physical_bars[1]=((off_t)config_data[PCI_BASE_ADDRESS_1] |
           ((off_t)config_data[PCI_BASE_ADDRESS_1 + 1] << 8) |
           ((off_t)config_data[PCI_BASE_ADDRESS_1 + 2] << 16) |
           ((off_t)config_data[PCI_BASE_ADDRESS_1 + 3] << 24) );
  physical_bars[2]=((off_t)config_data[PCI_BASE_ADDRESS_2] |
           ((off_t)config_data[PCI_BASE_ADDRESS_2 + 1] << 8) |
           ((off_t)config_data[PCI_BASE_ADDRESS_2 + 2] << 16) |
           ((off_t)config_data[PCI_BASE_ADDRESS_2 + 3] << 24) );
  physical_bars[3]=((off_t)config_data[PCI_BASE_ADDRESS_3] |
           ((off_t)config_data[PCI_BASE_ADDRESS_3 + 1] << 8) |
           ((off_t)config_data[PCI_BASE_ADDRESS_3 + 2] << 16) |
           ((off_t)config_data[PCI_BASE_ADDRESS_3 + 3] << 24) );
  physical_bars[4]=((off_t)config_data[PCI_BASE_ADDRESS_4] |
           ((off_t)config_data[PCI_BASE_ADDRESS_4 + 1] << 8) |
           ((off_t)config_data[PCI_BASE_ADDRESS_4 + 2] << 16) |
           ((off_t)config_data[PCI_BASE_ADDRESS_4 + 3] << 24) );

int fd;

  if((fd=open("/dev/mem",O_RDWR)) < 0) {
    perror("opening /dev/mem");
    return -1;
  }
  unsigned long * remapped_bars[5];
  void * temp;
  for (int i = 0; i < 5; i++) {
    if((temp = mmap(0,bar_sizes[i],PROT_WRITE | PROT_READ,
            MAP_SHARED | MAP_FILE, fd, physical_bars[i])) < 0) {
      printf("MMAP failed.  Reason: %s\n",strerror(errno));
      return -1;
    }
    remapped_bars[i] = (unsigned long *)temp;

}
bar0 = remapped_bars[0];
printf("bar0 = 0x%x\n",&bar0); // TEST LINE
printf("bar0[15] = 0x%x\n",bar0[0]); // THIS LINE, OR ANY bar0[0]
CAUSES A SEGMENTATION FAULT
bar1 = remapped_bars[1];
bar2 = remapped_bars[2];
bar3 = remapped_bars[3];
bar4 = remapped_bars[4];
close(fd);
}

/////////////////// command line //////////////////

[root@jacobsen swr]# ./test
main:line 1 opening device /dev/sidrv0
get_bars
bar0 = 0xbfffe0b0
Segmentation fault
[root@jacobsen swr]#

//////////////////////////////////////////////////

Any suggestions?

Thanks,

Scott Jacobsen
MSc(Eng) Student
University of Calgary

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Signature · 26 lines
TRLabs
#280, 3553 - 31 Street NW
Calgary, Alberta T2L 2K7
Canada

Phone: 403-210-3530
Fax: 403-282-5870

Email: [email protected]







-- 
TRLabs
#280, 3553 - 31 Street NW
Calgary, Alberta T2L 2K7
Canada

Phone: 403-210-3530
Fax: 403-282-5870

Email: [email protected]