* [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized).
@ 2012-12-12 9:48 Chen Gang
2012-12-12 10:02 ` Chen Gang
0 siblings, 1 reply; 10+ messages in thread
From: Chen Gang @ 2012-12-12 9:48 UTC (permalink / raw)
To: omar.ramirez; +Cc: linux-kernel
Hello Omar Ramirez Luna:
in drivers/staging/tidspbridge/core/io_sm.c:
it is for function dump_dsp_stack.
"char name[256]" is not initialized. (line 1898)
name is as out buf for node_find_addr (line 2021..2024, 2066..2071, 2098..2103)
if node_find_addr fails, pr_err may cause issue (name may not be initialized)
in drivers/staging/tidspbridge/rmgr/node.c:
function node_find_addr can be called by dump_dsp_stack.
param sym_name is as out buf which may be not initialized.
so pr_debug may cause issue (print sym_name).
in drivers/staging/tidspbridge/rmgr/nldr.c:
function nldr_find_addr can be called by node_find_addr
param sym_name is as out buf which may be not initialized.
so pr_debug may cause issue (print sym_name).
please help checking, thanks.
gchen.
in drivers/staging/tidspbridge/rmgr/nldr.c:
1798 int nldr_find_addr(struct nldr_nodeobject *nldr_node, u32 sym_addr,
1799 u32 offset_range, void *offset_output, char *sym_name)
1800 {
1801 int status = 0;
1802 bool status1 = false;
1803 s32 i = 0;
1804 struct lib_node root = { NULL, 0, NULL };
1805 pr_debug("%s(0x%x, 0x%x, 0x%x, 0x%x, %s)\n", __func__, (u32) nldr_node,
1806 sym_addr, offset_range, (u32) offset_output, sym_name);
1807
...
in drivers/staging/tidspbridge/rmgr/node.c:
3009 int node_find_addr(struct node_mgr *node_mgr, u32 sym_addr,
3010 u32 offset_range, void *sym_addr_output, char *sym_name)
3011 {
3012 struct node_object *node_obj;
3013 int status = -ENOENT;
3014
3015 pr_debug("%s(0x%x, 0x%x, 0x%x, 0x%x, %s)\n", __func__,
3016 (unsigned int) node_mgr,
3017 sym_addr, offset_range,
3018 (unsigned int) sym_addr_output, sym_name);
3019
3020 list_for_each_entry(node_obj, &node_mgr->node_list, list_elem) {
3021 status = nldr_find_addr(node_obj->nldr_node_obj, sym_addr,
3022 offset_range, sym_addr_output, sym_name);
3023 if (!status)
3024 break;
3025 }
3026
3027 return status;
3028 }
in drivers/staging/tidspbridge/core/io_sm.c:
1892 int dump_dsp_stack(struct bridge_dev_context *bridge_context)
1893 {
1894 int status = 0;
1895 struct cod_manager *code_mgr;
1896 struct node_mgr *node_mgr;
1897 u32 trace_begin;
1898 char name[256];
1899 struct {
1900 u32 head[2];
1901 u32 size;
1902 } mmu_fault_dbg_info;
1903 u32 *buffer;
1904 u32 *buffer_beg;
1905 u32 *buffer_end;
1906 u32 exc_type;
1907 u32 dyn_ext_base;
1908 u32 i;
1909 u32 offset_output;
1910 u32 total_size;
1911 u32 poll_cnt;
1912 const char *dsp_regs[] = {"EFR", "IERR", "ITSR", "NTSR",
1913 "IRP", "NRP", "AMR", "SSR",
1914 "ILC", "RILC", "IER", "CSR"};
1915 const char *exec_ctxt[] = {"Task", "SWI", "HWI", "Unknown"};
1916 struct bridge_drv_interface *intf_fxns;
1917 struct dev_object *dev_object = bridge_context->dev_obj;
1918
1919 status = dev_get_cod_mgr(dev_object, &code_mgr);
1920 if (!code_mgr) {
1921 pr_debug("%s: Failed on dev_get_cod_mgr.\n", __func__);
1922 status = -EFAULT;
1923 }
1924
1925 if (!status) {
1926 status = dev_get_node_manager(dev_object, &node_mgr);
1927 if (!node_mgr) {
1928 pr_debug("%s: Failed on dev_get_node_manager.\n",
1929 __func__);
1930 status = -EFAULT;
1931 }
1932 }
1933
1934 if (!status) {
1935 /* Look for SYS_PUTCBEG/SYS_PUTCEND: */
1936 status =
1937 cod_get_sym_value(code_mgr, COD_TRACEBEG, &trace_begin);
1938 pr_debug("%s: trace_begin Value 0x%x\n",
1939 __func__, trace_begin);
1940 if (status)
1941 pr_debug("%s: Failed on cod_get_sym_value.\n",
1942 __func__);
1943 }
1944 if (!status)
1945 status = dev_get_intf_fxns(dev_object, &intf_fxns);
1946 /*
1947 * Check for the "magic number" in the trace buffer. If it has
1948 * yet to appear then poll the trace buffer to wait for it. Its
1949 * appearance signals that the DSP has finished dumping its state.
1950 */
1951 mmu_fault_dbg_info.head[0] = 0;
1952 mmu_fault_dbg_info.head[1] = 0;
1953 if (!status) {
1954 poll_cnt = 0;
1955 while ((mmu_fault_dbg_info.head[0] != MMU_FAULT_HEAD1 ||
1956 mmu_fault_dbg_info.head[1] != MMU_FAULT_HEAD2) &&
1957 poll_cnt < POLL_MAX) {
1958
1959 /* Read DSP dump size from the DSP trace buffer... */
1960 status = (*intf_fxns->brd_read)(bridge_context,
1961 (u8 *)&mmu_fault_dbg_info, (u32)trace_begin,
1962 sizeof(mmu_fault_dbg_info), 0);
1963
1964 if (status)
1965 break;
1966
1967 poll_cnt++;
1968 }
1969
1970 if (mmu_fault_dbg_info.head[0] != MMU_FAULT_HEAD1 &&
1971 mmu_fault_dbg_info.head[1] != MMU_FAULT_HEAD2) {
1972 status = -ETIME;
1973 pr_err("%s:No DSP MMU-Fault information available.\n",
1974 __func__);
1975 }
1976 }
1977
1978 if (!status) {
1979 total_size = mmu_fault_dbg_info.size;
1980 /* Limit the size in case DSP went crazy */
1981 if (total_size > MAX_MMU_DBGBUFF)
1982 total_size = MAX_MMU_DBGBUFF;
1983
1984 buffer = kzalloc(total_size, GFP_ATOMIC);
1985 if (!buffer) {
1986 status = -ENOMEM;
1987 pr_debug("%s: Failed to "
1988 "allocate stack dump buffer.\n", __func__);
1989 goto func_end;
1990 }
1991
1992 buffer_beg = buffer;
1993 buffer_end = buffer + total_size / 4;
1994
1994
1995 /* Read bytes from the DSP trace buffer... */
1996 status = (*intf_fxns->brd_read)(bridge_context,
1997 (u8 *)buffer, (u32)trace_begin,
1998 total_size, 0);
1999 if (status) {
2000 pr_debug("%s: Failed to Read Trace Buffer.\n",
2001 __func__);
2002 goto func_end;
2003 }
2004
2005 pr_err("\nAproximate Crash Position:\n"
2006 "--------------------------\n");
2007
2008 exc_type = buffer[3];
2009 if (!exc_type)
2010 i = buffer[79]; /* IRP */
2011 else
2012 i = buffer[80]; /* NRP */
2013
2014 status =
2015 cod_get_sym_value(code_mgr, DYNEXTBASE, &dyn_ext_base);
2016 if (status) {
2017 status = -EFAULT;
2018 goto func_end;
2019 }
2020
2021 if ((i > dyn_ext_base) && (node_find_addr(node_mgr, i,
2022 0x1000, &offset_output, name) == 0))
2023 pr_err("0x%-8x [\"%s\" + 0x%x]\n", i, name,
2024 i - offset_output);
2025 else
2026 pr_err("0x%-8x [Unable to match to a symbol.]\n", i);
2027
2028 buffer += 4;
2029
2030 pr_err("\nExecution Info:\n"
2031 "---------------\n");
2032
2033 if (*buffer < ARRAY_SIZE(exec_ctxt)) {
2034 pr_err("Execution context \t%s\n",
2035 exec_ctxt[*buffer++]);
2036 } else {
2037 pr_err("Execution context corrupt\n");
2038 kfree(buffer_beg);
2039 return -EFAULT;
2040 }
2041 pr_err("Task Handle\t\t0x%x\n", *buffer++);
2042 pr_err("Stack Pointer\t\t0x%x\n", *buffer++);
2043 pr_err("Stack Top\t\t0x%x\n", *buffer++);
2044 pr_err("Stack Bottom\t\t0x%x\n", *buffer++);
2045 pr_err("Stack Size\t\t0x%x\n", *buffer++);
2046 pr_err("Stack Size In Use\t0x%x\n", *buffer++);
2047
2048 pr_err("\nCPU Registers\n"
2049 "---------------\n");
2050
2051 for (i = 0; i < 32; i++) {
2052 if (i == 4 || i == 6 || i == 8)
2053 pr_err("A%d 0x%-8x [Function Argument %d]\n",
2054 i, *buffer++, i-3);
2055 else if (i == 15)
2056 pr_err("A15 0x%-8x [Frame Pointer]\n",
2057 *buffer++);
2058 else
2059 pr_err("A%d 0x%x\n", i, *buffer++);
2060 }
2061
2062 pr_err("\nB0 0x%x\n", *buffer++);
2063 pr_err("B1 0x%x\n", *buffer++);
2064 pr_err("B2 0x%x\n", *buffer++);
2065
2066 if ((*buffer > dyn_ext_base) && (node_find_addr(node_mgr,
2067 *buffer, 0x1000, &offset_output, name) == 0))
2068
2069 pr_err("B3 0x%-8x [Function Return Pointer:"
2070 " \"%s\" + 0x%x]\n", *buffer, name,
2071 *buffer - offset_output);
2072 else
2073 pr_err("B3 0x%-8x [Function Return Pointer:"
2074 "Unable to match to a symbol.]\n", *buffer);
2075
2076 buffer++;
2077
2078 for (i = 4; i < 32; i++) {
2079 if (i == 4 || i == 6 || i == 8)
2080 pr_err("B%d 0x%-8x [Function Argument %d]\n",
2081 i, *buffer++, i-2);
2082 else if (i == 14)
2083 pr_err("B14 0x%-8x [Data Page Pointer]\n",
2084 *buffer++);
2085 else
2086 pr_err("B%d 0x%x\n", i, *buffer++);
2087 }
2088
2089 pr_err("\n");
2090
2091 for (i = 0; i < ARRAY_SIZE(dsp_regs); i++)
2092 pr_err("%s 0x%x\n", dsp_regs[i], *buffer++);
2093
2094 pr_err("\nStack:\n"
2095 "------\n");
2096
2097 for (i = 0; buffer < buffer_end; i++, buffer++) {
2098 if ((*buffer > dyn_ext_base) && (
2099 node_find_addr(node_mgr, *buffer , 0x600,
2100 &offset_output, name) == 0))
2101 pr_err("[%d] 0x%-8x [\"%s\" + 0x%x]\n",
2102 i, *buffer, name,
2103 *buffer - offset_output);
2104 else
2105 pr_err("[%d] 0x%x\n", i, *buffer);
2106 }
2107 kfree(buffer_beg);
2108 }
2109 func_end:
2110 return status;
2111 }
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized).
2012-12-12 9:48 [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized) Chen Gang
@ 2012-12-12 10:02 ` Chen Gang
2012-12-12 10:12 ` Fwd: " Chen Gang
0 siblings, 1 reply; 10+ messages in thread
From: Chen Gang @ 2012-12-12 10:02 UTC (permalink / raw)
To: omar.ramirez; +Cc: linux-kernel
于 2012年12月12日 17:48, Chen Gang 写道:
> Hello Omar Ramirez Luna:
>
> in drivers/staging/tidspbridge/core/io_sm.c:
> it is for function dump_dsp_stack.
> "char name[256]" is not initialized. (line 1898)
> name is as out buf for node_find_addr (line 2021..2024, 2066..2071, 2098..2103)
> if node_find_addr fails, pr_err may cause issue (name may not be initialized)
oh sorry, pr_err no issue (it is my fault).
>
> in drivers/staging/tidspbridge/rmgr/node.c:
> function node_find_addr can be called by dump_dsp_stack.
> param sym_name is as out buf which may be not initialized.
> so pr_debug may cause issue (print sym_name).
>
> in drivers/staging/tidspbridge/rmgr/nldr.c:
> function nldr_find_addr can be called by node_find_addr
> param sym_name is as out buf which may be not initialized.
> so pr_debug may cause issue (print sym_name).
>
but they are still have issue.
I find by code review, please help check whether this suggestion is valid.
thanks.
> please help checking, thanks.
>
> gchen.
>
>
> in drivers/staging/tidspbridge/rmgr/nldr.c:
>
> 1798 int nldr_find_addr(struct nldr_nodeobject *nldr_node, u32 sym_addr,
> 1799 u32 offset_range, void *offset_output, char *sym_name)
> 1800 {
> 1801 int status = 0;
> 1802 bool status1 = false;
> 1803 s32 i = 0;
> 1804 struct lib_node root = { NULL, 0, NULL };
> 1805 pr_debug("%s(0x%x, 0x%x, 0x%x, 0x%x, %s)\n", __func__, (u32) nldr_node,
> 1806 sym_addr, offset_range, (u32) offset_output, sym_name);
> 1807
> ...
>
>
> in drivers/staging/tidspbridge/rmgr/node.c:
>
> 3009 int node_find_addr(struct node_mgr *node_mgr, u32 sym_addr,
> 3010 u32 offset_range, void *sym_addr_output, char *sym_name)
> 3011 {
> 3012 struct node_object *node_obj;
> 3013 int status = -ENOENT;
> 3014
> 3015 pr_debug("%s(0x%x, 0x%x, 0x%x, 0x%x, %s)\n", __func__,
> 3016 (unsigned int) node_mgr,
> 3017 sym_addr, offset_range,
> 3018 (unsigned int) sym_addr_output, sym_name);
> 3019
> 3020 list_for_each_entry(node_obj, &node_mgr->node_list, list_elem) {
> 3021 status = nldr_find_addr(node_obj->nldr_node_obj, sym_addr,
> 3022 offset_range, sym_addr_output, sym_name);
> 3023 if (!status)
> 3024 break;
> 3025 }
> 3026
> 3027 return status;
> 3028 }
>
>
>
>
> in drivers/staging/tidspbridge/core/io_sm.c:
>
> 1892 int dump_dsp_stack(struct bridge_dev_context *bridge_context)
> 1893 {
> 1894 int status = 0;
> 1895 struct cod_manager *code_mgr;
> 1896 struct node_mgr *node_mgr;
> 1897 u32 trace_begin;
> 1898 char name[256];
> 1899 struct {
> 1900 u32 head[2];
> 1901 u32 size;
> 1902 } mmu_fault_dbg_info;
> 1903 u32 *buffer;
> 1904 u32 *buffer_beg;
> 1905 u32 *buffer_end;
> 1906 u32 exc_type;
> 1907 u32 dyn_ext_base;
> 1908 u32 i;
> 1909 u32 offset_output;
> 1910 u32 total_size;
> 1911 u32 poll_cnt;
> 1912 const char *dsp_regs[] = {"EFR", "IERR", "ITSR", "NTSR",
> 1913 "IRP", "NRP", "AMR", "SSR",
> 1914 "ILC", "RILC", "IER", "CSR"};
> 1915 const char *exec_ctxt[] = {"Task", "SWI", "HWI", "Unknown"};
> 1916 struct bridge_drv_interface *intf_fxns;
> 1917 struct dev_object *dev_object = bridge_context->dev_obj;
> 1918
> 1919 status = dev_get_cod_mgr(dev_object, &code_mgr);
> 1920 if (!code_mgr) {
> 1921 pr_debug("%s: Failed on dev_get_cod_mgr.\n", __func__);
> 1922 status = -EFAULT;
> 1923 }
> 1924
> 1925 if (!status) {
> 1926 status = dev_get_node_manager(dev_object, &node_mgr);
> 1927 if (!node_mgr) {
> 1928 pr_debug("%s: Failed on dev_get_node_manager.\n",
> 1929 __func__);
> 1930 status = -EFAULT;
> 1931 }
> 1932 }
> 1933
> 1934 if (!status) {
> 1935 /* Look for SYS_PUTCBEG/SYS_PUTCEND: */
> 1936 status =
> 1937 cod_get_sym_value(code_mgr, COD_TRACEBEG, &trace_begin);
> 1938 pr_debug("%s: trace_begin Value 0x%x\n",
> 1939 __func__, trace_begin);
> 1940 if (status)
> 1941 pr_debug("%s: Failed on cod_get_sym_value.\n",
> 1942 __func__);
> 1943 }
> 1944 if (!status)
> 1945 status = dev_get_intf_fxns(dev_object, &intf_fxns);
> 1946 /*
> 1947 * Check for the "magic number" in the trace buffer. If it has
> 1948 * yet to appear then poll the trace buffer to wait for it. Its
> 1949 * appearance signals that the DSP has finished dumping its state.
> 1950 */
> 1951 mmu_fault_dbg_info.head[0] = 0;
> 1952 mmu_fault_dbg_info.head[1] = 0;
> 1953 if (!status) {
> 1954 poll_cnt = 0;
> 1955 while ((mmu_fault_dbg_info.head[0] != MMU_FAULT_HEAD1 ||
> 1956 mmu_fault_dbg_info.head[1] != MMU_FAULT_HEAD2) &&
> 1957 poll_cnt < POLL_MAX) {
> 1958
> 1959 /* Read DSP dump size from the DSP trace buffer... */
> 1960 status = (*intf_fxns->brd_read)(bridge_context,
> 1961 (u8 *)&mmu_fault_dbg_info, (u32)trace_begin,
> 1962 sizeof(mmu_fault_dbg_info), 0);
> 1963
> 1964 if (status)
> 1965 break;
> 1966
> 1967 poll_cnt++;
> 1968 }
> 1969
> 1970 if (mmu_fault_dbg_info.head[0] != MMU_FAULT_HEAD1 &&
> 1971 mmu_fault_dbg_info.head[1] != MMU_FAULT_HEAD2) {
> 1972 status = -ETIME;
> 1973 pr_err("%s:No DSP MMU-Fault information available.\n",
> 1974 __func__);
> 1975 }
> 1976 }
> 1977
> 1978 if (!status) {
> 1979 total_size = mmu_fault_dbg_info.size;
> 1980 /* Limit the size in case DSP went crazy */
> 1981 if (total_size > MAX_MMU_DBGBUFF)
> 1982 total_size = MAX_MMU_DBGBUFF;
> 1983
> 1984 buffer = kzalloc(total_size, GFP_ATOMIC);
> 1985 if (!buffer) {
> 1986 status = -ENOMEM;
> 1987 pr_debug("%s: Failed to "
> 1988 "allocate stack dump buffer.\n", __func__);
> 1989 goto func_end;
> 1990 }
> 1991
> 1992 buffer_beg = buffer;
> 1993 buffer_end = buffer + total_size / 4;
> 1994
> 1994
> 1995 /* Read bytes from the DSP trace buffer... */
> 1996 status = (*intf_fxns->brd_read)(bridge_context,
> 1997 (u8 *)buffer, (u32)trace_begin,
> 1998 total_size, 0);
> 1999 if (status) {
> 2000 pr_debug("%s: Failed to Read Trace Buffer.\n",
> 2001 __func__);
> 2002 goto func_end;
> 2003 }
> 2004
> 2005 pr_err("\nAproximate Crash Position:\n"
> 2006 "--------------------------\n");
> 2007
> 2008 exc_type = buffer[3];
> 2009 if (!exc_type)
> 2010 i = buffer[79]; /* IRP */
> 2011 else
> 2012 i = buffer[80]; /* NRP */
> 2013
> 2014 status =
> 2015 cod_get_sym_value(code_mgr, DYNEXTBASE, &dyn_ext_base);
> 2016 if (status) {
> 2017 status = -EFAULT;
> 2018 goto func_end;
> 2019 }
> 2020
> 2021 if ((i > dyn_ext_base) && (node_find_addr(node_mgr, i,
> 2022 0x1000, &offset_output, name) == 0))
> 2023 pr_err("0x%-8x [\"%s\" + 0x%x]\n", i, name,
> 2024 i - offset_output);
> 2025 else
> 2026 pr_err("0x%-8x [Unable to match to a symbol.]\n", i);
> 2027
> 2028 buffer += 4;
> 2029
> 2030 pr_err("\nExecution Info:\n"
> 2031 "---------------\n");
> 2032
> 2033 if (*buffer < ARRAY_SIZE(exec_ctxt)) {
> 2034 pr_err("Execution context \t%s\n",
> 2035 exec_ctxt[*buffer++]);
> 2036 } else {
> 2037 pr_err("Execution context corrupt\n");
> 2038 kfree(buffer_beg);
> 2039 return -EFAULT;
> 2040 }
> 2041 pr_err("Task Handle\t\t0x%x\n", *buffer++);
> 2042 pr_err("Stack Pointer\t\t0x%x\n", *buffer++);
> 2043 pr_err("Stack Top\t\t0x%x\n", *buffer++);
> 2044 pr_err("Stack Bottom\t\t0x%x\n", *buffer++);
> 2045 pr_err("Stack Size\t\t0x%x\n", *buffer++);
> 2046 pr_err("Stack Size In Use\t0x%x\n", *buffer++);
> 2047
> 2048 pr_err("\nCPU Registers\n"
> 2049 "---------------\n");
> 2050
> 2051 for (i = 0; i < 32; i++) {
> 2052 if (i == 4 || i == 6 || i == 8)
> 2053 pr_err("A%d 0x%-8x [Function Argument %d]\n",
> 2054 i, *buffer++, i-3);
> 2055 else if (i == 15)
> 2056 pr_err("A15 0x%-8x [Frame Pointer]\n",
> 2057 *buffer++);
> 2058 else
> 2059 pr_err("A%d 0x%x\n", i, *buffer++);
> 2060 }
> 2061
> 2062 pr_err("\nB0 0x%x\n", *buffer++);
> 2063 pr_err("B1 0x%x\n", *buffer++);
> 2064 pr_err("B2 0x%x\n", *buffer++);
> 2065
> 2066 if ((*buffer > dyn_ext_base) && (node_find_addr(node_mgr,
> 2067 *buffer, 0x1000, &offset_output, name) == 0))
> 2068
> 2069 pr_err("B3 0x%-8x [Function Return Pointer:"
> 2070 " \"%s\" + 0x%x]\n", *buffer, name,
> 2071 *buffer - offset_output);
> 2072 else
> 2073 pr_err("B3 0x%-8x [Function Return Pointer:"
> 2074 "Unable to match to a symbol.]\n", *buffer);
> 2075
> 2076 buffer++;
> 2077
> 2078 for (i = 4; i < 32; i++) {
> 2079 if (i == 4 || i == 6 || i == 8)
> 2080 pr_err("B%d 0x%-8x [Function Argument %d]\n",
> 2081 i, *buffer++, i-2);
> 2082 else if (i == 14)
> 2083 pr_err("B14 0x%-8x [Data Page Pointer]\n",
> 2084 *buffer++);
> 2085 else
> 2086 pr_err("B%d 0x%x\n", i, *buffer++);
> 2087 }
> 2088
> 2089 pr_err("\n");
> 2090
> 2091 for (i = 0; i < ARRAY_SIZE(dsp_regs); i++)
> 2092 pr_err("%s 0x%x\n", dsp_regs[i], *buffer++);
> 2093
> 2094 pr_err("\nStack:\n"
> 2095 "------\n");
> 2096
> 2097 for (i = 0; buffer < buffer_end; i++, buffer++) {
> 2098 if ((*buffer > dyn_ext_base) && (
> 2099 node_find_addr(node_mgr, *buffer , 0x600,
> 2100 &offset_output, name) == 0))
> 2101 pr_err("[%d] 0x%-8x [\"%s\" + 0x%x]\n",
> 2102 i, *buffer, name,
> 2103 *buffer - offset_output);
> 2104 else
> 2105 pr_err("[%d] 0x%x\n", i, *buffer);
> 2106 }
> 2107 kfree(buffer_beg);
> 2108 }
> 2109 func_end:
> 2110 return status;
> 2111 }
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
>
--
Chen Gang
Asianux Corporation
^ permalink raw reply [flat|nested] 10+ messages in thread
* Fwd: Re: [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized).
2012-12-12 10:02 ` Chen Gang
@ 2012-12-12 10:12 ` Chen Gang
2012-12-13 18:25 ` Omar Ramirez Luna
0 siblings, 1 reply; 10+ messages in thread
From: Chen Gang @ 2012-12-12 10:12 UTC (permalink / raw)
To: Greg KH; +Cc: linux-kernel
Hello Greg Kroah-Hartman:
excuse me, I have to forward this mail to you.
I have sent it to Omar Ramirez Luna <omar.ramirez@ti.com>, but failed.
(get mail delivery failed )
thanks.
gchen
-------- 原始消息 --------
主题: Re: [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug
for uninitialized buffer (name buf not initialized).
日期: Wed, 12 Dec 2012 18:02:44 +0800
发件人: Chen Gang <gang.chen@asianux.com>
收件人: omar.ramirez@ti.com
抄送: linux-kernel@vger.kernel.org <linux-kernel@vger.kernel.org>
于 2012年12月12日 17:48, Chen Gang 写道:
> Hello Omar Ramirez Luna:
>
> in drivers/staging/tidspbridge/core/io_sm.c:
> it is for function dump_dsp_stack.
> "char name[256]" is not initialized. (line 1898)
> name is as out buf for node_find_addr (line 2021..2024, 2066..2071, 2098..2103)
> if node_find_addr fails, pr_err may cause issue (name may not be initialized)
oh sorry, pr_err no issue (it is my fault).
>
> in drivers/staging/tidspbridge/rmgr/node.c:
> function node_find_addr can be called by dump_dsp_stack.
> param sym_name is as out buf which may be not initialized.
> so pr_debug may cause issue (print sym_name).
>
> in drivers/staging/tidspbridge/rmgr/nldr.c:
> function nldr_find_addr can be called by node_find_addr
> param sym_name is as out buf which may be not initialized.
> so pr_debug may cause issue (print sym_name).
>
but they are still have issue (pr_debug).
I find by code review, please help check whether this suggestion is valid.
thanks.
> please help checking, thanks.
>
> gchen.
>
>
> in drivers/staging/tidspbridge/rmgr/nldr.c:
>
> 1798 int nldr_find_addr(struct nldr_nodeobject *nldr_node, u32 sym_addr,
> 1799 u32 offset_range, void *offset_output, char *sym_name)
> 1800 {
> 1801 int status = 0;
> 1802 bool status1 = false;
> 1803 s32 i = 0;
> 1804 struct lib_node root = { NULL, 0, NULL };
> 1805 pr_debug("%s(0x%x, 0x%x, 0x%x, 0x%x, %s)\n", __func__, (u32) nldr_node,
> 1806 sym_addr, offset_range, (u32) offset_output, sym_name);
> 1807
> ...
>
>
> in drivers/staging/tidspbridge/rmgr/node.c:
>
> 3009 int node_find_addr(struct node_mgr *node_mgr, u32 sym_addr,
> 3010 u32 offset_range, void *sym_addr_output, char *sym_name)
> 3011 {
> 3012 struct node_object *node_obj;
> 3013 int status = -ENOENT;
> 3014
> 3015 pr_debug("%s(0x%x, 0x%x, 0x%x, 0x%x, %s)\n", __func__,
> 3016 (unsigned int) node_mgr,
> 3017 sym_addr, offset_range,
> 3018 (unsigned int) sym_addr_output, sym_name);
> 3019
> 3020 list_for_each_entry(node_obj, &node_mgr->node_list, list_elem) {
> 3021 status = nldr_find_addr(node_obj->nldr_node_obj, sym_addr,
> 3022 offset_range, sym_addr_output, sym_name);
> 3023 if (!status)
> 3024 break;
> 3025 }
> 3026
> 3027 return status;
> 3028 }
>
>
>
>
> in drivers/staging/tidspbridge/core/io_sm.c:
>
> 1892 int dump_dsp_stack(struct bridge_dev_context *bridge_context)
> 1893 {
> 1894 int status = 0;
> 1895 struct cod_manager *code_mgr;
> 1896 struct node_mgr *node_mgr;
> 1897 u32 trace_begin;
> 1898 char name[256];
> 1899 struct {
> 1900 u32 head[2];
> 1901 u32 size;
> 1902 } mmu_fault_dbg_info;
> 1903 u32 *buffer;
> 1904 u32 *buffer_beg;
> 1905 u32 *buffer_end;
> 1906 u32 exc_type;
> 1907 u32 dyn_ext_base;
> 1908 u32 i;
> 1909 u32 offset_output;
> 1910 u32 total_size;
> 1911 u32 poll_cnt;
> 1912 const char *dsp_regs[] = {"EFR", "IERR", "ITSR", "NTSR",
> 1913 "IRP", "NRP", "AMR", "SSR",
> 1914 "ILC", "RILC", "IER", "CSR"};
> 1915 const char *exec_ctxt[] = {"Task", "SWI", "HWI", "Unknown"};
> 1916 struct bridge_drv_interface *intf_fxns;
> 1917 struct dev_object *dev_object = bridge_context->dev_obj;
> 1918
> 1919 status = dev_get_cod_mgr(dev_object, &code_mgr);
> 1920 if (!code_mgr) {
> 1921 pr_debug("%s: Failed on dev_get_cod_mgr.\n", __func__);
> 1922 status = -EFAULT;
> 1923 }
> 1924
> 1925 if (!status) {
> 1926 status = dev_get_node_manager(dev_object, &node_mgr);
> 1927 if (!node_mgr) {
> 1928 pr_debug("%s: Failed on dev_get_node_manager.\n",
> 1929 __func__);
> 1930 status = -EFAULT;
> 1931 }
> 1932 }
> 1933
> 1934 if (!status) {
> 1935 /* Look for SYS_PUTCBEG/SYS_PUTCEND: */
> 1936 status =
> 1937 cod_get_sym_value(code_mgr, COD_TRACEBEG, &trace_begin);
> 1938 pr_debug("%s: trace_begin Value 0x%x\n",
> 1939 __func__, trace_begin);
> 1940 if (status)
> 1941 pr_debug("%s: Failed on cod_get_sym_value.\n",
> 1942 __func__);
> 1943 }
> 1944 if (!status)
> 1945 status = dev_get_intf_fxns(dev_object, &intf_fxns);
> 1946 /*
> 1947 * Check for the "magic number" in the trace buffer. If it has
> 1948 * yet to appear then poll the trace buffer to wait for it. Its
> 1949 * appearance signals that the DSP has finished dumping its state.
> 1950 */
> 1951 mmu_fault_dbg_info.head[0] = 0;
> 1952 mmu_fault_dbg_info.head[1] = 0;
> 1953 if (!status) {
> 1954 poll_cnt = 0;
> 1955 while ((mmu_fault_dbg_info.head[0] != MMU_FAULT_HEAD1 ||
> 1956 mmu_fault_dbg_info.head[1] != MMU_FAULT_HEAD2) &&
> 1957 poll_cnt < POLL_MAX) {
> 1958
> 1959 /* Read DSP dump size from the DSP trace buffer... */
> 1960 status = (*intf_fxns->brd_read)(bridge_context,
> 1961 (u8 *)&mmu_fault_dbg_info, (u32)trace_begin,
> 1962 sizeof(mmu_fault_dbg_info), 0);
> 1963
> 1964 if (status)
> 1965 break;
> 1966
> 1967 poll_cnt++;
> 1968 }
> 1969
> 1970 if (mmu_fault_dbg_info.head[0] != MMU_FAULT_HEAD1 &&
> 1971 mmu_fault_dbg_info.head[1] != MMU_FAULT_HEAD2) {
> 1972 status = -ETIME;
> 1973 pr_err("%s:No DSP MMU-Fault information available.\n",
> 1974 __func__);
> 1975 }
> 1976 }
> 1977
> 1978 if (!status) {
> 1979 total_size = mmu_fault_dbg_info.size;
> 1980 /* Limit the size in case DSP went crazy */
> 1981 if (total_size > MAX_MMU_DBGBUFF)
> 1982 total_size = MAX_MMU_DBGBUFF;
> 1983
> 1984 buffer = kzalloc(total_size, GFP_ATOMIC);
> 1985 if (!buffer) {
> 1986 status = -ENOMEM;
> 1987 pr_debug("%s: Failed to "
> 1988 "allocate stack dump buffer.\n", __func__);
> 1989 goto func_end;
> 1990 }
> 1991
> 1992 buffer_beg = buffer;
> 1993 buffer_end = buffer + total_size / 4;
> 1994
> 1994
> 1995 /* Read bytes from the DSP trace buffer... */
> 1996 status = (*intf_fxns->brd_read)(bridge_context,
> 1997 (u8 *)buffer, (u32)trace_begin,
> 1998 total_size, 0);
> 1999 if (status) {
> 2000 pr_debug("%s: Failed to Read Trace Buffer.\n",
> 2001 __func__);
> 2002 goto func_end;
> 2003 }
> 2004
> 2005 pr_err("\nAproximate Crash Position:\n"
> 2006 "--------------------------\n");
> 2007
> 2008 exc_type = buffer[3];
> 2009 if (!exc_type)
> 2010 i = buffer[79]; /* IRP */
> 2011 else
> 2012 i = buffer[80]; /* NRP */
> 2013
> 2014 status =
> 2015 cod_get_sym_value(code_mgr, DYNEXTBASE, &dyn_ext_base);
> 2016 if (status) {
> 2017 status = -EFAULT;
> 2018 goto func_end;
> 2019 }
> 2020
> 2021 if ((i > dyn_ext_base) && (node_find_addr(node_mgr, i,
> 2022 0x1000, &offset_output, name) == 0))
> 2023 pr_err("0x%-8x [\"%s\" + 0x%x]\n", i, name,
> 2024 i - offset_output);
> 2025 else
> 2026 pr_err("0x%-8x [Unable to match to a symbol.]\n", i);
> 2027
> 2028 buffer += 4;
> 2029
> 2030 pr_err("\nExecution Info:\n"
> 2031 "---------------\n");
> 2032
> 2033 if (*buffer < ARRAY_SIZE(exec_ctxt)) {
> 2034 pr_err("Execution context \t%s\n",
> 2035 exec_ctxt[*buffer++]);
> 2036 } else {
> 2037 pr_err("Execution context corrupt\n");
> 2038 kfree(buffer_beg);
> 2039 return -EFAULT;
> 2040 }
> 2041 pr_err("Task Handle\t\t0x%x\n", *buffer++);
> 2042 pr_err("Stack Pointer\t\t0x%x\n", *buffer++);
> 2043 pr_err("Stack Top\t\t0x%x\n", *buffer++);
> 2044 pr_err("Stack Bottom\t\t0x%x\n", *buffer++);
> 2045 pr_err("Stack Size\t\t0x%x\n", *buffer++);
> 2046 pr_err("Stack Size In Use\t0x%x\n", *buffer++);
> 2047
> 2048 pr_err("\nCPU Registers\n"
> 2049 "---------------\n");
> 2050
> 2051 for (i = 0; i < 32; i++) {
> 2052 if (i == 4 || i == 6 || i == 8)
> 2053 pr_err("A%d 0x%-8x [Function Argument %d]\n",
> 2054 i, *buffer++, i-3);
> 2055 else if (i == 15)
> 2056 pr_err("A15 0x%-8x [Frame Pointer]\n",
> 2057 *buffer++);
> 2058 else
> 2059 pr_err("A%d 0x%x\n", i, *buffer++);
> 2060 }
> 2061
> 2062 pr_err("\nB0 0x%x\n", *buffer++);
> 2063 pr_err("B1 0x%x\n", *buffer++);
> 2064 pr_err("B2 0x%x\n", *buffer++);
> 2065
> 2066 if ((*buffer > dyn_ext_base) && (node_find_addr(node_mgr,
> 2067 *buffer, 0x1000, &offset_output, name) == 0))
> 2068
> 2069 pr_err("B3 0x%-8x [Function Return Pointer:"
> 2070 " \"%s\" + 0x%x]\n", *buffer, name,
> 2071 *buffer - offset_output);
> 2072 else
> 2073 pr_err("B3 0x%-8x [Function Return Pointer:"
> 2074 "Unable to match to a symbol.]\n", *buffer);
> 2075
> 2076 buffer++;
> 2077
> 2078 for (i = 4; i < 32; i++) {
> 2079 if (i == 4 || i == 6 || i == 8)
> 2080 pr_err("B%d 0x%-8x [Function Argument %d]\n",
> 2081 i, *buffer++, i-2);
> 2082 else if (i == 14)
> 2083 pr_err("B14 0x%-8x [Data Page Pointer]\n",
> 2084 *buffer++);
> 2085 else
> 2086 pr_err("B%d 0x%x\n", i, *buffer++);
> 2087 }
> 2088
> 2089 pr_err("\n");
> 2090
> 2091 for (i = 0; i < ARRAY_SIZE(dsp_regs); i++)
> 2092 pr_err("%s 0x%x\n", dsp_regs[i], *buffer++);
> 2093
> 2094 pr_err("\nStack:\n"
> 2095 "------\n");
> 2096
> 2097 for (i = 0; buffer < buffer_end; i++, buffer++) {
> 2098 if ((*buffer > dyn_ext_base) && (
> 2099 node_find_addr(node_mgr, *buffer , 0x600,
> 2100 &offset_output, name) == 0))
> 2101 pr_err("[%d] 0x%-8x [\"%s\" + 0x%x]\n",
> 2102 i, *buffer, name,
> 2103 *buffer - offset_output);
> 2104 else
> 2105 pr_err("[%d] 0x%x\n", i, *buffer);
> 2106 }
> 2107 kfree(buffer_beg);
> 2108 }
> 2109 func_end:
> 2110 return status;
> 2111 }
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
>
--
Chen Gang
Asianux Corporation
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: Re: [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized).
2012-12-12 10:12 ` Fwd: " Chen Gang
@ 2012-12-13 18:25 ` Omar Ramirez Luna
2012-12-14 1:30 ` Chen Gang
0 siblings, 1 reply; 10+ messages in thread
From: Omar Ramirez Luna @ 2012-12-13 18:25 UTC (permalink / raw)
To: Chen Gang; +Cc: Greg KH, linux-kernel
Hi Chen,
Thanks for your report.
On Wed, Dec 12, 2012 at 4:12 AM, Chen Gang <gang.chen@asianux.com> wrote:
> excuse me, I have to forward this mail to you.
> I have sent it to Omar Ramirez Luna <omar.ramirez@ti.com>, but failed.
> (get mail delivery failed )
Please contact me with my new address (this one).
I'll take a look at these.
Cheers,
Omar
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized).
2012-12-13 18:25 ` Omar Ramirez Luna
@ 2012-12-14 1:30 ` Chen Gang
2012-12-24 14:26 ` Omar Ramirez Luna
0 siblings, 1 reply; 10+ messages in thread
From: Chen Gang @ 2012-12-14 1:30 UTC (permalink / raw)
To: Omar Ramirez Luna; +Cc: Greg KH, linux-kernel
于 2012年12月14日 02:25, Omar Ramirez Luna 写道:
> Hi Chen,
>
> Thanks for your report.
>
> On Wed, Dec 12, 2012 at 4:12 AM, Chen Gang <gang.chen@asianux.com> wrote:
>> excuse me, I have to forward this mail to you.
>> I have sent it to Omar Ramirez Luna <omar.ramirez@ti.com>, but failed.
>> (get mail delivery failed )
>
> Please contact me with my new address (this one).
is it suitable to modify the MAINTAINER file for your mail address ?
if suitable, please help modify it, I am not quite familiar with it.
also another suggestions:
I built ti otmap with ti dsp bridge by arm cross-compiler under i386 platform.
the version tag is next-20121213
I met 2 compiling issues.
a: module dependency:
Multifunction device drivers --> Texas Instruments TWL/4030/TWL5030.... is required for TI OTMAP.
it need depend on CONFIG_REGMAP (maybe also inculde CONFIG_REGMAP*)
if CONFIG_REGMAP* not defined, building will be failed.
b: version merging issue:
in drivers/staging/tidspbridge/core/_tiomap.h
need use "#include <mach-omap2/cm3xxx.h>" instead of "#include <mach-omap2/cm2xxx_3xxx.h>"
the macro OMAP3430_CM_AUTOIDLE_PLL has already move from cm2xxx_3xxx.h to cm3xxx.h.
(it seems arch/arm/mach-omap2/ is not a suitable place for including, but we have to)
if not change, compiling will be failed.
please also help to check the 2 compiling issues, thanks.
if these suggestions are valid,
please help to send patches for them,
better to mark me as Reported-by.
not need cc to me (for I am not reviewer)
Regards
gchen.
>
> I'll take a look at these.
>
> Cheers,
>
> Omar
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>
>
--
Chen Gang
Asianux Corporation
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized).
2012-12-14 1:30 ` Chen Gang
@ 2012-12-24 14:26 ` Omar Ramirez Luna
2012-12-26 1:52 ` Chen Gang
2012-12-26 1:56 ` Chen Gang
0 siblings, 2 replies; 10+ messages in thread
From: Omar Ramirez Luna @ 2012-12-24 14:26 UTC (permalink / raw)
To: Chen Gang; +Cc: Greg KH, linux-kernel
Hi,
On Thu, Dec 13, 2012 at 7:30 PM, Chen Gang <gang.chen@asianux.com> wrote:
> also another suggestions:
> I built ti otmap with ti dsp bridge by arm cross-compiler under i386 platform.
> the version tag is next-20121213
> I met 2 compiling issues.
>
> a: module dependency:
> Multifunction device drivers --> Texas Instruments TWL/4030/TWL5030.... is required for TI OTMAP.
> it need depend on CONFIG_REGMAP (maybe also inculde CONFIG_REGMAP*)
> if CONFIG_REGMAP* not defined, building will be failed.
This is not related to tidspbridge, I sent a patch anyway as it looks
to be a valid build dependency bug.
> b: version merging issue:
> in drivers/staging/tidspbridge/core/_tiomap.h
> need use "#include <mach-omap2/cm3xxx.h>" instead of "#include <mach-omap2/cm2xxx_3xxx.h>"
> the macro OMAP3430_CM_AUTOIDLE_PLL has already move from cm2xxx_3xxx.h to cm3xxx.h.
> (it seems arch/arm/mach-omap2/ is not a suitable place for including, but we have to)
> if not change, compiling will be failed.
Done.
Cheers,
Omar
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized).
2012-12-24 14:26 ` Omar Ramirez Luna
@ 2012-12-26 1:52 ` Chen Gang
2012-12-26 1:56 ` Chen Gang
1 sibling, 0 replies; 10+ messages in thread
From: Chen Gang @ 2012-12-26 1:52 UTC (permalink / raw)
To: Omar Ramirez Luna; +Cc: Greg KH, linux-kernel
于 2012年12月24日 22:26, Omar Ramirez Luna 写道:
> Hi,
>
> On Thu, Dec 13, 2012 at 7:30 PM, Chen Gang <gang.chen@asianux.com> wrote:
>> also another suggestions:
>> I built ti otmap with ti dsp bridge by arm cross-compiler under i386 platform.
>> the version tag is next-20121213
>> I met 2 compiling issues.
>>
>> a: module dependency:
>> Multifunction device drivers --> Texas Instruments TWL/4030/TWL5030.... is required for TI OTMAP.
>> it need depend on CONFIG_REGMAP (maybe also inculde CONFIG_REGMAP*)
>> if CONFIG_REGMAP* not defined, building will be failed.
>
> This is not related to tidspbridge, I sent a patch anyway as it looks
> to be a valid build dependency bug.
>
thank you.
:-)
--
Chen Gang
Asianux Corporation
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized).
2012-12-24 14:26 ` Omar Ramirez Luna
2012-12-26 1:52 ` Chen Gang
@ 2012-12-26 1:56 ` Chen Gang
2012-12-26 6:28 ` Omar Ramirez Luna
1 sibling, 1 reply; 10+ messages in thread
From: Chen Gang @ 2012-12-26 1:56 UTC (permalink / raw)
To: Omar Ramirez Luna; +Cc: Greg KH, linux-kernel
于 2012年12月24日 22:26, Omar Ramirez Luna 写道:
>> b: version merging issue:
>> > in drivers/staging/tidspbridge/core/_tiomap.h
>> > need use "#include <mach-omap2/cm3xxx.h>" instead of "#include <mach-omap2/cm2xxx_3xxx.h>"
>> > the macro OMAP3430_CM_AUTOIDLE_PLL has already move from cm2xxx_3xxx.h to cm3xxx.h.
>> > (it seems arch/arm/mach-omap2/ is not a suitable place for including, but we have to)
>> > if not change, compiling will be failed.
also please help checking this issue, thanks.
--
Chen Gang
Asianux Corporation
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized).
2012-12-26 1:56 ` Chen Gang
@ 2012-12-26 6:28 ` Omar Ramirez Luna
2012-12-26 6:44 ` Chen Gang
0 siblings, 1 reply; 10+ messages in thread
From: Omar Ramirez Luna @ 2012-12-26 6:28 UTC (permalink / raw)
To: Chen Gang; +Cc: Greg KH, linux-kernel, eballetbo
On Tue, Dec 25, 2012 at 7:56 PM, Chen Gang <gang.chen@asianux.com> wrote:
> 于 2012年12月24日 22:26, Omar Ramirez Luna 写道:
>>> b: version merging issue:
>>> > in drivers/staging/tidspbridge/core/_tiomap.h
>>> > need use "#include <mach-omap2/cm3xxx.h>" instead of "#include <mach-omap2/cm2xxx_3xxx.h>"
>>> > the macro OMAP3430_CM_AUTOIDLE_PLL has already move from cm2xxx_3xxx.h to cm3xxx.h.
>>> > (it seems arch/arm/mach-omap2/ is not a suitable place for including, but we have to)
>>> > if not change, compiling will be failed.
>
> also please help checking this issue, thanks.
I also sent a patch for this:
http://www.mail-archive.com/linux-omap@vger.kernel.org/msg82565.html
However, I just saw this one which was sent 6 days ago:
https://patchwork.kernel.org/patch/1895081/
The latter includes the new header file, mine just the definitions
needed, any approach is fine by me as they both fix the compile break.
Cheers,
Omar
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized).
2012-12-26 6:28 ` Omar Ramirez Luna
@ 2012-12-26 6:44 ` Chen Gang
0 siblings, 0 replies; 10+ messages in thread
From: Chen Gang @ 2012-12-26 6:44 UTC (permalink / raw)
To: Omar Ramirez Luna; +Cc: Greg KH, linux-kernel, eballetbo
于 2012年12月26日 14:28, Omar Ramirez Luna 写道:
>
> I also sent a patch for this:
>
> http://www.mail-archive.com/linux-omap@vger.kernel.org/msg82565.html
>
> However, I just saw this one which was sent 6 days ago:
>
> https://patchwork.kernel.org/patch/1895081/
>
> The latter includes the new header file, mine just the definitions
> needed, any approach is fine by me as they both fix the compile break.
>
> Cheers,
>
> Omar
>
>
ok, thanks
by the way:
the suggestion is sent in 2012-12-14 which is earlier than 2012-12-19
ref: http://www.gossamer-threads.com/lists/linux/kernel/1646629
at 3rd reply.
:-)
--
Chen Gang
Asianux Corporation
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2012-12-26 6:43 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-12-12 9:48 [Suggestion] drivers/staging/tidspbridge: pr_err and pr_debug for uninitialized buffer (name buf not initialized) Chen Gang
2012-12-12 10:02 ` Chen Gang
2012-12-12 10:12 ` Fwd: " Chen Gang
2012-12-13 18:25 ` Omar Ramirez Luna
2012-12-14 1:30 ` Chen Gang
2012-12-24 14:26 ` Omar Ramirez Luna
2012-12-26 1:52 ` Chen Gang
2012-12-26 1:56 ` Chen Gang
2012-12-26 6:28 ` Omar Ramirez Luna
2012-12-26 6:44 ` Chen Gang
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.