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 <[email protected]>.
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
[email protected]
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code