RE: read PCI memory and config spyce through /dev/mem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> > $ dd if=/dev/mem bs=1 count=1024 skip=4150263808
> > dd: reading `/dev/mem': Bad address
> > 0+0 records in
> > 0+0 records out
> > 0 bytes (0 B) copied, 6.6658e-05 s, 0.0 kB/s
> >
> > The kernel config help says that _PCI_ memory access is even
> > possible with STRICT_DEVMEM enabled. Can anyone give me a hint
> > what I may do wrong?
> 
> You *do* realize that doing a byte access on a 64-bit PCI register
> will probably fail, right?  And changing it to bs=8 won't fix it either,
> because some registers are 32-bit, and some are write-only.

The real target that I need to explore is a custom FPGA device on an
embedded (i386) system. One of its BARs (at 0x81423000) point to memory
that _does_ allow unrestricted byte access and has a size of two pages.
But anyhow, all of the following commands show the same error:

$ dd if=/dev/mem bs=1 count=1 skip=2168598528 | hexdump
$ dd if=/dev/mem bs=2 count=1 skip=1084299264 | hexdump
$ dd if=/dev/mem bs=4 count=1 skip=542149632 | hexdump
$ dd if=/dev/mem bs=8 count=1 skip=271074816 | hexdump
$ dd if=/dev/mem bs=4096 count=1 skip=529443 | hexdump # 4096 being the system's page size

Furthermore, read / write access through a simple program using /dev/mem
_does_ work as expected:

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <assert.h>
#include <sys/mman.h>
int main( int argc, char *argv[]) {
  char *mem;
  int fd;
  fd = open ("/dev/mem", O_RDWR);
  assert(fd >= 0);
  mem = mmap(NULL, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, (off_t) 0x81423000);
  assert(mem != MAP_FAILED);
  printf("Memory pointer: %p\n", mem);
  printf("The PCI memory is : %#x\n", *mem);
  *mem = *argv[1];
  printf("The PCI memory is : %#x\n", *mem);
  munmap(mem, getpagesize());
  close(fd);
  return 0;
}

Calling it, yields:

$ led 4
Memory pointer: 0xb7678000
The PCI memory is : 0x33
The PCI memory is : 0x34

And the LED matrix display being behind that address switches from 3 to
4 as expected.

Thus, I still cannot see why the access through /dev/mem using dd doesn't
work.
 
> Bottom line - what you're doing wrong is not accessing the PCI address
> space in the exact manner that the PCI spec requires.  You're lucky it
> just threw "bad address" - it *is* possible to end up wiping your entire
> system this way if you screw up the PCI config for your disk controller or
> similar.  Be glad you didn't have to recover from your backups this time.
> 
> You *do* have backups, right?

Don't worry about that, I've restored the system in less than a minute. 

_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@xxxxxxxxxxxxxxxxx
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies




[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux