/dev/mem doesn't access all of physical memory on Solaris x86. At present, the best substitute is the undocumented /dev/xsvc.
Jike Song wrote: > Hi, > > I'm trying to port x86info to Solaris/OpenSolaris. However, I encountered a > problem wrt. MP tables. > x86info accepts a "-mp" option, and will dump the MP tables via lseek/read > /dev/mem. > > From the MultiProcessor Specification 1.4, this table should be probed as > following: > > The MP Floating Pointer Structure. This structure contains a physical address > pointer to the > MP configuration table and other MP feature information bytes. When present, > this structure > indicates that the system conforms to the MP specification. This structure > must be stored in at > least one of the following memory locations, because the operating system > searches for the MP > floating pointer structure in the order described below: > a. In the first kilobyte of Extended BIOS Data Area (EBDA), or > b. Within the last kilobyte of system base memory (e.g., 639K-640K for > systems with 640 > KB of base memory or 511K-512K for systems with 512 KB of base memory) if > the > EBDA segment is undefined, or > c. In the BIOS ROM address space between 0F0000h and 0FFFFFh. > > > But when you run x86info as root, the reading always fails: > > [js226...@git x86info]$ sudo x86info > x86info v1.21. Dave Jones 2001-2007 > Feedback to <da...@redhat.com>. > > readEntry: Bad address > Found 4 cpus[js226...@git x86info]$ > > > I wrote a program to do what the function apic_probe() of x86info project does > > /* filename: mem.c > * > * This is a silly program does what the function apic_probe() of x86info > project does: > * > * -> open /dev/mem > * -> seek where the MP config table is > * -> read 1024 bytes for EBDA > */ > #include <stdio.h> > #include <stdint.h> > #include <stdlib.h> > #include <sys/types.h> > #include <sys/stat.h> > #include <fcntl.h> > #include <unistd.h> > > typedef unsigned long vm_offset_t; > #define BIOS_SIZE 0x10000 > #define ONE_KBYTE 1024 > > > > int main(void) > { > uint16_t segment; > vm_offset_t target; > unsigned int buffer[BIOS_SIZE]; > > int fd = open("/dev/mem", O_RDONLY); > if (fd == -1) { > perror("open"); > exit(EXIT_FAILURE); > } > > if (lseek(fd, 0x040e, SEEK_SET) == (off_t)-1 ) { > perror("lseek"); > exit(EXIT_FAILURE); > } > > if (read(fd, &segment, 2) == -1) { > perror("read"); > exit(EXIT_FAILURE); > } > > printf("%hx\n", segment); > > if (segment) { > target = (vm_offset_t)segment << 4; > if (lseek(fd, target, SEEK_SET) == (off_t)-1 ) { > perror("lseek"); > exit(EXIT_FAILURE); > } > > if (read(fd, buffer, ONE_KBYTE) == -1) { > perror("read"); > exit(EXIT_FAILURE); > } else > printf("read of 1024 bytes of EBDA succeeded\n"); > } > > > return 0; > } > > > [js226...@git ~]$ sudo ./mem > 9ec0 > read: Bad address > > > Besides, I have test x86info in both Solaris/Linux on a machine. Linux's > /dev/mem driver handled this reading correctly. > > Any clues? > > > _______________________________________________ opensolaris-code mailing list opensolaris-code@opensolaris.org http://mail.opensolaris.org/mailman/listinfo/opensolaris-code