| Index: reboot_mode.py
|
| diff --git a/reboot_mode.py b/reboot_mode.py
|
| deleted file mode 100644
|
| index 18f336fd565a9a047f3d7b0456cc7826ef2754fd..0000000000000000000000000000000000000000
|
| --- a/reboot_mode.py
|
| +++ /dev/null
|
| @@ -1,171 +0,0 @@
|
| -#!/usr/bin/python
|
| -
|
| -# Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""A script to manipulate ChromeOS CMOS reboot Field.
|
| -
|
| -A few bits in a byte in CMOS (called RDB, short for 'Reboot Data Byte'
|
| -hereafter) are dedicated to information exchange between Linux and BIOS.
|
| -
|
| -The CMOS contents are available through /dev/nvrom. The location of RDB is
|
| -reported by BIOS through ACPI. The few bits in RDB operated on by this script
|
| -are defined in the all_mode_fields dictionary below along with their
|
| -functions.
|
| -
|
| -When invoked without parameters this script prints values of the fields. When
|
| -invoked with any of the bit field names as parameter(s), the script sets the
|
| -bit(s) as required.
|
| -
|
| -Additional parameters allow to specify alternative ACPI and NVRAM files for
|
| -testing.
|
| -"""
|
| -
|
| -__author__ = 'The Chromium OS Authors'
|
| -
|
| -import optparse
|
| -import sys
|
| -
|
| -class RebootModeError(Exception):
|
| - pass
|
| -
|
| -# global variables
|
| -parser = optparse.OptionParser()
|
| -acpi_file = '/sys/devices/platform/chromeos_acpi/CHNV'
|
| -nvram_file = '/dev/nvram'
|
| -
|
| -# Offset of RDB in NVRAM
|
| -rdb_offset = 0
|
| -
|
| -# NVRAM contents read on startup
|
| -rdb_value = ''
|
| -
|
| -# All bitfields in RDB this script provides access to. Field names prepended
|
| -# by `--' become this script's command line options
|
| -all_mode_fields = {
|
| - 'recovery' : 0x80,
|
| - 'debug_reset' : 0x40,
|
| - 'try_firmware_b': 0x20
|
| - }
|
| -
|
| -# A dictionary of fields to be updated as requested by the command line
|
| -# parameters
|
| -fields_to_set = {}
|
| -
|
| -
|
| -def OptionHandler(option, opt_str, value, p):
|
| - """Process bit field name command line parameter.
|
| -
|
| - Verifies that the value is in range (0 or 1) and adds the appropriate
|
| - element to fields_to_set dictionary. Should the same field specified in the
|
| - command line more than once, only the last value will be used.
|
| -
|
| - Raises:
|
| - RebootModeError in case the parameter value is out of range.
|
| - """
|
| -
|
| - global fields_to_set
|
| - key = opt_str[2:]
|
| - if value < 0 or value > 1:
|
| - raise RebootModeError('--%s should be either 0 or 1' % key)
|
| -
|
| - fields_to_set[key] = value
|
| -
|
| -
|
| -def PrepareOptions():
|
| - global parser
|
| - for field in all_mode_fields:
|
| - parser.add_option('--' + field, action='callback', type='int',
|
| - callback=OptionHandler)
|
| - parser.add_option('--acpi_file', dest='acpi_file')
|
| - parser.add_option('--nvram_file', dest='nvram_file')
|
| -
|
| -
|
| -def ParseOptions():
|
| - global acpi_file
|
| - global nvram_file
|
| - (opts, args) = parser.parse_args()
|
| -
|
| - if opts.acpi_file is not None:
|
| - acpi_file = opts.acpi_file
|
| -
|
| - if opts.nvram_file is not None:
|
| - nvram_file = opts.nvram_file
|
| -
|
| -
|
| -def GetRDBOffset():
|
| - global rdb_offset
|
| - try:
|
| - f = open(acpi_file, 'r')
|
| - rdb_offset = int(f.read())
|
| - f.close()
|
| - except IOError, e:
|
| - raise RebootModeError('Trying to read %s got this: %s' % (acpi_file, e))
|
| - except ValueError:
|
| - raise RebootModeError('%s contents are corrupted' % acpi_file)
|
| -
|
| -
|
| -def ReadNvram():
|
| - global rdb_value
|
| - try:
|
| - f = open(nvram_file, 'rb')
|
| - f.seek(rdb_offset)
|
| - rdb_value = ord(f.read(1)[0])
|
| - f.close()
|
| - except IOError, e:
|
| - if e[0] == 2:
|
| - raise RebootModeError(
|
| - '%s does not exist. Is nvram module installed?' % nvram_file)
|
| - if e[0] == 13:
|
| - raise RebootModeError('Access to %s denied. Are you root?' % nvram_file)
|
| - raise RebootModeError(e[1])
|
| - except IndexError, e:
|
| - raise RebootModeError('Failed reading mode byte from %s' % nvram_file)
|
| -
|
| -
|
| -def PrintCurrentMode():
|
| - print 'Current reboot mode settings:'
|
| - for (field, mask) in all_mode_fields.iteritems():
|
| - print '%-15s: %d' % (field, int(not not (rdb_value & mask)))
|
| -
|
| -
|
| -def SetNewMode():
|
| - new_mode = 0
|
| - updated_bits_mask = 0
|
| -
|
| - for (opt, value) in fields_to_set.iteritems():
|
| - mask = all_mode_fields[opt]
|
| - if value:
|
| - new_mode |= mask
|
| - updated_bits_mask |= mask
|
| -
|
| - if (rdb_value & updated_bits_mask) == new_mode:
|
| - print 'No update required'
|
| - return
|
| -
|
| - f = open(nvram_file, 'rb+')
|
| - f.seek(rdb_offset)
|
| - new_mode |= (rdb_value & ~updated_bits_mask)
|
| - f.write('%c' % new_mode)
|
| - f.close()
|
| -
|
| -
|
| -def DoRebootMode():
|
| - PrepareOptions()
|
| - ParseOptions()
|
| - GetRDBOffset()
|
| - ReadNvram()
|
| - if fields_to_set:
|
| - SetNewMode()
|
| - else:
|
| - PrintCurrentMode()
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - try:
|
| - DoRebootMode()
|
| - except RebootModeError, e:
|
| - print >> sys.stderr, '%s: %s' % (sys.argv[0].split('/')[-1], e)
|
| - sys.exit(1)
|
| - sys.exit(0)
|
|
|