~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/ipxe/src/interface/efi/efi_watchdog.c

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2015 Michael Brown <mbrown@fensystems.co.uk>.
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or
 
5
 * modify it under the terms of the GNU General Public License as
 
6
 * published by the Free Software Foundation; either version 2 of the
 
7
 * License, or any later version.
 
8
 *
 
9
 * This program is distributed in the hope that it will be useful, but
 
10
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
12
 * General Public License for more details.
 
13
 *
 
14
 * You should have received a copy of the GNU General Public License
 
15
 * along with this program; if not, write to the Free Software
 
16
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 
17
 * 02110-1301, USA.
 
18
 *
 
19
 * You can also choose to distribute this program under the terms of
 
20
 * the Unmodified Binary Distribution Licence (as given in the file
 
21
 * COPYING.UBDL), provided that you have satisfied its requirements.
 
22
 */
 
23
 
 
24
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
25
 
 
26
/**
 
27
 * @file
 
28
 *
 
29
 * EFI watchdog holdoff timer
 
30
 *
 
31
 */
 
32
 
 
33
#include <errno.h>
 
34
#include <string.h>
 
35
#include <ipxe/retry.h>
 
36
#include <ipxe/timer.h>
 
37
#include <ipxe/efi/efi.h>
 
38
#include <ipxe/efi/efi_watchdog.h>
 
39
 
 
40
/** Watchdog holdoff interval (in seconds) */
 
41
#define WATCHDOG_HOLDOFF_SECS 10
 
42
 
 
43
/** Watchdog timeout (in seconds) */
 
44
#define WATCHDOG_TIMEOUT_SECS ( 5 * 60 )
 
45
 
 
46
/** Watchdog code (to be logged on watchdog timeout) */
 
47
#define WATCHDOG_CODE 0x6950584544454144ULL
 
48
 
 
49
/** Watchdog data (to be logged on watchdog timeout) */
 
50
#define WATCHDOG_DATA L"iPXE";
 
51
 
 
52
/**
 
53
 * Hold off watchdog timer
 
54
 *
 
55
 * @v retry             Retry timer
 
56
 * @v over              Failure indicator
 
57
 */
 
58
static void efi_watchdog_expired ( struct retry_timer *timer,
 
59
                                   int over __unused ) {
 
60
        EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
 
61
        static CHAR16 data[] = WATCHDOG_DATA;
 
62
        EFI_STATUS efirc;
 
63
        int rc;
 
64
 
 
65
        DBGC2 ( timer, "EFI holding off watchdog timer\n" );
 
66
 
 
67
        /* Restart this holdoff timer */
 
68
        start_timer_fixed ( timer, ( WATCHDOG_HOLDOFF_SECS * TICKS_PER_SEC ) );
 
69
 
 
70
        /* Reset watchdog timer */
 
71
        if ( ( efirc = bs->SetWatchdogTimer ( WATCHDOG_TIMEOUT_SECS,
 
72
                                              WATCHDOG_CODE, sizeof ( data ),
 
73
                                              data ) ) != 0 ) {
 
74
                rc = -EEFI ( efirc );
 
75
                DBGC ( timer, "EFI could not set watchdog timer: %s\n",
 
76
                       strerror ( rc ) );
 
77
                return;
 
78
        }
 
79
}
 
80
 
 
81
/** Watchdog holdoff timer */
 
82
struct retry_timer efi_watchdog = TIMER_INIT ( efi_watchdog_expired );