.include "../include/machine10-main.inc" .section .text .code64 .global _start _start: movq %rdi, %r14 movq %r8, %r13 movabsq $M10_EVENT_MAGIC, %rax cmpq %rax, M10_EVENT_MAGIC_OFFSET(%r14) jne bad_event cmpl $M10_EVENT_VERSION_PAYLOAD, M10_EVENT_VERSION_OFFSET(%r14) jne bad_event movabsq $M10_ABI_MAGIC, %rax movq %rax, M10_ABI_MAGIC_OFFSET(%r13) movl $M10_ABI_VERSION_MAINBOARD, M10_ABI_VERSION_OFFSET(%r13) movq %rdx, M10_ABI_V3_RESPONSE_ADDRESS(%r13) movq %rcx, M10_ABI_V3_RESPONSE_CAPACITY(%r13) movq $0, M10_ABI_V3_RESPONSE_LENGTH(%r13) movl $200, M10_ABI_V3_HTTP_STATUS(%r13) movl $M10_ERROR_NONE, M10_ABI_V3_ERROR(%r13) movq $0, M10_ABI_V3_COMPLETION_SEQUENCE(%r13) movl M10_EVENT_TYPE_OFFSET(%r14), %eax movl %eax, M10_ABI_V3_EVENT_TYPE(%r13) movq M10_EVENT_OCCURRENCE_OFFSET(%r14), %rax movq %rax, M10_ABI_V3_EVENT_OCCURRENCE(%r13) movl $M10_TIMER_KEEP, M10_ABI_V3_TIMER_ACTION(%r13) movq $0, M10_ABI_V3_WAKE_AFTER_MS(%r13) movl $M10_DISPOSITION_SLEEP, M10_ABI_V3_DISPOSITION(%r13) movabsq $M10_RETAINED_COUNTER_ADDRESS, %r10 movq M10_EVENT_GENERATION_OFFSET(%r14), %rax cmpq %rax, (%r10) jne state_mismatch incq (%r10) cmpl $M10_EVENT_INIT, M10_EVENT_TYPE_OFFSET(%r14) jne not_init movl $M10_TIMER_SET, M10_ABI_V3_TIMER_ACTION(%r13) movq $60000, M10_ABI_V3_WAKE_AFTER_MS(%r13) not_init: cmpl $M10_EVENT_TIMER, M10_EVENT_TYPE_OFFSET(%r14) jne commit movl $M10_TIMER_CANCEL, M10_ABI_V3_TIMER_ACTION(%r13) commit: movl $M10_OP_COMMIT_SLEEP, %eax jmp ring bad_event: movabsq $M10_ABI_MAGIC, %rax movq %rax, M10_ABI_MAGIC_OFFSET(%r13) movl $M10_ABI_VERSION_MAINBOARD, M10_ABI_VERSION_OFFSET(%r13) movl $M10_ERROR_BAD_EVENT, M10_ABI_V3_ERROR(%r13) movl $M10_OP_EXIT, %eax jmp ring state_mismatch: movl $M10_ERROR_STATE_MISMATCH, M10_ABI_V3_ERROR(%r13) movl $M10_OP_EXIT, %eax ring: movw $M10_DOORBELL_PORT, %dx outl %eax, %dx cli hlt