2 * sparse/check_dma_on_stack.c
4 * Copyright (C) 2009 Dan Carpenter.
6 * Licensed under the Open Software License version 1.1
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},
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},
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},
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},
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},
65 {"qt2_box_get_register", 3},
66 {"qt2_openboxchannel", 2},
67 {"qt_open_channel", 2},
68 {"read_download_mem", 4},
73 {"recv_control_msg", 4},
75 {"__rpipe_get_descr", 1},
76 {"__rpipe_set_descr", 1},
77 {"rt2x00usb_vendor_request", 5},
78 {"s2255_vendor_req", 4},
81 {"__send_control_msg", 4},
82 {"send_control_msg", 4},
84 {"si470x_get_report", 1},
85 {"si470x_set_report", 1},
86 {"sierra_get_swoc_info", 1},
87 {"stk_camera_read_reg", 2},
89 {"ti_command_in_sync", 4},
90 {"ti_command_out_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},
104 {"usb_set_report", 3},
105 {"usb_string_sub", 3},
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},
122 static void match_dma_func(const char *fn
, struct expression
*expr
, void *param
)
124 struct expression
*arg
;
128 arg
= get_argument_from_call_expr(expr
->args
, (int)param
);
129 arg
= strip_expr(arg
);
132 if (arg
->type
== EXPR_PREOP
&& arg
->op
== '&') {
133 if (arg
->unop
->type
!= EXPR_SYMBOL
)
135 name
= get_variable_from_expr(arg
, NULL
);
136 sm_msg("error: doing dma on the stack (%s)", name
);
140 if (arg
->type
!= EXPR_SYMBOL
)
143 if (!sym
|| sym
->type
!= SYM_ARRAY
)
145 name
= get_variable_from_expr(arg
, NULL
);
146 sm_msg("error: doing dma on the stack (%s)", name
);
150 void check_dma_on_stack(int id
)
154 if (option_project
!= PROJ_KERNEL
)
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
);