/SPARTAN/trunk/include/func.h |
---|
37,6 → 37,4 |
extern int strcmp(char *src, char *dst); |
extern __address __u32_search(__address src, int cnt, __u32 x); |
#endif |
/SPARTAN/trunk/include/arch.h |
---|
41,6 → 41,7 |
extern void arch_pre_mm_init(void); |
extern void arch_post_mm_init(void); |
extern void arch_late_init(void); |
extern void calibrate_delay_loop(void); |
extern pri_t cpu_priority_high(void); |
/SPARTAN/trunk/src/main/kinit.c |
---|
85,9 → 85,12 |
/* |
* Now that all CPUs are up, we can report what we've found. |
*/ |
for (i = 0; i < config.cpu_count; i++) |
for (i = 0; i < config.cpu_count; i++) { |
if (cpus[i].active) |
cpu_print_report(&cpus[i]); |
else |
printf("cpu%d: not active\n", i); |
} |
#ifdef __SMP__ |
if (config.cpu_count > 1) { |
/SPARTAN/trunk/src/main/main.c |
---|
115,9 → 115,7 |
printf("%L: hardcoded_ktext_size=%dK, hardcoded_kdata_size=%dK\n", |
config.base, hardcoded_ktext_size/1024, hardcoded_kdata_size/1024); |
#ifdef __SMP__ |
mp_init(); /* Multiprocessor */ |
#endif /* __SMP__ */ |
arch_late_init(); |
printf("config.cpu_count=%d\n", config.cpu_count); |
/SPARTAN/trunk/src/lib/func.c |
---|
59,15 → 59,3 |
} |
return 1; |
} |
__address __u32_search(__address src, int cnt, __u32 x) |
{ |
__u32 *base = (__u32 *) src; |
int i; |
for (i=0; i<=cnt-sizeof(__u32); i++) |
if (base[i] == x) |
return (__address) &base[i]; |
return 0; |
} |
/SPARTAN/trunk/src/mm/tlb.c |
---|
54,7 → 54,7 |
tlb_invalidate(0); /* TODO: use valid ASID */ |
busy_wait: |
for (i = 0; i<config.cpu_active; i++) |
for (i = 0; i<config.cpu_count; i++) |
if (cpus[i].tlb_active) |
goto busy_wait; |
} |
/SPARTAN/trunk/arch/mips/src/mips.c |
---|
53,3 → 53,7 |
void arch_post_mm_init(void) |
{ |
} |
void arch_late_init(void) |
{ |
} |
/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); |
} |