diff options
| author | Marcel Moolenaar <marcel@FreeBSD.org> | 2001-10-20 03:39:55 +0000 |
|---|---|---|
| committer | Marcel Moolenaar <marcel@FreeBSD.org> | 2001-10-20 03:39:55 +0000 |
| commit | 3824d75af1de94a960be7a11e92787dc495a0d9e (patch) | |
| tree | c0038360dea8e87def9fd53a89735f19ae86635a | |
| parent | 5b8c64dd2c2ee2b0740f3a56d3b87bdf82f194f4 (diff) | |
Notes
| -rw-r--r-- | sys/ia64/ia64/sal.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/sys/ia64/ia64/sal.c b/sys/ia64/ia64/sal.c index 0296d5aad488..a1bb1cea3c6b 100644 --- a/sys/ia64/ia64/sal.c +++ b/sys/ia64/ia64/sal.c @@ -40,6 +40,7 @@ static sal_entry_t fake_sal; extern u_int64_t ia64_pal_entry; sal_entry_t *ia64_sal_entry = fake_sal; +u_int64_t ia64_sal_wakeup; static struct ia64_sal_result fake_sal(u_int64_t a1, u_int64_t a2, u_int64_t a3, u_int64_t a4, @@ -69,9 +70,11 @@ ia64_sal_init(struct sal_system_table *saltab) p = (u_int8_t *) (saltab + 1); for (i = 0; i < saltab->sal_entry_count; i++) { - if (*p == 0) { + switch (*p) { + case 0: { struct sal_entrypoint_descriptor *dp; - dp = (struct sal_entrypoint_descriptor *) p; + + dp = (struct sal_entrypoint_descriptor*)p; ia64_pal_entry = IA64_PHYS_TO_RR7(dp->sale_pal_proc); if (bootverbose) printf("PAL Proc at 0x%lx\n", ia64_pal_entry); @@ -79,11 +82,28 @@ ia64_sal_init(struct sal_system_table *saltab) sal_fdesc.gp = IA64_PHYS_TO_RR7(dp->sale_sal_gp); if (bootverbose) printf("SAL Proc at 0x%lx, GP at 0x%lx\n", - sal_fdesc.func, sal_fdesc.gp); + sal_fdesc.func, sal_fdesc.gp); ia64_sal_entry = (sal_entry_t *) &sal_fdesc; - return; + break; + } +#ifdef SMP + case 5: { + struct sal_ap_wakeup_descriptor *dp; + + dp = (struct sal_ap_wakeup_descriptor*)p; + KASSERT(dp->sale_mechanism == 0, + ("Unsupported AP wake-up mechanism")); + ia64_sal_wakeup = dp->sale_vector; + if (bootverbose) + printf("SMP: AP wake-up vector: 0x%lx\n", + ia64_sal_wakeup); + /* + * Register OS_BOOT_RENDEZ using SAL_SET_VECTORS + */ + break; + } +#endif } p += sizes[*p]; } } - |
