~ubuntu-branches/ubuntu/wily/grub2/wily-proposed

« back to all changes in this revision

Viewing changes to lib/i386/datetime.c

  • Committer: Bazaar Package Importer
  • Author(s): Felix Zielcke, Robert Millan, Felix Zielcke
  • Date: 2010-01-26 19:26:25 UTC
  • mfrom: (1.13.8 upstream)
  • Revision ID: james.westby@ubuntu.com-20100126192625-coq6czap2ofjollf
Tags: 1.98~20100126-1
* New Bazaar snapshot.
  - Includes mipsel-yeeloong port.

[ Robert Millan ]
* config.in: Lower priority of grub2/linux_cmdline_default.

[ Felix Zielcke ]
* Drop `CFLAGS=-O0' workaround on powerpc. Should be fixed correctly now.
* Ship grub-bin2h and grub-script-check in grub-common.
* Terminate NEWS.Debian with a blank line like lintian would suggest
  if that check would be working correctly.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* kern/i386/datetime.c - x86 CMOS datetime function.
2
 
 *
3
 
 *  GRUB  --  GRand Unified Bootloader
4
 
 *  Copyright (C) 2008  Free Software Foundation, Inc.
5
 
 *
6
 
 *  GRUB is free software: you can redistribute it and/or modify
7
 
 *  it under the terms of the GNU General Public License as published by
8
 
 *  the Free Software Foundation, either version 3 of the License, or
9
 
 *  (at your option) any later version.
10
 
 *
11
 
 *  GRUB is distributed in the hope that it will be useful,
12
 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 
 *  GNU General Public License for more details.
15
 
 *
16
 
 *  You should have received a copy of the GNU General Public License
17
 
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
18
 
 */
19
 
 
20
 
#include <grub/datetime.h>
21
 
#include <grub/i386/cmos.h>
22
 
 
23
 
grub_err_t
24
 
grub_get_datetime (struct grub_datetime *datetime)
25
 
{
26
 
  int is_bcd, is_12hour;
27
 
  grub_uint8_t value, flag;
28
 
 
29
 
  flag = grub_cmos_read (GRUB_CMOS_INDEX_STATUS_B);
30
 
 
31
 
  is_bcd = ! (flag & GRUB_CMOS_STATUS_B_BINARY);
32
 
 
33
 
  value = grub_cmos_read (GRUB_CMOS_INDEX_YEAR);
34
 
  if (is_bcd)
35
 
    value = grub_bcd_to_num (value);
36
 
 
37
 
  datetime->year = value;
38
 
  datetime->year += (value < 80) ? 2000 : 1900;
39
 
 
40
 
  value = grub_cmos_read (GRUB_CMOS_INDEX_MONTH);
41
 
  if (is_bcd)
42
 
    value = grub_bcd_to_num (value);
43
 
 
44
 
  datetime->month = value;
45
 
 
46
 
  value = grub_cmos_read (GRUB_CMOS_INDEX_DAY_OF_MONTH);
47
 
  if (is_bcd)
48
 
    value = grub_bcd_to_num (value);
49
 
 
50
 
  datetime->day = value;
51
 
 
52
 
  is_12hour = ! (flag & GRUB_CMOS_STATUS_B_24HOUR);
53
 
 
54
 
  value = grub_cmos_read (GRUB_CMOS_INDEX_HOUR);
55
 
  if (is_12hour)
56
 
    {
57
 
      is_12hour = (value & 0x80);
58
 
 
59
 
      value &= 0x7F;
60
 
      value--;
61
 
    }
62
 
 
63
 
  if (is_bcd)
64
 
    value = grub_bcd_to_num (value);
65
 
 
66
 
  if (is_12hour)
67
 
    value += 12;
68
 
 
69
 
  datetime->hour = value;
70
 
 
71
 
  value = grub_cmos_read (GRUB_CMOS_INDEX_MINUTE);
72
 
  if (is_bcd)
73
 
    value = grub_bcd_to_num (value);
74
 
 
75
 
  datetime->minute = value;
76
 
 
77
 
  value = grub_cmos_read (GRUB_CMOS_INDEX_SECOND);
78
 
  if (is_bcd)
79
 
    value = grub_bcd_to_num (value);
80
 
 
81
 
  datetime->second = value;
82
 
 
83
 
  return 0;
84
 
}
85
 
 
86
 
grub_err_t
87
 
grub_set_datetime (struct grub_datetime *datetime)
88
 
{
89
 
  int is_bcd, is_12hour;
90
 
  grub_uint8_t value, flag;
91
 
 
92
 
  flag = grub_cmos_read (GRUB_CMOS_INDEX_STATUS_B);
93
 
 
94
 
  is_bcd = ! (flag & GRUB_CMOS_STATUS_B_BINARY);
95
 
 
96
 
  value = ((datetime->year >= 2000) ? datetime->year - 2000 :
97
 
           datetime->year - 1900);
98
 
 
99
 
  if (is_bcd)
100
 
    value = grub_num_to_bcd (value);
101
 
 
102
 
  grub_cmos_write (GRUB_CMOS_INDEX_YEAR, value);
103
 
 
104
 
  value = datetime->month;
105
 
 
106
 
  if (is_bcd)
107
 
    value = grub_num_to_bcd (value);
108
 
 
109
 
  grub_cmos_write (GRUB_CMOS_INDEX_MONTH, value);
110
 
 
111
 
  value = datetime->day;
112
 
 
113
 
  if (is_bcd)
114
 
    value = grub_num_to_bcd (value);
115
 
 
116
 
  grub_cmos_write (GRUB_CMOS_INDEX_DAY_OF_MONTH, value);
117
 
 
118
 
  value = datetime->hour;
119
 
 
120
 
  is_12hour = (! (flag & GRUB_CMOS_STATUS_B_24HOUR));
121
 
 
122
 
  if (is_12hour)
123
 
    {
124
 
      value++;
125
 
 
126
 
      if (value > 12)
127
 
        value -= 12;
128
 
      else
129
 
        is_12hour = 0;
130
 
    }
131
 
 
132
 
  if (is_bcd)
133
 
    value = grub_num_to_bcd (value);
134
 
 
135
 
  if (is_12hour)
136
 
    value |= 0x80;
137
 
 
138
 
  grub_cmos_write (GRUB_CMOS_INDEX_HOUR, value);
139
 
 
140
 
  value = datetime->minute;
141
 
 
142
 
  if (is_bcd)
143
 
    value = grub_num_to_bcd (value);
144
 
 
145
 
  grub_cmos_write (GRUB_CMOS_INDEX_MINUTE, value);
146
 
 
147
 
  value = datetime->second;
148
 
 
149
 
  if (is_bcd)
150
 
    value = grub_num_to_bcd (value);
151
 
 
152
 
  grub_cmos_write (GRUB_CMOS_INDEX_SECOND, value);
153
 
 
154
 
  return 0;
155
 
}