diff options
| author | Michael Brown | 2016-02-16 16:19:01 +0100 |
|---|---|---|
| committer | Michael Brown | 2016-02-16 20:32:32 +0100 |
| commit | f468f12b1eca15e703aa2a79f1c82969c04c2322 (patch) | |
| tree | f1868e6cb7debaeb7aca59e4488b603fcc6481d7 /src/arch/i386/interface/pcbios/rtc_entropy.c | |
| parent | [bios] Move isolinux definitions to Makefile.pcbios (diff) | |
| download | ipxe-f468f12b1eca15e703aa2a79f1c82969c04c2322.tar.gz ipxe-f468f12b1eca15e703aa2a79f1c82969c04c2322.tar.xz ipxe-f468f12b1eca15e703aa2a79f1c82969c04c2322.zip | |
[bios] Add bin-x86_64-pcbios build platform
Move most arch/i386 files to arch/x86, and adjust the contents of the
Makefiles and the include/bits/*.h headers to reflect the new
locations.
This patch makes no substantive code changes, as can be seen using a
rename-aware diff (e.g. "git show -M5").
This patch does not make the pcbios platform functional for x86_64; it
merely allows it to compile without errors.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/arch/i386/interface/pcbios/rtc_entropy.c')
| -rw-r--r-- | src/arch/i386/interface/pcbios/rtc_entropy.c | 199 |
1 files changed, 0 insertions, 199 deletions
diff --git a/src/arch/i386/interface/pcbios/rtc_entropy.c b/src/arch/i386/interface/pcbios/rtc_entropy.c deleted file mode 100644 index 6e7ac833e..000000000 --- a/src/arch/i386/interface/pcbios/rtc_entropy.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>. - * - * 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. - * - * You can also choose to distribute this program under the terms of - * the Unmodified Binary Distribution Licence (as given in the file - * COPYING.UBDL), provided that you have satisfied its requirements. - */ - -FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); - -/** @file - * - * RTC-based entropy source - * - */ - -#include <stdint.h> -#include <string.h> -#include <biosint.h> -#include <pic8259.h> -#include <rtc.h> -#include <ipxe/entropy.h> - -/** RTC interrupt handler */ -extern void rtc_isr ( void ); - -/** Previous RTC interrupt handler */ -static struct segoff rtc_old_handler; - -/** - * Hook RTC interrupt handler - * - */ -static void rtc_hook_isr ( void ) { - - /* RTC interrupt handler */ - __asm__ __volatile__ ( - TEXT16_CODE ( "\nrtc_isr:\n\t" - /* Preserve registers */ - "pushw %%ax\n\t" - /* Set "interrupt triggered" flag */ - "movb $0x01, %%cs:rtc_flag\n\t" - /* Read RTC status register C to - * acknowledge interrupt - */ - "movb %2, %%al\n\t" - "outb %%al, %0\n\t" - "inb %1\n\t" - /* Send EOI */ - "movb $0x20, %%al\n\t" - "outb %%al, $0xa0\n\t" - "outb %%al, $0x20\n\t" - /* Restore registers and return */ - "popw %%ax\n\t" - "iret\n\t" - "\nrtc_flag:\n\t" - ".byte 0\n\t" ) - : - : "i" ( CMOS_ADDRESS ), "i" ( CMOS_DATA ), - "i" ( RTC_STATUS_C ) ); - - hook_bios_interrupt ( RTC_INT, ( intptr_t ) rtc_isr, &rtc_old_handler ); -} - -/** - * Unhook RTC interrupt handler - * - */ -static void rtc_unhook_isr ( void ) { - int rc; - - rc = unhook_bios_interrupt ( RTC_INT, ( intptr_t ) rtc_isr, - &rtc_old_handler ); - assert ( rc == 0 ); /* Should always be able to unhook */ -} - -/** - * Enable RTC interrupts - * - */ -static void rtc_enable_int ( void ) { - uint8_t status_b; - - /* Set Periodic Interrupt Enable bit in status register B */ - outb ( ( RTC_STATUS_B | CMOS_DISABLE_NMI ), CMOS_ADDRESS ); - status_b = inb ( CMOS_DATA ); - outb ( ( RTC_STATUS_B | CMOS_DISABLE_NMI ), CMOS_ADDRESS ); - outb ( ( status_b | RTC_STATUS_B_PIE ), CMOS_DATA ); - - /* Re-enable NMI and reset to default address */ - outb ( CMOS_DEFAULT_ADDRESS, CMOS_ADDRESS ); - inb ( CMOS_DATA ); /* Discard; may be needed on some platforms */ -} - -/** - * Disable RTC interrupts - * - */ -static void rtc_disable_int ( void ) { - uint8_t status_b; - - /* Clear Periodic Interrupt Enable bit in status register B */ - outb ( ( RTC_STATUS_B | CMOS_DISABLE_NMI ), CMOS_ADDRESS ); - status_b = inb ( CMOS_DATA ); - outb ( ( RTC_STATUS_B | CMOS_DISABLE_NMI ), CMOS_ADDRESS ); - outb ( ( status_b & ~RTC_STATUS_B_PIE ), CMOS_DATA ); - - /* Re-enable NMI and reset to default address */ - outb ( CMOS_DEFAULT_ADDRESS, CMOS_ADDRESS ); - inb ( CMOS_DATA ); /* Discard; may be needed on some platforms */ -} - -/** - * Enable entropy gathering - * - * @ret rc Return status code - */ -static int rtc_entropy_enable ( void ) { - - rtc_hook_isr(); - enable_irq ( RTC_IRQ ); - rtc_enable_int(); - - return 0; -} - -/** - * Disable entropy gathering - * - */ -static void rtc_entropy_disable ( void ) { - - rtc_disable_int(); - disable_irq ( RTC_IRQ ); - rtc_unhook_isr(); -} - -/** - * Measure a single RTC tick - * - * @ret delta Length of RTC tick (in TSC units) - */ -uint8_t rtc_sample ( void ) { - uint32_t before; - uint32_t after; - uint32_t temp; - - __asm__ __volatile__ ( - REAL_CODE ( /* Enable interrupts */ - "sti\n\t" - /* Wait for RTC interrupt */ - "movb %b2, %%cs:rtc_flag\n\t" - "\n1:\n\t" - "xchgb %b2, %%cs:rtc_flag\n\t" /* Serialize */ - "testb %b2, %b2\n\t" - "jz 1b\n\t" - /* Read "before" TSC */ - "rdtsc\n\t" - /* Store "before" TSC on stack */ - "pushl %0\n\t" - /* Wait for another RTC interrupt */ - "xorb %b2, %b2\n\t" - "movb %b2, %%cs:rtc_flag\n\t" - "\n1:\n\t" - "xchgb %b2, %%cs:rtc_flag\n\t" /* Serialize */ - "testb %b2, %b2\n\t" - "jz 1b\n\t" - /* Read "after" TSC */ - "rdtsc\n\t" - /* Retrieve "before" TSC on stack */ - "popl %1\n\t" - /* Disable interrupts */ - "cli\n\t" - ) - : "=a" ( after ), "=d" ( before ), "=q" ( temp ) - : "2" ( 0 ) ); - - return ( after - before ); -} - -PROVIDE_ENTROPY_INLINE ( rtc, min_entropy_per_sample ); -PROVIDE_ENTROPY ( rtc, entropy_enable, rtc_entropy_enable ); -PROVIDE_ENTROPY ( rtc, entropy_disable, rtc_entropy_disable ); -PROVIDE_ENTROPY_INLINE ( rtc, get_noise ); |
