Dan Mick wrote: > /dev/mem doesn't access all of physical memory on Solaris x86. > > At present, the best substitute is the undocumented /dev/xsvc.
Thanks. I tried /dev/xsvc with lseek+read, seems it is not lseekable. I'll try mmap later. > > 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? >> >> >> > -- Thanks, Jike Song, SW Engineer Sun Microsystems China(ERI) Tel: (86-10)62673147 _______________________________________________ opensolaris-code mailing list opensolaris-code@opensolaris.org http://mail.opensolaris.org/mailman/listinfo/opensolaris-code