1*13e8728fSAndroid Build Coastguard Worker /*
2*13e8728fSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*13e8728fSAndroid Build Coastguard Worker *
4*13e8728fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*13e8728fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*13e8728fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*13e8728fSAndroid Build Coastguard Worker *
8*13e8728fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*13e8728fSAndroid Build Coastguard Worker *
10*13e8728fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*13e8728fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*13e8728fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*13e8728fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*13e8728fSAndroid Build Coastguard Worker * limitations under the License.
15*13e8728fSAndroid Build Coastguard Worker */
16*13e8728fSAndroid Build Coastguard Worker
17*13e8728fSAndroid Build Coastguard Worker #include <getopt.h>
18*13e8728fSAndroid Build Coastguard Worker #include <inttypes.h>
19*13e8728fSAndroid Build Coastguard Worker #include <stdint.h>
20*13e8728fSAndroid Build Coastguard Worker #include <stdio.h>
21*13e8728fSAndroid Build Coastguard Worker #include <stdlib.h>
22*13e8728fSAndroid Build Coastguard Worker
23*13e8728fSAndroid Build Coastguard Worker #include "dt_table.h"
24*13e8728fSAndroid Build Coastguard Worker #include "libacpi.h"
25*13e8728fSAndroid Build Coastguard Worker #include "libfdt.h"
26*13e8728fSAndroid Build Coastguard Worker
27*13e8728fSAndroid Build Coastguard Worker struct dump_params {
28*13e8728fSAndroid Build Coastguard Worker const char *img_filename;
29*13e8728fSAndroid Build Coastguard Worker const char *out_filename;
30*13e8728fSAndroid Build Coastguard Worker const char *out_dtb_filename;
31*13e8728fSAndroid Build Coastguard Worker };
32*13e8728fSAndroid Build Coastguard Worker
33*13e8728fSAndroid Build Coastguard Worker static const char short_options[] = "o:b:";
34*13e8728fSAndroid Build Coastguard Worker static struct option options[] = {{"output", required_argument, NULL, 'o'},
35*13e8728fSAndroid Build Coastguard Worker {"dtb", required_argument, NULL, 'b'},
36*13e8728fSAndroid Build Coastguard Worker {0, 0, NULL, 0}};
37*13e8728fSAndroid Build Coastguard Worker
read_fdt_from_image(FILE * img_fp,uint32_t dt_offset,uint32_t dt_size)38*13e8728fSAndroid Build Coastguard Worker static void *read_fdt_from_image(FILE *img_fp,
39*13e8728fSAndroid Build Coastguard Worker uint32_t dt_offset, uint32_t dt_size) {
40*13e8728fSAndroid Build Coastguard Worker void *fdt = NULL;
41*13e8728fSAndroid Build Coastguard Worker
42*13e8728fSAndroid Build Coastguard Worker fdt = malloc(dt_size);
43*13e8728fSAndroid Build Coastguard Worker if (fdt == NULL) {
44*13e8728fSAndroid Build Coastguard Worker fprintf(stderr, "malloc(%" PRIu32 ") failed.\n", dt_size);
45*13e8728fSAndroid Build Coastguard Worker return NULL;
46*13e8728fSAndroid Build Coastguard Worker }
47*13e8728fSAndroid Build Coastguard Worker
48*13e8728fSAndroid Build Coastguard Worker fseek(img_fp, dt_offset, SEEK_SET);
49*13e8728fSAndroid Build Coastguard Worker if (fread(fdt, dt_size, 1, img_fp) == 0) {
50*13e8728fSAndroid Build Coastguard Worker fprintf(stderr, "Read FDT data error.\n");
51*13e8728fSAndroid Build Coastguard Worker
52*13e8728fSAndroid Build Coastguard Worker free(fdt);
53*13e8728fSAndroid Build Coastguard Worker return NULL;
54*13e8728fSAndroid Build Coastguard Worker }
55*13e8728fSAndroid Build Coastguard Worker
56*13e8728fSAndroid Build Coastguard Worker return fdt;
57*13e8728fSAndroid Build Coastguard Worker }
58*13e8728fSAndroid Build Coastguard Worker
write_fdt_to_file(const char * filename,const void * fdt,uint32_t (* get_fdt_size)(const void *))59*13e8728fSAndroid Build Coastguard Worker static int write_fdt_to_file(const char *filename, const void *fdt,
60*13e8728fSAndroid Build Coastguard Worker uint32_t (*get_fdt_size)(const void *)) {
61*13e8728fSAndroid Build Coastguard Worker int ret = -1;
62*13e8728fSAndroid Build Coastguard Worker FILE *out_fp = NULL;
63*13e8728fSAndroid Build Coastguard Worker
64*13e8728fSAndroid Build Coastguard Worker out_fp = fopen(filename, "wb");
65*13e8728fSAndroid Build Coastguard Worker if (!out_fp) {
66*13e8728fSAndroid Build Coastguard Worker fprintf(stderr, "Can not create file: %s\n", filename);
67*13e8728fSAndroid Build Coastguard Worker goto end;
68*13e8728fSAndroid Build Coastguard Worker }
69*13e8728fSAndroid Build Coastguard Worker
70*13e8728fSAndroid Build Coastguard Worker uint32_t fdt_size = get_fdt_size(fdt);
71*13e8728fSAndroid Build Coastguard Worker if (fwrite(fdt, fdt_size, 1, out_fp) < 1) {
72*13e8728fSAndroid Build Coastguard Worker fprintf(stderr, "Write FDT data error.\n");
73*13e8728fSAndroid Build Coastguard Worker goto end;
74*13e8728fSAndroid Build Coastguard Worker }
75*13e8728fSAndroid Build Coastguard Worker
76*13e8728fSAndroid Build Coastguard Worker ret = 0;
77*13e8728fSAndroid Build Coastguard Worker
78*13e8728fSAndroid Build Coastguard Worker end:
79*13e8728fSAndroid Build Coastguard Worker if (out_fp) fclose(out_fp);
80*13e8728fSAndroid Build Coastguard Worker
81*13e8728fSAndroid Build Coastguard Worker return ret;
82*13e8728fSAndroid Build Coastguard Worker }
83*13e8728fSAndroid Build Coastguard Worker
free_fdt(void * fdt)84*13e8728fSAndroid Build Coastguard Worker static void free_fdt(void *fdt) {
85*13e8728fSAndroid Build Coastguard Worker if (fdt == NULL) {
86*13e8728fSAndroid Build Coastguard Worker /* do nothing */
87*13e8728fSAndroid Build Coastguard Worker return;
88*13e8728fSAndroid Build Coastguard Worker }
89*13e8728fSAndroid Build Coastguard Worker
90*13e8728fSAndroid Build Coastguard Worker free(fdt);
91*13e8728fSAndroid Build Coastguard Worker }
92*13e8728fSAndroid Build Coastguard Worker
93*13e8728fSAndroid Build Coastguard Worker
output_prop_int(FILE * out_fp,const char * name,uint32_t value)94*13e8728fSAndroid Build Coastguard Worker static void output_prop_int(FILE *out_fp, const char *name, uint32_t value) {
95*13e8728fSAndroid Build Coastguard Worker fprintf(out_fp, "%20s = %d\n", name, fdt32_to_cpu(value));
96*13e8728fSAndroid Build Coastguard Worker }
97*13e8728fSAndroid Build Coastguard Worker
output_prop_int_cpu(FILE * out_fp,const char * name,uint32_t value)98*13e8728fSAndroid Build Coastguard Worker static void output_prop_int_cpu(FILE *out_fp, const char *name, uint32_t value) {
99*13e8728fSAndroid Build Coastguard Worker fprintf(out_fp, "%20s = %d\n", name, value);
100*13e8728fSAndroid Build Coastguard Worker }
101*13e8728fSAndroid Build Coastguard Worker
output_prop_hex(FILE * out_fp,const char * name,uint32_t value)102*13e8728fSAndroid Build Coastguard Worker static void output_prop_hex(FILE *out_fp, const char *name, uint32_t value) {
103*13e8728fSAndroid Build Coastguard Worker fprintf(out_fp, "%20s = %08x\n", name, fdt32_to_cpu(value));
104*13e8728fSAndroid Build Coastguard Worker }
105*13e8728fSAndroid Build Coastguard Worker
output_prop_str(FILE * out_fp,const char * name,const char * value)106*13e8728fSAndroid Build Coastguard Worker static void output_prop_str(FILE *out_fp, const char *name, const char *value) {
107*13e8728fSAndroid Build Coastguard Worker fprintf(out_fp, "%20s = %s\n", name, value);
108*13e8728fSAndroid Build Coastguard Worker }
109*13e8728fSAndroid Build Coastguard Worker
output_table_header(FILE * out_fp,const struct dt_table_header * header)110*13e8728fSAndroid Build Coastguard Worker static void output_table_header(FILE *out_fp, const struct dt_table_header *header) {
111*13e8728fSAndroid Build Coastguard Worker fprintf(out_fp, "dt_table_header:\n");
112*13e8728fSAndroid Build Coastguard Worker output_prop_hex(out_fp, "magic", header->magic);
113*13e8728fSAndroid Build Coastguard Worker output_prop_int(out_fp, "total_size", header->total_size);
114*13e8728fSAndroid Build Coastguard Worker output_prop_int(out_fp, "header_size", header->header_size);
115*13e8728fSAndroid Build Coastguard Worker output_prop_int(out_fp, "dt_entry_size", header->dt_entry_size);
116*13e8728fSAndroid Build Coastguard Worker output_prop_int(out_fp, "dt_entry_count", header->dt_entry_count);
117*13e8728fSAndroid Build Coastguard Worker output_prop_int(out_fp, "dt_entries_offset", header->dt_entries_offset);
118*13e8728fSAndroid Build Coastguard Worker output_prop_int(out_fp, "page_size", header->page_size);
119*13e8728fSAndroid Build Coastguard Worker output_prop_int(out_fp, "version", header->version);
120*13e8728fSAndroid Build Coastguard Worker }
121*13e8728fSAndroid Build Coastguard Worker
output_table_entry(FILE * out_fp,int index,const struct dt_table_entry * entry)122*13e8728fSAndroid Build Coastguard Worker static void output_table_entry(FILE *out_fp, int index, const struct dt_table_entry *entry) {
123*13e8728fSAndroid Build Coastguard Worker fprintf(out_fp, "dt_table_entry[%d]:\n", index);
124*13e8728fSAndroid Build Coastguard Worker output_prop_int(out_fp, "dt_size", entry->dt_size);
125*13e8728fSAndroid Build Coastguard Worker output_prop_int(out_fp, "dt_offset", entry->dt_offset);
126*13e8728fSAndroid Build Coastguard Worker output_prop_hex(out_fp, "id", entry->id);
127*13e8728fSAndroid Build Coastguard Worker output_prop_hex(out_fp, "rev", entry->rev);
128*13e8728fSAndroid Build Coastguard Worker output_prop_hex(out_fp, "custom[0]", entry->custom[0]);
129*13e8728fSAndroid Build Coastguard Worker output_prop_hex(out_fp, "custom[1]", entry->custom[1]);
130*13e8728fSAndroid Build Coastguard Worker output_prop_hex(out_fp, "custom[2]", entry->custom[2]);
131*13e8728fSAndroid Build Coastguard Worker output_prop_hex(out_fp, "custom[3]", entry->custom[3]);
132*13e8728fSAndroid Build Coastguard Worker }
133*13e8728fSAndroid Build Coastguard Worker
output_fdt_info(FILE * out_fp,void * fdt,uint32_t (* get_fdt_size)(const void *))134*13e8728fSAndroid Build Coastguard Worker static int output_fdt_info(FILE *out_fp, void *fdt,
135*13e8728fSAndroid Build Coastguard Worker uint32_t (*get_fdt_size)(const void *)) {
136*13e8728fSAndroid Build Coastguard Worker uint32_t fdt_size = get_fdt_size(fdt);
137*13e8728fSAndroid Build Coastguard Worker
138*13e8728fSAndroid Build Coastguard Worker output_prop_int_cpu(out_fp, "(FDT)size", fdt_size);
139*13e8728fSAndroid Build Coastguard Worker
140*13e8728fSAndroid Build Coastguard Worker int root_node_off = fdt_path_offset(fdt, "/");
141*13e8728fSAndroid Build Coastguard Worker if (root_node_off < 0) {
142*13e8728fSAndroid Build Coastguard Worker fprintf(stderr, "Can not get the root node.\n");
143*13e8728fSAndroid Build Coastguard Worker return -1;
144*13e8728fSAndroid Build Coastguard Worker }
145*13e8728fSAndroid Build Coastguard Worker
146*13e8728fSAndroid Build Coastguard Worker const char *compatible =
147*13e8728fSAndroid Build Coastguard Worker (const char *)fdt_getprop(fdt, root_node_off, "compatible", NULL);
148*13e8728fSAndroid Build Coastguard Worker output_prop_str(out_fp, "(FDT)compatible", compatible ? compatible : "(unknown)");
149*13e8728fSAndroid Build Coastguard Worker
150*13e8728fSAndroid Build Coastguard Worker return 0;
151*13e8728fSAndroid Build Coastguard Worker }
152*13e8728fSAndroid Build Coastguard Worker
get_acpi_file_size(const void * acpi)153*13e8728fSAndroid Build Coastguard Worker static inline uint32_t get_acpi_file_size(const void *acpi) {
154*13e8728fSAndroid Build Coastguard Worker return acpi_length(acpi);
155*13e8728fSAndroid Build Coastguard Worker }
156*13e8728fSAndroid Build Coastguard Worker
get_fdt_file_size(const void * fdt)157*13e8728fSAndroid Build Coastguard Worker static inline uint32_t get_fdt_file_size(const void *fdt) {
158*13e8728fSAndroid Build Coastguard Worker return fdt_totalsize(fdt);
159*13e8728fSAndroid Build Coastguard Worker }
160*13e8728fSAndroid Build Coastguard Worker
dump_image_from_fp(FILE * out_fp,FILE * img_fp,const struct dump_params * params)161*13e8728fSAndroid Build Coastguard Worker static int dump_image_from_fp(FILE *out_fp, FILE *img_fp,
162*13e8728fSAndroid Build Coastguard Worker const struct dump_params *params) {
163*13e8728fSAndroid Build Coastguard Worker struct dt_table_header header;
164*13e8728fSAndroid Build Coastguard Worker if (fread(&header, sizeof(header), 1, img_fp) != 1) {
165*13e8728fSAndroid Build Coastguard Worker fprintf(stderr, "Read error.\n");
166*13e8728fSAndroid Build Coastguard Worker return -1;
167*13e8728fSAndroid Build Coastguard Worker }
168*13e8728fSAndroid Build Coastguard Worker /* TODO: check header */
169*13e8728fSAndroid Build Coastguard Worker output_table_header(out_fp, &header);
170*13e8728fSAndroid Build Coastguard Worker
171*13e8728fSAndroid Build Coastguard Worker uint32_t (*get_fdt_size)(const void *);
172*13e8728fSAndroid Build Coastguard Worker uint32_t entry_magic = fdt32_to_cpu(header.magic);
173*13e8728fSAndroid Build Coastguard Worker if (entry_magic == ACPI_TABLE_MAGIC)
174*13e8728fSAndroid Build Coastguard Worker get_fdt_size = get_acpi_file_size;
175*13e8728fSAndroid Build Coastguard Worker else
176*13e8728fSAndroid Build Coastguard Worker get_fdt_size = get_fdt_file_size;
177*13e8728fSAndroid Build Coastguard Worker
178*13e8728fSAndroid Build Coastguard Worker uint32_t entry_size = fdt32_to_cpu(header.dt_entry_size);
179*13e8728fSAndroid Build Coastguard Worker uint32_t entry_offset = fdt32_to_cpu(header.dt_entries_offset);
180*13e8728fSAndroid Build Coastguard Worker uint32_t entry_count = fdt32_to_cpu(header.dt_entry_count);
181*13e8728fSAndroid Build Coastguard Worker uint32_t i;
182*13e8728fSAndroid Build Coastguard Worker for (i = 0; i < entry_count; i++) {
183*13e8728fSAndroid Build Coastguard Worker struct dt_table_entry entry;
184*13e8728fSAndroid Build Coastguard Worker fseek(img_fp, entry_offset, SEEK_SET);
185*13e8728fSAndroid Build Coastguard Worker if (fread(&entry, sizeof(entry), 1, img_fp) != 1) {
186*13e8728fSAndroid Build Coastguard Worker fprintf(stderr, "Read dt_table_entry error.\n");
187*13e8728fSAndroid Build Coastguard Worker return -1;
188*13e8728fSAndroid Build Coastguard Worker }
189*13e8728fSAndroid Build Coastguard Worker output_table_entry(out_fp, i, &entry);
190*13e8728fSAndroid Build Coastguard Worker
191*13e8728fSAndroid Build Coastguard Worker uint32_t dt_size = fdt32_to_cpu(entry.dt_size);
192*13e8728fSAndroid Build Coastguard Worker uint32_t dt_offset = fdt32_to_cpu(entry.dt_offset);
193*13e8728fSAndroid Build Coastguard Worker if (dt_size > 0 && dt_offset > 0) {
194*13e8728fSAndroid Build Coastguard Worker void *fdt = read_fdt_from_image(img_fp, dt_offset, dt_size);
195*13e8728fSAndroid Build Coastguard Worker if (fdt) {
196*13e8728fSAndroid Build Coastguard Worker output_fdt_info(out_fp, fdt, get_fdt_size);
197*13e8728fSAndroid Build Coastguard Worker
198*13e8728fSAndroid Build Coastguard Worker if (params->out_dtb_filename != NULL) {
199*13e8728fSAndroid Build Coastguard Worker char filename[256];
200*13e8728fSAndroid Build Coastguard Worker snprintf(filename, sizeof(filename), "%s.%d",
201*13e8728fSAndroid Build Coastguard Worker params->out_dtb_filename, i);
202*13e8728fSAndroid Build Coastguard Worker write_fdt_to_file(filename, fdt, get_fdt_size);
203*13e8728fSAndroid Build Coastguard Worker }
204*13e8728fSAndroid Build Coastguard Worker
205*13e8728fSAndroid Build Coastguard Worker free_fdt(fdt);
206*13e8728fSAndroid Build Coastguard Worker }
207*13e8728fSAndroid Build Coastguard Worker }
208*13e8728fSAndroid Build Coastguard Worker
209*13e8728fSAndroid Build Coastguard Worker entry_offset += entry_size;
210*13e8728fSAndroid Build Coastguard Worker }
211*13e8728fSAndroid Build Coastguard Worker
212*13e8728fSAndroid Build Coastguard Worker return 0;
213*13e8728fSAndroid Build Coastguard Worker }
214*13e8728fSAndroid Build Coastguard Worker
process_command_dump(const struct dump_params * params)215*13e8728fSAndroid Build Coastguard Worker static int process_command_dump(const struct dump_params *params) {
216*13e8728fSAndroid Build Coastguard Worker int ret = -1;
217*13e8728fSAndroid Build Coastguard Worker FILE *out_fp = NULL;
218*13e8728fSAndroid Build Coastguard Worker FILE *img_fp = NULL;
219*13e8728fSAndroid Build Coastguard Worker
220*13e8728fSAndroid Build Coastguard Worker img_fp = fopen(params->img_filename, "rb");
221*13e8728fSAndroid Build Coastguard Worker if (img_fp == NULL) {
222*13e8728fSAndroid Build Coastguard Worker fprintf(stderr, "Can not open image file: %s\n", params->img_filename);
223*13e8728fSAndroid Build Coastguard Worker goto end;
224*13e8728fSAndroid Build Coastguard Worker }
225*13e8728fSAndroid Build Coastguard Worker
226*13e8728fSAndroid Build Coastguard Worker if (params->out_filename != NULL) {
227*13e8728fSAndroid Build Coastguard Worker out_fp = fopen(params->out_filename, "w");
228*13e8728fSAndroid Build Coastguard Worker if (out_fp == NULL) {
229*13e8728fSAndroid Build Coastguard Worker fprintf(stderr, "Can not create file: %s\n", params->out_filename);
230*13e8728fSAndroid Build Coastguard Worker goto end;
231*13e8728fSAndroid Build Coastguard Worker }
232*13e8728fSAndroid Build Coastguard Worker }
233*13e8728fSAndroid Build Coastguard Worker
234*13e8728fSAndroid Build Coastguard Worker ret = dump_image_from_fp(out_fp ? out_fp : stdout, img_fp, params);
235*13e8728fSAndroid Build Coastguard Worker
236*13e8728fSAndroid Build Coastguard Worker end:
237*13e8728fSAndroid Build Coastguard Worker if (img_fp) fclose(img_fp);
238*13e8728fSAndroid Build Coastguard Worker if (out_fp) fclose(out_fp);
239*13e8728fSAndroid Build Coastguard Worker
240*13e8728fSAndroid Build Coastguard Worker return ret;
241*13e8728fSAndroid Build Coastguard Worker }
242*13e8728fSAndroid Build Coastguard Worker
handle_usage_dump(FILE * out_fp,const char * prog_name)243*13e8728fSAndroid Build Coastguard Worker void handle_usage_dump(FILE *out_fp, const char *prog_name) {
244*13e8728fSAndroid Build Coastguard Worker fprintf(out_fp, " %s dump <image_file> (<option>...)\n\n", prog_name);
245*13e8728fSAndroid Build Coastguard Worker fprintf(out_fp,
246*13e8728fSAndroid Build Coastguard Worker " options:\n"
247*13e8728fSAndroid Build Coastguard Worker " -o, --output <filename> Output file name.\n"
248*13e8728fSAndroid Build Coastguard Worker " Default is output to stdout.\n"
249*13e8728fSAndroid Build Coastguard Worker " -b, --dtb <filename> Dump dtb/dtbo files from image.\n"
250*13e8728fSAndroid Build Coastguard Worker " Will output to <filename>.0, <filename>.1, etc.\n");
251*13e8728fSAndroid Build Coastguard Worker }
252*13e8728fSAndroid Build Coastguard Worker
handle_command_dump(int argc,char * argv[],int arg_start)253*13e8728fSAndroid Build Coastguard Worker int handle_command_dump(int argc, char *argv[], int arg_start) {
254*13e8728fSAndroid Build Coastguard Worker if (argc - arg_start < 1) {
255*13e8728fSAndroid Build Coastguard Worker handle_usage_dump(stderr, argv[0]);
256*13e8728fSAndroid Build Coastguard Worker return 1;
257*13e8728fSAndroid Build Coastguard Worker }
258*13e8728fSAndroid Build Coastguard Worker
259*13e8728fSAndroid Build Coastguard Worker struct dump_params params;
260*13e8728fSAndroid Build Coastguard Worker memset(¶ms, 0, sizeof(params));
261*13e8728fSAndroid Build Coastguard Worker params.img_filename = argv[arg_start];
262*13e8728fSAndroid Build Coastguard Worker
263*13e8728fSAndroid Build Coastguard Worker optind = arg_start + 1;
264*13e8728fSAndroid Build Coastguard Worker while (1) {
265*13e8728fSAndroid Build Coastguard Worker int c = getopt_long(argc, argv, short_options, options, NULL);
266*13e8728fSAndroid Build Coastguard Worker if (c == -1) {
267*13e8728fSAndroid Build Coastguard Worker break;
268*13e8728fSAndroid Build Coastguard Worker }
269*13e8728fSAndroid Build Coastguard Worker switch (c) {
270*13e8728fSAndroid Build Coastguard Worker case 'o':
271*13e8728fSAndroid Build Coastguard Worker params.out_filename = optarg;
272*13e8728fSAndroid Build Coastguard Worker break;
273*13e8728fSAndroid Build Coastguard Worker case 'b':
274*13e8728fSAndroid Build Coastguard Worker params.out_dtb_filename = optarg;
275*13e8728fSAndroid Build Coastguard Worker break;
276*13e8728fSAndroid Build Coastguard Worker default:
277*13e8728fSAndroid Build Coastguard Worker /* Unknown option, return error */
278*13e8728fSAndroid Build Coastguard Worker return 1;
279*13e8728fSAndroid Build Coastguard Worker }
280*13e8728fSAndroid Build Coastguard Worker }
281*13e8728fSAndroid Build Coastguard Worker
282*13e8728fSAndroid Build Coastguard Worker return process_command_dump(¶ms);
283*13e8728fSAndroid Build Coastguard Worker }
284