summaryrefslogtreecommitdiff
path: root/src/cpu/x86/smm/smm_tseg.ld
blob: 6def9729498e0dff46700cbf5cee3cf7be011217 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/* Maximum number of CPUs/cores */
CPUS = 16;

SECTIONS
{
	/* This is the actual SMM handler.
	 *
	 * We just put code, rodata, data and bss all in a row.
	 */
	.handler (.): {
		/* Assembler stub */
		*(.handler)
	}

	/* We are using the TSEG interleaved to stuff the SMM handlers
	 * for all CPU cores in there. The jump table redirects the execution
	 * to the actual SMM handler
	 */
	. = 0x8000 - (( CPUS - 1) * 0x400);
	.jumptable : {
		*(.jumptable)
	}

	/* Data used in early SMM TSEG handler. */
	. = 0x8400;
	.earlydata : {
		*(.earlydata)
	}

	/* 16KB for the heap at 64KB */
	. = 0x10000;
	.heap : {
		_heap = .;
		. = 0x4000;
		_eheap = .;
	}

	. = ALIGN(0x4000);
	.smm_c_handler : {
		_smm_c_handler_start = .;

		/* C code of the SMM handler */
		*(.text);
		*(.text.*);

		/* C read-only data of the SMM handler */
		. = ALIGN(16);
		*(.rodata)
		*(.rodata.*)
		*(.data.rel.ro.*)

		/* C read-write data of the SMM handler */
		 . = ALIGN(4);
		*(.data)

		/* C uninitialized data of the SMM handler */
		 . = ALIGN(4);
		*(.bss)
		*(.sbss)
		*(COMMON)
		 . = ALIGN(4);

		_smm_c_handler_end = .;
	}

	/DISCARD/ : {
		*(.comment)
		*(.note)
		*(.note.*)
	}
}