Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 31 → Rev 32

/SPARTAN/trunk/arch/ia32/include/acpi/acpi.h
73,4 → 73,6
 
extern void acpi_init(void);
 
static int rsdp_check(__u8 *rsdp);
 
#endif /* __ACPI_H__ */
/SPARTAN/trunk/arch/ia32/src/ia32.c
85,7 → 85,16
{
if (config.cpu_active == 1) {
ega_init(); /* video */
}
}
 
void arch_late_init()
{
if (config.cpu_active == 1) {
#ifdef __SMP__
acpi_init();
mp_init();
#endif /* __SMP__ */
}
}
 
/SPARTAN/trunk/arch/ia32/src/smp/mp.c
128,59 → 128,34
 
void mp_init(void)
{
__address addr, frame;
int cnt, n;
__u8 *addr[2] = { NULL, (__u8 *) 0xf0000 };
int i, j, length[2] = { 1024, 64*1024 };
 
/*
* EBDA can be undefined. In that case addr would be 0.
* Find MP Floating Pointer Structure
* 1a. search first 1K of EBDA
* 1b. if EBDA is undefined, search last 1K of base memory
* 2. search 64K starting at 0xf0000
*/
addr = ebda;
if (addr) {
cnt = 1024;
while (addr = __u32_search(addr,cnt,FS_SIGNATURE)) {
if (mp_fs_check((__u8 *) addr))
 
addr[0] = (__u8 *) (ebda ? ebda : 639 * 1024);
for (i = 0; i < 2; i++) {
for (j = 0; j < length[i]; j += 16) {
if (*((__u32 *) &addr[i][j]) == FS_SIGNATURE && mp_fs_check(&addr[i][j])) {
fs = (struct __mpfs *) &addr[i][j];
goto fs_found;
addr++;
cnt--;
}
}
}
else {
/*
* Second place where the MP Floating Pointer Structure may live is the last
* kilobyte of base memory.
*/
addr = 639*1024;
cnt = 1024;
while (addr = __u32_search(addr,cnt,FS_SIGNATURE)) {
if (mp_fs_check((__u8 *) addr))
goto fs_found;
addr++;
cnt--;
}
}
 
/*
* As the last resort, MP Floating Pointer Structure is searched in the BIOS
* ROM.
*/
addr = 0xf0000;
cnt = 64*1024;
while (addr = __u32_search(addr,cnt,FS_SIGNATURE)) {
if (mp_fs_check((__u8 *) addr))
goto fs_found;
addr++;
cnt--;
}
 
return;
fs_found:
printf("%L: MP Floating Pointer Structure\n", addr);
printf("%L: MP Floating Pointer Structure\n", fs);
 
fs = (struct __mpfs *) addr;
frame_not_free((__address) fs);
 
if (fs->config_type == 0 && fs->configuration_table) {
if (fs->mpfib2 >> 7) {
printf("mp_init: PIC mode not supported\n");
/SPARTAN/trunk/arch/ia32/src/acpi/acpi.c
27,9 → 27,58
*/
 
#include <arch/acpi/acpi.h>
#include <arch/bios/bios.h>
 
#define RSDP_SIGNATURE "RSD PTR "
#define RSDP_REVISION_OFFS 15
 
struct acpi_rsdp *acpi_rsdp = NULL;
 
int rsdp_check(__u8 *rsdp) {
struct acpi_rsdp *r = (struct acpi_rsdp *) rsdp;
__u8 sum = 0;
int i;
for (i=0; i<20; i++)
sum += rsdp[i];
if (sum)
return 0; /* bad checksum */
 
if (r->revision == 0)
return 1; /* ACPI 1.0 */
for (; i<r->length; i++)
sum += rsdp[i];
return !sum;
}
 
void acpi_init(void)
{
__u8 *addr[2] = { NULL, (__u8 *) 0xe0000 };
int i, j, length[2] = { 1024, 128*1024 };
__u64 *sig = (__u64 *) RSDP_SIGNATURE;
 
/*
* Find Root System Description Pointer
* 1. search first 1K of EBDA
* 2. search 128K starting at 0xe0000
*/
 
addr[0] = (__u8 *) ebda;
for (i = (ebda ? 0 : 1); i < 2; i++) {
for (j = 0; j < length[i]; j += 16) {
if (*((__u64 *) &addr[i][j]) == *sig && rsdp_check(&addr[i][j])) {
acpi_rsdp = (struct acpi_rsdp *) &addr[i][j];
goto rsdp_found;
}
}
}
 
return;
 
rsdp_found:
printf("%L: ACPI Root System Description Pointer\n", acpi_rsdp);
}