static void acpi_jump_to_wakeup(void *vector) { uintptr_t source = 0, target = 0; size_t size = 0; if (!acpi_s3_resume_allowed()) { printk(BIOS_WARNING, "ACPI: S3 resume not allowed.\n"); return; } if (!CONFIG(RELOCATABLE_RAMSTAGE)) { struct resume_backup *backup_mem = cbmem_find(CBMEM_ID_RESUME); if (backup_mem && backup_mem->valid) { backup_mem->valid = 0; target = backup_mem->lowmem; source = backup_mem->cbmem; size = backup_mem->size; } else { printk(BIOS_WARNING, "ACPI: Backup memory missing. " "No S3 resume.\n"); return; } } /* Copy wakeup trampoline in place. */ memcpy((void *)WAKEUP_BASE, &__wakeup, __wakeup_size); set_boot_successful(); timestamp_add_now(TS_ACPI_WAKE_JUMP); acpi_do_wakeup((uintptr_t)vector, source, target, size); }
void acpi_jump_to_wakeup(void *vector) { u32 acpi_backup_memory = 0; if (HIGH_MEMORY_SAVE && acpi_s3_resume_allowed()) { acpi_backup_memory = (u32)cbmem_find(CBMEM_ID_RESUME); if (!acpi_backup_memory) { printk(BIOS_WARNING, "ACPI: Backup memory missing. " "No S3 resume.\n"); return; } } #if CONFIG_SMP // FIXME: This should go into the ACPI backup memory, too. No pork sausages. /* * Just restore the SMP trampoline and continue with wakeup on * assembly level. */ memcpy(lowmem_backup_ptr, lowmem_backup, lowmem_backup_size); #endif /* Copy wakeup trampoline in place. */ memcpy((void *)WAKEUP_BASE, &__wakeup, __wakeup_size); #if CONFIG_COLLECT_TIMESTAMPS timestamp_add_now(TS_ACPI_WAKE_JUMP); #endif acpi_do_wakeup((u32)vector, acpi_backup_memory, CONFIG_RAMBASE, HIGH_MEMORY_SAVE); }
static void acpi_jump_to_wakeup(void *vector) { /* Copy wakeup trampoline in place */ memcpy((void *)WAKEUP_BASE, __wakeup, __wakeup_size); printf("Jumping to OS waking vector %p\n", vector); acpi_do_wakeup(vector); }
void acpi_jump_to_wakeup(void *vector) { u32 acpi_backup_memory = (u32)cbmem_find(CBMEM_ID_RESUME); if (!acpi_backup_memory) { printk(BIOS_WARNING, "ACPI: Backup memory missing. " "No S3 resume.\n"); return; } // FIXME: This should go into the ACPI backup memory, too. No pork saussages. /* * Just restore the SMP trampoline and continue with wakeup on * assembly level. */ memcpy(lowmem_backup_ptr, lowmem_backup, lowmem_backup_size); /* Copy wakeup trampoline in place. */ memcpy((void *)WAKEUP_BASE, &__wakeup, (size_t)&__wakeup_size); acpi_do_wakeup((u32)vector, acpi_backup_memory, CONFIG_RAMBASE, HIGH_MEMORY_SAVE); }