/*
 * Copyright (C) 2008 Daniel Verkamp <daniel@drv.nu>.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 */

/**
 * @file SYSLINUX COMBOOT API
 *
 */

FILE_LICENCE ( GPL2_OR_LATER );

#include <errno.h>
#include <realmode.h>
#include <biosint.h>
#include <ipxe/console.h>
#include <stdlib.h>
#include <comboot.h>
#include <bzimage.h>
#include <pxe_call.h>
#include <rmsetjmp.h>
#include <string.h>
#include <ipxe/posix_io.h>
#include <ipxe/process.h>
#include <ipxe/serial.h>
#include <ipxe/ns16550.h>
#include <ipxe/init.h>
#include <ipxe/image.h>
#include <ipxe/version.h>
#include <usr/imgmgmt.h>

/** The "SYSLINUX" version string */
static char __bss16_array ( syslinux_version, [32] );
#define syslinux_version __use_data16 ( syslinux_version )

/** The "SYSLINUX" copyright string */
static char __data16_array ( syslinux_copyright, [] ) = " https://ipxe.org";
#define syslinux_copyright __use_data16 ( syslinux_copyright )

static char __data16_array ( syslinux_configuration_file, [] ) = "";
#define syslinux_configuration_file __use_data16 ( syslinux_configuration_file )

/** Feature flags */
static uint8_t __data16 ( comboot_feature_flags ) = COMBOOT_FEATURE_IDLE_LOOP;
#define comboot_feature_flags __use_data16 ( comboot_feature_flags )

typedef union {
	syslinux_pm_regs pm; syslinux_rm_regs rm;
} syslinux_regs;

/** Initial register values for INT 22h AX=1Ah and 1Bh */
static syslinux_regs __text16 ( comboot_initial_regs );
#define comboot_initial_regs __use_text16 ( comboot_initial_regs )

static struct segoff __text16 ( int20_vector );
#define int20_vector __use_text16 ( int20_vector )

static struct segoff __text16 ( int21_vector );
#define int21_vector __use_text16 ( int21_vector )

static struct segoff __text16 ( int22_vector );
#define int22_vector __use_text16 ( int22_vector )

extern void int20_wrapper ( void );
extern void int21_wrapper ( void );
extern void int22_wrapper ( void );

/* setjmp/longjmp context buffer used to return after loading an image */
rmjmp_buf comboot_return;

/* Mode flags set by INT 22h AX=0017h */
static uint16_t comboot_graphics_mode = 0;

/**
 * Print a string with a particular terminator
 */
static void print_user_string ( unsigned int segment, unsigned int offset, char terminator ) {
	char *c;
	for ( c = real_to_virt ( segment, offset ) ; *c != terminator ; c++ ) {
		putchar ( *c );
	}
}


/**
 * Perform a series of memory copies from a list in low memory
 */
static void shuffle ( unsigned int list_segment, unsigned int list_offset, unsigned int count )
{
	comboot_shuffle_descriptor shuf[COMBOOT_MAX_SHUFFLE_DESCRIPTORS];
	unsigned int i;

	/* Copy shuffle descriptor list so it doesn't get overwritten */
	memcpy ( shuf, real_to_virt ( list_segment, list_offset ),
		 count * sizeof( comboot_shuffle_descriptor ) );

	/* Do the copies */
	for ( i = 0; i < count; i++ ) {
		const void *src = phys_to_virt ( shuf[ i ].src );
		void *dest = phys_to_virt ( shuf[ i ].dest );

		if ( shuf[ i ].src == 0xFFFFFFFF ) {
			/* Fill with 0 instead of copying */
			memset ( dest, 0, shuf[ i ].len );
		} else if ( shuf[ i ].dest == 0xFFFFFFFF ) {
			/* Copy new list of descriptors */
			count = shuf[ i ].len / sizeof( comboot_shuffle_descriptor );
			assert ( count <= COMBOOT_MAX_SHUFFLE_DESCRIPTORS );
			memcpy ( shuf, src, shuf[ i ].len );
			i = -1;
		} else {
			/* Regular copy */
			memmove ( dest, src, shuf[ i ].len );
		}
	}
}


/**
 * Set default text mode
 */
void comboot_force_text_mode ( void ) {
	if ( comboot_graphics_mode & COMBOOT_VIDEO_VESA ) {
		/* Set VGA mode 3 via VESA VBE mode set */
		__asm__ __volatile__ (
			REAL_CODE (
				"mov $0x4F02, %%ax\n\t"
				"mov $0x03, %%bx\n\t"
				"int $0x10\n\t"
			)
		: : );
	} else if ( comboot_graphics_mode & COMBOOT_VIDEO_GRAPHICS ) {
		/* Set VGA mode 3 via standard VGA mode set */
		__asm__ __volatile__ (
			REAL_CODE (
				"mov $0x03, %%ax\n\t"
				"int $0x10\n\t"
			)
		: : );
	}

	comboot_graphics_mode = 0;
}


/**
 * Fetch kernel and optional initrd
 */
static int comboot_fetch_kernel ( const char *kernel_file, char *cmdline ) {
	struct image *kernel;
	struct image *initrd;
	char *initrd_file;
	int rc;

	/* Find initrd= parameter, if any */
	if ( ( initrd_file = strstr ( cmdline, "initrd=" ) ) != NULL ) {
		char *initrd_end;

		/* skip "initrd=" */
		initrd_file += 7;

		/* Find terminating space, if any, and replace with NUL */
		initrd_end = strchr ( initrd_file, ' ' );
		if ( initrd_end )
			*initrd_end = '\0';

		DBG ( "COMBOOT: fetching initrd '%s'\n", initrd_file );

		/* Fetch initrd */
		if ( ( rc = imgdownload_string ( initrd_file, 0,
						 &initrd ) ) != 0 ) {
			DBG ( "COMBOOT: could not fetch initrd: %s\n",
			      strerror ( rc ) );
			return rc;
		}

		/* Restore space after initrd name, if applicable */
		if ( initrd_end )
			*initrd_end = ' ';
	}

	DBG ( "COMBOOT: fetching kernel '%s'\n", kernel_file );

	/* Fetch kernel */
	if ( ( rc = imgdownload_string ( kernel_file, 0, &kernel ) ) != 0 ) {
		DBG ( "COMBOOT: could not fetch kernel: %s\n",
		      strerror ( rc ) );
		return rc;
	}

	/* Replace comboot image with kernel */
	if ( ( rc = image_replace ( kernel ) ) != 0 ) {
		DBG ( "COMBOOT: could not replace with kernel: %s\n",
		      strerror ( rc ) );
		return rc;
	}

	return 0;
}


/**
 * Terminate program interrupt handler
 */
static __asmcall __used void int20 ( struct i386_all_regs *ix86 __unused ) {
	rmlongjmp ( comboot_return, COMBOOT_EXIT );
}


/**
 * DOS-compatible API
 */
static __asmcall __used void int21 ( struct i386_all_regs *ix86 ) {
	ix86->flags |= CF;

	switch ( ix86->regs.ah ) {
	case 0x00:
	case 0x4C: /* Terminate program */
		rmlongjmp ( comboot_return, COMBOOT_EXIT );
		break;

	case 0x01: /* Get Key with Echo */
	case 0x08: /* Get Key without Echo */
		/* TODO: handle extended characters? */
		ix86->regs.al = getchar( );

		/* Enter */
		if ( ix86->regs.al == 0x0A )
			ix86->regs.al = 0x0D;

		if ( ix86->regs.ah == 0x01 )
			putchar ( ix86->regs.al );

		ix86->flags &= ~CF;
		break;

	case 0x02: /* Write Character */
		putchar ( ix86->regs.dl );
		ix86->flags &= ~CF;
		break;

	case 0x04: /* Write Character to Serial Port */
		if ( serial_console ) {
			uart_transmit ( serial_console, ix86->regs.dl );
			ix86->flags &= ~CF;
		}
		break;

	case 0x09: /* Write DOS String to Console */
		print_user_string ( ix86->segs.ds, ix86->regs.dx, '$' );
		ix86->flags &= ~CF;
		break;

	case 0x0B: /* Check Keyboard */
		if ( iskey() )
			ix86->regs.al = 0xFF;
		else
			ix86->regs.al = 0x00;

		ix86->flags &= ~CF;
		break;

	case 0x30: /* Check DOS Version */
		/* Bottom halves all 0; top halves spell "SYSLINUX" */
		ix86->regs.eax = 0x59530000;
		ix86->regs.ebx = 0x4C530000;
		ix86->regs.ecx = 0x4E490000;
		ix86->regs.edx = 0x58550000;
		ix86->flags &= ~CF;
		break;

	default:
		DBG ( "COMBOOT unknown int21 function %02x\n", ix86->regs.ah );
		break;
	}
}


/**
 * Dispatch PXE API call weakly
 *
 * @v ix86		Registers for PXE call
 * @ret present		Zero if the PXE stack is present, nonzero if not
 *
 * A successful return only indicates that the PXE stack was available
 * for dispatching the call; it says nothing about the success of
 * whatever the call asked for.
 */
__weak int pxe_api_call_weak ( struct i386_all_regs *ix86 __unused ) {
	return -1;
}

/**
 * SYSLINUX API
 */
static __asmcall __used void int22 ( struct i386_all_regs *ix86 ) {
	ix86->flags |= CF;

	switch ( ix86->regs.ax ) {
	case 0x0001: /* Get Version */

		/* Number of INT 22h API functions available */
		ix86->regs.ax = 0x001D;

		/* SYSLINUX version number */
		ix86->regs.ch = 0; /* major */
		ix86->regs.cl = 0; /* minor */

		/* SYSLINUX derivative ID */
		ix86->regs.dl = BZI_LOADER_TYPE_IPXE;

		/* SYSLINUX version */
		snprintf ( syslinux_version, sizeof ( syslinux_version ),
			   "\r\niPXE %s", product_version );

		/* SYSLINUX version and copyright strings */
		ix86->segs.es = rm_ds;
		ix86->regs.si = ( ( unsigned ) __from_data16 ( syslinux_version ) );
		ix86->regs.di = ( ( unsigned ) __from_data16 ( syslinux_copyright ) );

		ix86->flags &= ~CF;
		break;

	case 0x0002: /* Write String */
		print_user_string ( ix86->segs.es, ix86->regs.bx, '\0' );
		ix86->flags &= ~CF;
		break;

	case 0x0003: /* Run command */
		{
			const char *cmd = real_to_virt ( ix86->segs.es,
							 ix86->regs.bx );
			DBG ( "COMBOOT: executing command '%s'\n", cmd );
			system ( cmd );
			DBG ( "COMBOOT: exiting after executing command...\n" );
			rmlongjmp ( comboot_return, COMBOOT_EXIT_COMMAND );
		}
		break;

	case 0x0004: /* Run default command */
		/* FIXME: just exit for now */
		rmlongjmp ( comboot_return, COMBOOT_EXIT_COMMAND );
		break;

	case 0x0005: /* Force text mode */
		comboot_force_text_mode ( );
		ix86->flags &= ~CF;
		break;

	case 0x0006: /* Open file */
		{
			int fd;
			const char *file = real_to_virt ( ix86->segs.es,
							  ix86->regs.si );

			if ( file[0] == '\0' ) {
				DBG ( "COMBOOT: attempted open with empty file name\n" );
				break;
			}

			DBG ( "COMBOOT: opening file '%s'\n", file );

			fd = open ( file );

			if ( fd < 0 ) {
				DBG ( "COMBOOT: error opening file %s\n", file );
				break;
			}

			/* This relies on the fact that a iPXE POSIX fd will
			 * always fit in 16 bits.
			 */
#if (POSIX_FD_MAX > 65535)
#error POSIX_FD_MAX too large
#endif
			ix86->regs.si = (uint16_t) fd;

			ix86->regs.cx = COMBOOT_FILE_BLOCKSZ;
			ix86->regs.eax = fsize ( fd );
			ix86->flags &= ~CF;
		}
		break;

	case 0x0007: /* Read file */
		{
			int fd = ix86->regs.si;
			int len = ix86->regs.cx * COMBOOT_FILE_BLOCKSZ;
			int rc;
			fd_set fds;
			void *buf = real_to_virt ( ix86->segs.es,
						   ix86->regs.bx );

			/* Wait for data ready to read */
			FD_ZERO ( &fds );
			FD_SET ( fd, &fds );

			select ( &fds, 1 );

			rc = read ( fd, buf, len );
			if ( rc < 0 ) {
				DBG ( "COMBOOT: read failed\n" );
				ix86->regs.si = 0;
				break;
			}

			ix86->regs.ecx = rc;
			ix86->flags &= ~CF;
		}
		break;

	case 0x0008: /* Close file */
		{
			int fd = ix86->regs.si;
			close ( fd );
			ix86->flags &= ~CF;
		}
		break;

	case 0x0009: /* Call PXE Stack */
		if ( pxe_api_call_weak ( ix86 ) != 0 )
			ix86->flags |= CF;
		else
			ix86->flags &= ~CF;
		break;

	case 0x000A: /* Get Derivative-Specific Information */

		/* iPXE has its own derivative ID, so there is no defined
		 * output here; just return AL for now */
		ix86->regs.al = BZI_LOADER_TYPE_IPXE;
		ix86->flags &= ~CF;
		break;

	case 0x000B: /* Get Serial Console Configuration */
		if ( serial_console ) {
			struct ns16550_uart *comport = serial_console->priv;

			ix86->regs.dx = ( ( intptr_t ) comport->base );
			ix86->regs.cx = comport->divisor;
			ix86->regs.bx = 0;
			ix86->flags &= ~CF;
		}
		break;

	case 0x000C: /* Perform final cleanup */
		shutdown_boot();
		break;

	case 0x000E: /* Get configuration file name */
		/* FIXME: stub */
		ix86->segs.es = rm_ds;
		ix86->regs.bx = ( ( unsigned ) __from_data16 ( syslinux_configuration_file ) );
		ix86->flags &= ~CF;
		break;

	case 0x000F: /* Get IPAPPEND strings */
		/* FIXME: stub */
		ix86->regs.cx = 0;
		ix86->segs.es = 0;
		ix86->regs.bx = 0;
		ix86->flags &= ~CF;
		break;

	case 0x0010: /* Resolve hostname */
		{
			const char *hostname = real_to_virt ( ix86->segs.es,
							      ix86->regs.bx );
			struct in_addr addr;

			/* TODO:
			 * "If the hostname does not contain a dot (.), the
			 * local domain name is automatically appended."
			 */

			comboot_resolv ( hostname, &addr );

			ix86->regs.eax = addr.s_addr;
			ix86->flags &= ~CF;
		}
		break;

	case 0x0011: /* Maximum number of shuffle descriptors */
		ix86->regs.cx = COMBOOT_MAX_SHUFFLE_DESCRIPTORS;
		ix86->flags &= ~CF;
		break;

	case 0x0012: /* Cleanup, shuffle and boot */
		if ( ix86->regs.cx > COMBOOT_MAX_SHUFFLE_DESCRIPTORS )
			break;

		/* Perform final cleanup */
		shutdown_boot();

		/* Perform sequence of copies */
		shuffle ( ix86->segs.es, ix86->regs.di, ix86->regs.cx );

		/* Jump to real-mode entry point */
		__asm__ __volatile__ (
			REAL_CODE (
				"pushw %0\n\t"
				"popw %%ds\n\t"
				"pushl %1\n\t"
				"lret\n\t"
			)
			:
			: "R" ( ix86->segs.ds ),
			  "R" ( ix86->regs.ebp ),
			  "d" ( ix86->regs.ebx ),
			  "S" ( ix86->regs.esi ) );

		assert ( 0 ); /* Execution should never reach this point */

		break;

	case 0x0013: /* Idle loop call */
		step ( );
		ix86->flags &= ~CF;
		break;

	case 0x0015: /* Get feature flags */
		ix86->segs.es = rm_ds;
		ix86->regs.bx = ( ( unsigned ) __from_data16 ( &comboot_feature_flags ) );
		ix86->regs.cx = 1; /* Number of feature flag bytes */
		ix86->flags &= ~CF;
		break;

	case 0x0016: /* Run kernel image */
		{
			const char *file = real_to_virt ( ix86->segs.ds,
							  ix86->regs.si );
			char *cmd = real_to_virt ( ix86->segs.es,
						   ix86->regs.bx );

			DBG ( "COMBOOT: run kernel %s %s\n", file, cmd );
			comboot_fetch_kernel ( file, cmd );
			/* Technically, we should return if we
			 * couldn't load the kernel, but it's not safe
			 * to do that since we have just overwritten
			 * part of the COMBOOT program's memory space.
			 */
			DBG ( "COMBOOT: exiting to run kernel...\n" );
			rmlongjmp ( comboot_return, COMBOOT_EXIT_RUN_KERNEL );
		}
		break;

	case 0x0017: /* Report video mode change */
		comboot_graphics_mode = ix86->regs.bx;
		ix86->flags &= ~CF;
		break;

	case 0x0018: /* Query custom font */
		/* FIXME: stub */
		ix86->regs.al = 0;
		ix86->segs.es = 0;
		ix86->regs.bx = 0;
		ix86->flags &= ~CF;
		break;

	case 0x001B: /* Cleanup, shuffle and boot to real mode */
		if ( ix86->regs.cx > COMBOOT_MAX_SHUFFLE_DESCRIPTORS )
			break;

		/* Perform final cleanup */
		shutdown_boot();

		/* Perform sequence of copies */
		shuffle ( ix86->segs.es, ix86->regs.di, ix86->regs.cx );

		/* Copy initial register values to .text16 */
		memcpy ( real_to_virt ( rm_cs, (unsigned) __from_text16 ( &comboot_initial_regs ) ),
			 real_to_virt ( ix86->segs.ds, ix86->regs.si ),
			 sizeof(syslinux_rm_regs) );

		/* Load initial register values */
		__asm__ __volatile__ (
			REAL_CODE (
				/* Point SS:SP at the register value structure */
				"pushw %%cs\n\t"
				"popw %%ss\n\t"
				"movw $comboot_initial_regs, %%sp\n\t"

				/* Segment registers */
				"popw %%es\n\t"
				"popw %%ax\n\t" /* Skip CS */
				"popw %%ds\n\t"
				"popw %%ax\n\t" /* Skip SS for now */
				"popw %%fs\n\t"
				"popw %%gs\n\t"

				/* GP registers */
				"popl %%eax\n\t"
				"popl %%ecx\n\t"
				"popl %%edx\n\t"
				"popl %%ebx\n\t"
				"popl %%ebp\n\t" /* Skip ESP for now */
				"popl %%ebp\n\t"
				"popl %%esi\n\t"
				"popl %%edi\n\t"

				/* Load correct SS:ESP */
				"movw $(comboot_initial_regs + 6), %%sp\n\t"
				"popw %%ss\n\t"
				"movl %%cs:(comboot_initial_regs + 28), %%esp\n\t"

				"ljmp *%%cs:(comboot_initial_regs + 44)\n\t"
			)
			: : );

		break;

	case 0x001C: /* Get pointer to auxilliary data vector */
		/* FIXME: stub */
		ix86->regs.cx = 0; /* Size of the ADV */
		ix86->flags &= ~CF;
		break;

	case 0x001D: /* Write auxilliary data vector */
		/* FIXME: stub */
		ix86->flags &= ~CF;
		break;

	default:
		DBG ( "COMBOOT unknown int22 function %04x\n", ix86->regs.ax );
		break;
	}
}

/**
 * Hook BIOS interrupts related to COMBOOT API (INT 20h, 21h, 22h)
 */
void hook_comboot_interrupts ( ) {

	__asm__ __volatile__ (
		TEXT16_CODE ( "\nint20_wrapper:\n\t"
			      VIRT_CALL ( int20 )
			      "clc\n\t"
			      "call patch_cf\n\t"
		              "iret\n\t" ) : );

	hook_bios_interrupt ( 0x20, ( intptr_t ) int20_wrapper, &int20_vector );

	__asm__ __volatile__ (
		TEXT16_CODE ( "\nint21_wrapper:\n\t"
			      VIRT_CALL ( int21 )
			      "clc\n\t"
			      "call patch_cf\n\t"
		              "iret\n\t" ) : );

	hook_bios_interrupt ( 0x21, ( intptr_t ) int21_wrapper, &int21_vector );

	__asm__  __volatile__ (
		TEXT16_CODE ( "\nint22_wrapper:\n\t"
			      VIRT_CALL ( int22 )
			      "clc\n\t"
			      "call patch_cf\n\t"
		              "iret\n\t" ) : );

	hook_bios_interrupt ( 0x22, ( intptr_t ) int22_wrapper, &int22_vector );
}

/**
 * Unhook BIOS interrupts related to COMBOOT API (INT 20h, 21h, 22h)
 */
void unhook_comboot_interrupts ( ) {

	unhook_bios_interrupt ( 0x20, ( intptr_t ) int20_wrapper,
				&int20_vector );

	unhook_bios_interrupt ( 0x21, ( intptr_t ) int21_wrapper,
				&int21_vector );

	unhook_bios_interrupt ( 0x22, ( intptr_t ) int22_wrapper,
				&int22_vector );
}

/* Avoid dragging in serial console support unconditionally */
struct uart *serial_console __attribute__ (( weak ));
