163 lines
4.8 KiB
NASM
Raw Normal View History

2022-07-26 11:02:12 -07:00
// Load a single byte from kernel general memory.
%macro mload_kernel_general
// stack: offset
PUSH @SEGMENT_KERNEL_GENERAL
// stack: segment, offset
PUSH 0 // kernel has context 0
// stack: context, segment, offset
MLOAD_GENERAL
// stack: value
%endmacro
// Load a big-endian u32, consisting of 4 bytes (c_3, c_2, c_1, c_0),
// from kernel general memory.
%macro mload_kernel_general_u32
// stack: offset
DUP1
%mload_kernel_general
// stack: c_3, offset
%shl_const(8)
// stack: c_3 << 8, offset
DUP2
2022-08-01 15:05:42 -07:00
%increment
2022-07-26 11:02:12 -07:00
%mload_kernel_general
OR
// stack: (c_3 << 8) | c_2, offset
%shl_const(8)
// stack: ((c_3 << 8) | c_2) << 8, offset
DUP2
%add_const(2)
%mload_kernel_general
OR
// stack: (((c_3 << 8) | c_2) << 8) | c_1, offset
%shl_const(8)
// stack: ((((c_3 << 8) | c_2) << 8) | c_1) << 8, offset
SWAP1
%add_const(3)
%mload_kernel_general
OR
// stack: (((((c_3 << 8) | c_2) << 8) | c_1) << 8) | c_0
%endmacro
// Load 256 bits (half of a 512-bit SHA-2 block) from general kernel memory.
%macro mload_kernel_general_u256
// stack: offset
DUP1
2022-08-11 17:50:23 -07:00
%mload_kernel_general_u32
2022-07-26 11:02:12 -07:00
// stack: c_7, offset
%shl_const(32)
// stack: c7 << 32, offset
DUP2
2022-08-11 17:50:23 -07:00
%add_const(4)
2022-07-26 11:02:12 -07:00
%mload_kernel_general_u32
OR
// stack: (c_7 << 32) | c_6, offset
%shl_const(32)
// stack: ((c_7 << 32) | c_6) << 32, offset
DUP2
2022-08-11 17:50:23 -07:00
%add_const(8)
2022-07-26 11:02:12 -07:00
%mload_kernel_general_u32
OR
// stack: (c_7 << 64) | (c_6 << 32) | c_5, offset
%shl_const(32)
// stack: ((c_7 << 64) | (c_6 << 32) | c_5) << 32, offset
DUP2
2022-08-11 17:50:23 -07:00
%add_const(12)
2022-07-26 11:02:12 -07:00
%mload_kernel_general_u32
OR
// stack: (c_7 << 96) | (c_6 << 64) | (c_5 << 32) | c_4, offset
%shl_const(32)
// stack: ((c_7 << 96) | (c_6 << 64) | (c_5 << 32) | c_4) << 32, offset
DUP2
2022-08-11 17:50:23 -07:00
%add_const(16)
2022-07-26 11:02:12 -07:00
%mload_kernel_general_u32
OR
// stack: (c_7 << 128) | (c_6 << 96) | (c_5 << 64) | (c_4 << 32) | c_3, offset
%shl_const(32)
// stack: ((c_7 << 128) | (c_6 << 96) | (c_5 << 64) | (c_4 << 32) | c_3) << 32, offset
DUP2
2022-08-11 17:50:23 -07:00
%add_const(20)
2022-07-26 11:02:12 -07:00
%mload_kernel_general_u32
OR
// stack: (c_7 << 160) | (c_6 << 128) | (c_5 << 96) | (c_4 << 64) | (c_3 << 32) | c_2, offset
%shl_const(32)
// stack: ((c_7 << 160) | (c_6 << 128) | (c_5 << 96) | (c_4 << 64) | (c_3 << 32) | c_2) << 32, offset
DUP2
2022-08-11 17:50:23 -07:00
%add_const(24)
2022-07-26 11:02:12 -07:00
%mload_kernel_general_u32
OR
// stack: (c_7 << 192) | (c_6 << 160) | (c_5 << 128) | (c_4 << 96) | (c_3 << 64) | (c_2 << 32) | c_1, offset
%shl_const(32)
// stack: ((c_7 << 192) | (c_6 << 160) | (c_5 << 128) | (c_4 << 96) | (c_3 << 64) | (c_2 << 32) | c_1) << 32, offset
DUP2
2022-08-11 17:50:23 -07:00
%add_const(28)
2022-07-26 11:02:12 -07:00
%mload_kernel_general_u32
OR
// stack: (c_7 << 224) | (c_6 << 192) | (c_5 << 160) | (c_4 << 128) | (c_3 << 96) | (c_2 << 64) | (c_1 << 32) | c_0, offset
2022-09-19 10:33:04 -07:00
SWAP1
POP
2022-08-01 16:29:57 -07:00
// stack: (c_7 << 224) | (c_6 << 192) | (c_5 << 160) | (c_4 << 128) | (c_3 << 96) | (c_2 << 64) | (c_1 << 32) | c_0
2022-07-26 11:02:12 -07:00
%endmacro
// Store a single byte to kernel general memory.
%macro mstore_kernel_general
// stack: offset, value
PUSH @SEGMENT_KERNEL_GENERAL
// stack: segment, offset
PUSH 0 // kernel has context 0
// stack: context, segment, offset, value
MSTORE_GENERAL
%endmacro
// Store a big-endian u32, consisting of 4 bytes (c_3, c_2, c_1, c_0),
// to kernel general memory.
%macro mstore_kernel_general_u32
// stack: offset, value
2022-09-19 10:33:04 -07:00
SWAP1
2022-07-26 11:02:12 -07:00
// stack: value, offset
2022-09-19 10:31:55 -07:00
DUP1
// stack: value, value, offset
%and_const(0xff)
// stack: c_0 = value % (1 << 8), value, offset
2022-09-19 10:33:04 -07:00
SWAP1
2022-09-19 10:31:55 -07:00
// stack: value, c_0, offset
%shr_const(8)
// stack: value >> 8, c_0, offset
DUP1
// stack: value >> 8, value >> 8, c_0, offset
%and_const(0xff)
// stack: c_1 = (value >> 8) % (1 << 8), value >> 8, c_0, offset
2022-09-19 10:33:04 -07:00
SWAP1
2022-09-19 10:31:55 -07:00
// stack: value >> 8, c_1, c_0, offset
%shr_const(8)
// stack: value >> 16, c_1, c_0, offset
DUP1
// stack: value >> 16, value >> 16, c_1, c_0, offset
%and_const(0xff)
// stack: c_2 = (value >> 16) % (1 << 8), value >> 16, c_1, c_0, offset
2022-09-19 10:33:04 -07:00
SWAP1
2022-09-19 10:31:55 -07:00
// stack: value >> 16, c_2, c_1, c_0, offset
%shr_const(8)
// stack: value >> 24, c_2, c_1, c_0, offset
%and_const(0xff)
2022-07-26 11:02:12 -07:00
// stack: c_3 = (value >> 24) % (1 << 8), c_2, c_1, c_0, offset
2022-09-19 10:33:04 -07:00
DUP5
2022-07-26 11:02:12 -07:00
// stack: offset, c_3, c_2, c_1, c_0, offset
%mstore_kernel_general
// stack: c_2, c_1, c_0, offset
2022-09-19 10:33:04 -07:00
DUP4
2022-07-26 11:02:12 -07:00
// stack: offset, c_2, c_1, c_0, offset
2022-10-03 09:58:53 -07:00
%add_const(1)
2022-07-26 11:02:12 -07:00
%mstore_kernel_general
// stack: c_1, c_0, offset
2022-09-19 10:33:04 -07:00
DUP3
2022-07-26 11:02:12 -07:00
// stack: offset, c_1, c_0, offset
2022-10-03 09:58:53 -07:00
%add_const(2)
2022-07-26 11:02:12 -07:00
%mstore_kernel_general
// stack: c_0, offset
2022-09-19 10:33:04 -07:00
SWAP1
2022-07-26 11:02:12 -07:00
// stack: offset, c_0
2022-10-03 09:58:53 -07:00
%add_const(3)
2022-07-26 11:02:12 -07:00
%mstore_kernel_general
%endmacro