xref: /aosp_15_r20/external/coreboot/src/cpu/x86/backup_default_smm.c (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <acpi/acpi.h>
4 #include <cbmem.h>
5 #include <console/console.h>
6 #include <cpu/x86/smm.h>
7 #include <string.h>
8 
backup_default_smm_area(void)9 void *backup_default_smm_area(void)
10 {
11 	void *save_area;
12 	const void *default_smm = (void *)SMM_DEFAULT_BASE;
13 
14 	if (!CONFIG(HAVE_ACPI_RESUME))
15 		return NULL;
16 
17 	/*
18 	 * The buffer needs to be preallocated regardless. In the non-resume
19 	 * path it will be allocated for handling resume. Note that cbmem_add()
20 	 * does a find before the addition.
21 	 */
22 	save_area = cbmem_add(CBMEM_ID_SMM_SAVE_SPACE, SMM_DEFAULT_SIZE);
23 
24 	if (save_area == NULL) {
25 		printk(BIOS_DEBUG, "SMM save area not added.\n");
26 		return NULL;
27 	}
28 
29 	/* Only back up the area on S3 resume. */
30 	if (acpi_is_wakeup_s3()) {
31 		memcpy(save_area, default_smm, SMM_DEFAULT_SIZE);
32 		return save_area;
33 	}
34 
35 	/*
36 	 * Not the S3 resume path. No need to restore memory contents after
37 	 * SMM relocation.
38 	 */
39 	return NULL;
40 }
41 
restore_default_smm_area(void * smm_save_area)42 void restore_default_smm_area(void *smm_save_area)
43 {
44 	void *default_smm = (void *)SMM_DEFAULT_BASE;
45 
46 	if (smm_save_area == NULL)
47 		return;
48 
49 	memcpy(default_smm, smm_save_area, SMM_DEFAULT_SIZE);
50 }
51