trace_params.pl: rewrote so it's faster
[smatch.git] / check_dma_on_stack.c
blob0ce2ecfa5d10314c1c962203c57bca9546f32e03
1 /*
2 * sparse/check_dma_on_stack.c
4 * Copyright (C) 2009 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
8 */
10 #include "smatch.h"
12 static int my_id;
14 struct {
15 const char *name;
16 int param;
17 } dma_funcs[] = {
18 {"acm_ctrl_msg", 3},
19 {"aiptek_get_report", 3},
20 {"aiptek_set_report", 3},
21 {"alauda_get_media_signatures", 1},
22 {"alauda_get_media_status", 1},
23 {"ark3116_read_reg", 2},
24 {"at76_dfu_get_state", 1},
25 {"at76_dfu_get_status", 1},
26 {"at76_load_int_fw_block", 2},
27 {"BoxGetRegister", 3},
28 {"catc_ctrl_msg", 5},
29 {"ch341_control_in", 4},
30 {"cpia2_usb_transfer_cmd", 1},
31 {"cpia_usb_transferCmd", 2},
32 {"dib0700_ctrl_rd", 3},
33 {"dib0700_ctrl_wr", 1},
34 {"dtv5100_i2c_msg", 4},
35 {"flexcop_usb_i2c_req", 5},
36 {"flexcop_usb_i2c_request", 4},
37 {"flexcop_usb_readwrite_dw", 2},
38 {"flexcop_usb_v8_memory_req", 4},
39 {"get_descriptor_addr", 2},
40 {"get_hub_descriptor", 1},
41 {"get_hub_status", 1},
42 {"get_manuf_info", 1},
43 {"get_port_status", 2},
44 {"get_registers", 3},
45 {"gl861_i2c_msg", 4},
46 {"go7007_usb_vendor_request", 4},
47 {"gp8psk_usb_in_op", 4},
48 {"gp8psk_usb_out_op", 4},
49 {"hid_get_class_descriptor", 3},
50 {"__hwahc_op_mmcie_add", 4},
51 {"hwarc_cmd", 1},
52 {"klsi_105_chg_port_settings", 1},
53 {"konicawc_ctrl_msg", 5},
54 {"line6_read_data", 2},
55 {"line6_read_serial_number", 1},
56 {"line6_write_data", 2},
57 {"mcs_get_reg", 2},
58 {"mct_u232_get_modem_stat", 1},
59 {"mos7840_get_reg_sync", 2},
60 {"mos7840_get_uart_reg", 2},
61 {"nc_vendor_read", 3},
62 {"PIPEnsControlOutAsyn", 5},
63 {"pl2303_vendor_read", 3},
64 {"qcm_stv_getw", 2},
65 {"qt2_box_get_register", 3},
66 {"qt2_openboxchannel", 2},
67 {"qt_open_channel", 2},
68 {"read_download_mem", 4},
69 {"read_packet", 2},
70 {"ReadPacket", 2},
71 {"read_ram", 3},
72 {"read_rom", 3},
73 {"recv_control_msg", 4},
74 {"rndis_command", 1},
75 {"__rpipe_get_descr", 1},
76 {"__rpipe_set_descr", 1},
77 {"rt2x00usb_vendor_request", 5},
78 {"s2255_vendor_req", 4},
79 {"se401_sndctrl", 4},
80 {"send_cmd", 4},
81 {"__send_control_msg", 4},
82 {"send_control_msg", 4},
83 {"set_registers", 3},
84 {"si470x_get_report", 1},
85 {"si470x_set_report", 1},
86 {"sierra_get_swoc_info", 1},
87 {"stk_camera_read_reg", 2},
88 {"stv_sndctrl", 4},
89 {"ti_command_in_sync", 4},
90 {"ti_command_out_sync", 4},
91 {"ti_vread_sync", 4},
92 {"ti_vsend_sync", 4},
93 {"usb_control_msg", 6},
94 {"usb_cypress_writemem", 2},
95 {"usbduxfastsub_upload", 1},
96 {"usbduxsub_upload", 1},
97 {"usb_get_descriptor", 3},
98 {"usb_get_langid", 1},
99 {"usb_get_report", 3},
100 {"usb_get_report", 4},
101 {"usb_get_string", 3},
102 {"usblp_ctrl_msg", 6},
103 {"usb_read", 4},
104 {"usb_set_report", 3},
105 {"usb_string_sub", 3},
106 {"usb_write", 4},
107 {"__uvc_query_ctrl", 5},
108 {"uvc_query_ctrl", 5},
109 {"vendor_command", 4},
110 {"vp702x_usb_in_op", 4},
111 {"vp702x_usb_inout_op", 1},
112 {"vp702x_usb_inout_op", 3},
113 {"vp702x_usb_out_op", 4},
114 {"w9968cf_write_fsb", 1},
115 {"write_i2c_mem", 4},
116 {"write_packet", 2},
117 {"WritePacket", 2},
118 {"write_rom", 3},
119 {"yealink_cmd", 1},
122 static void match_dma_func(const char *fn, struct expression *expr, void *param)
124 struct expression *arg;
125 struct symbol *sym;
126 char *name;
128 arg = get_argument_from_call_expr(expr->args, (int)param);
129 arg = strip_expr(arg);
130 if (!arg)
131 return;
132 if (arg->type == EXPR_PREOP && arg->op == '&') {
133 if (arg->unop->type != EXPR_SYMBOL)
134 return;
135 name = get_variable_from_expr(arg, NULL);
136 sm_msg("error: doing dma on the stack (%s)", name);
137 free_string(name);
138 return;
140 if (arg->type != EXPR_SYMBOL)
141 return;
142 sym = get_type(arg);
143 if (!sym || sym->type != SYM_ARRAY)
144 return;
145 name = get_variable_from_expr(arg, NULL);
146 sm_msg("error: doing dma on the stack (%s)", name);
147 free_string(name);
150 void check_dma_on_stack(int id)
152 int i;
154 if (option_project != PROJ_KERNEL)
155 return;
156 my_id = id;
157 for (i = 0; i < ARRAY_SIZE(dma_funcs); i++) {
158 add_function_hook(dma_funcs[i].name, &match_dma_func,
159 (void *)dma_funcs[i].param);