# Copyright 2024 Googl4 LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

BUFFER_OVERFLOW_DIR  := $(OUT)/cheriot/sencha/buffer_overflow
BUFFER_OVERFLOW  := $(BUFFER_OVERFLOW_DIR)/release/cheriot/cheriot/release/buffer_overflow-firmware
BUFFER_OVERFLOW_SRC_DIR := ${ROOTDIR}/hw/matcha/sw/device/cheriot/buffer_overflow

cheriot-buffer_overflow: __sail-buffer_overflow
	${MAKE} \
		__CHERIOT_ELF="@${BUFFER_OVERFLOW}" \
		__cheriot-simulate

cheriot-buffer_overflow+cli: __sail-buffer_overflow
	${MAKE} \
		__CHERIOT_ELF="@${BUFFER_OVERFLOW}" \
		__cheriot-simulate+cli

# Generates the buffer overflow firmware for sail
__sail-buffer_overflow:
	${MAKE} CHERIOT_BOARD=sail __buffer_overflow

.PHONY:: cheriot-buffer_overflow cheriot-buffer_overflow+cli
.PHONY:: __sail-buffer_overflow

BUFFER_OVERFLOW_FLASH_RELEASE=$(CHERIOT_OUT_RELEASE)/buffer_overflow_flash.tar

# XXX symlink cheriot fw to "kernel" to satisfy elfloader
$(BUFFER_OVERFLOW_FLASH_RELEASE): $(MATCHA_BUNDLE_RELEASE) | $(TMP_RELEASE)
	cp -f $(MATCHA_BUNDLE_RELEASE) $(TMP_RELEASE)/matcha-tock-bundle
	${C_PREFIX}strip $(TMP_RELEASE)/matcha-tock-bundle
	${C_PREFIX}objcopy -O binary -g $(TMP_RELEASE)/matcha-tock-bundle $(TMP_RELEASE)/matcha-tock-bundle.bin
	ln -sf $(BUFFER_OVERFLOW) $(TMP_RELEASE)/kernel
	tar -C $(TMP_RELEASE) -cvhf $@ matcha-tock-bundle.bin kernel
buffer_overflow_flash_release: __sencha-buffer_overflow $(BUFFER_OVERFLOW_FLASH_RELEASE)

## Runs the buffer overflow demo in renode on sencha
sencha-buffer_overflow: buffer_overflow_flash_release
	${MAKE} \
		__SENCHA_TAR="@${BUFFER_OVERFLOW_FLASH_RELEASE}" \
		__SENCHA_CHERIOT_ELF="@${TMP_RELEASE}/kernel" \
		__sencha-simulate

## Version of the `sencha-buffer_overflow` target that also enables the simulator command
## line interface on port 4567. To access the simulator use something like
## telnet localhost 4567. Note renode will block until the cli is connected.
sencha-buffer_overflow+cli: buffer_overflow_flash_release
	${MAKE} \
		__SENCHA_TAR="@${BUFFER_OVERFLOW_FLASH_RELEASE}" \
		__SENCHA_CHERIOT_ELF="@${TMP_RELEASE}/kernel" \
		__sencha-simulate+cli

# Generates the buffer overflow firmware for sencha
__sencha-buffer_overflow:
	${MAKE} CHERIOT_BOARD=sencha __buffer_overflow

# Helper that requires CHERIOT_BOARD be supplied on the cmd line
__buffer_overflow:
	${MAKE} \
		CHERIOT_OUT_DIR=${BUFFER_OVERFLOW_DIR} \
		CHERIOT_FIRMWARE_SRC_DIR=${BUFFER_OVERFLOW_SRC_DIR} \
		CHERIOT_FIRMWARE_RELEASE=$(BUFFER_OVERFLOW) \
		$(BUFFER_OVERFLOW)

## Cleans all build artifacts for the buffer_overflow demo
buffer_overflow-clean:
	rm -rf ${BUFFER_OVERFLOW_DIR}

.PHONY:: sencha-buffer_overflow sencha-buffer_overflow+cli
.PHONY:: buffer_overflow_flash_release
.PHONY:: buffer_overflow-clean
.PHONY:: __sencha-buffer_overflow __buffer_overflow
