]> git.proxmox.com Git - grub2.git/blob - grub-core/commands/memrw.c
Import grub2_2.02+dfsg1.orig.tar.xz
[grub2.git] / grub-core / commands / memrw.c
1 /* memrw.c - command to read / write physical memory */
2 /*
3 * GRUB -- GRand Unified Bootloader
4 * Copyright (C) 2009 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/dl.h>
21 #include <grub/misc.h>
22 #include <grub/extcmd.h>
23 #include <grub/env.h>
24 #include <grub/i18n.h>
25
26 GRUB_MOD_LICENSE ("GPLv3+");
27
28 static grub_extcmd_t cmd_read_byte, cmd_read_word, cmd_read_dword;
29 static grub_command_t cmd_write_byte, cmd_write_word, cmd_write_dword;
30
31 static const struct grub_arg_option options[] =
32 {
33 {0, 'v', 0, N_("Save read value into variable VARNAME."),
34 N_("VARNAME"), ARG_TYPE_STRING},
35 {0, 0, 0, 0, 0, 0}
36 };
37
38
39 static grub_err_t
40 grub_cmd_read (grub_extcmd_context_t ctxt, int argc, char **argv)
41 {
42 grub_addr_t addr;
43 grub_uint32_t value = 0;
44 char buf[sizeof ("XXXXXXXX")];
45
46 if (argc != 1)
47 return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("one argument expected"));
48
49 addr = grub_strtoul (argv[0], 0, 0);
50 switch (ctxt->extcmd->cmd->name[sizeof ("read_") - 1])
51 {
52 case 'd':
53 value = *((volatile grub_uint32_t *) addr);
54 break;
55
56 case 'w':
57 value = *((volatile grub_uint16_t *) addr);
58 break;
59
60 case 'b':
61 value = *((volatile grub_uint8_t *) addr);
62 break;
63 }
64
65 if (ctxt->state[0].set)
66 {
67 grub_snprintf (buf, sizeof (buf), "%x", value);
68 grub_env_set (ctxt->state[0].arg, buf);
69 }
70 else
71 grub_printf ("0x%x\n", value);
72
73 return 0;
74 }
75
76 static grub_err_t
77 grub_cmd_write (grub_command_t cmd, int argc, char **argv)
78 {
79 grub_addr_t addr;
80 grub_uint32_t value;
81 grub_uint32_t mask = 0xffffffff;
82
83 if (argc != 2 && argc != 3)
84 return grub_error (GRUB_ERR_BAD_ARGUMENT, N_("two arguments expected"));
85
86 addr = grub_strtoul (argv[0], 0, 0);
87 value = grub_strtoul (argv[1], 0, 0);
88 if (argc == 3)
89 mask = grub_strtoul (argv[2], 0, 0);
90 value &= mask;
91 switch (cmd->name[sizeof ("write_") - 1])
92 {
93 case 'd':
94 if (mask != 0xffffffff)
95 *((volatile grub_uint32_t *) addr)
96 = (*((volatile grub_uint32_t *) addr) & ~mask) | value;
97 else
98 *((volatile grub_uint32_t *) addr) = value;
99 break;
100
101 case 'w':
102 if ((mask & 0xffff) != 0xffff)
103 *((volatile grub_uint16_t *) addr)
104 = (*((volatile grub_uint16_t *) addr) & ~mask) | value;
105 else
106 *((volatile grub_uint16_t *) addr) = value;
107 break;
108
109 case 'b':
110 if ((mask & 0xff) != 0xff)
111 *((volatile grub_uint8_t *) addr)
112 = (*((volatile grub_uint8_t *) addr) & ~mask) | value;
113 else
114 *((volatile grub_uint8_t *) addr) = value;
115 break;
116 }
117
118 return 0;
119 }
120
121 GRUB_MOD_INIT(memrw)
122 {
123 cmd_read_byte =
124 grub_register_extcmd ("read_byte", grub_cmd_read, 0,
125 N_("ADDR"), N_("Read 8-bit value from ADDR."),
126 options);
127 cmd_read_word =
128 grub_register_extcmd ("read_word", grub_cmd_read, 0,
129 N_("ADDR"), N_("Read 16-bit value from ADDR."),
130 options);
131 cmd_read_dword =
132 grub_register_extcmd ("read_dword", grub_cmd_read, 0,
133 N_("ADDR"), N_("Read 32-bit value from ADDR."),
134 options);
135 cmd_write_byte =
136 grub_register_command ("write_byte", grub_cmd_write,
137 N_("ADDR VALUE [MASK]"),
138 N_("Write 8-bit VALUE to ADDR."));
139 cmd_write_word =
140 grub_register_command ("write_word", grub_cmd_write,
141 N_("ADDR VALUE [MASK]"),
142 N_("Write 16-bit VALUE to ADDR."));
143 cmd_write_dword =
144 grub_register_command ("write_dword", grub_cmd_write,
145 N_("ADDR VALUE [MASK]"),
146 N_("Write 32-bit VALUE to ADDR."));
147 }
148
149 GRUB_MOD_FINI(memrw)
150 {
151 grub_unregister_extcmd (cmd_read_byte);
152 grub_unregister_extcmd (cmd_read_word);
153 grub_unregister_extcmd (cmd_read_dword);
154 grub_unregister_command (cmd_write_byte);
155 grub_unregister_command (cmd_write_word);
156 grub_unregister_command (cmd_write_dword);
157 }