函数逻辑报告 |
Source Code:arch\x86\kernel\cpu\mce\amd.c |
Create Date:2022-07-27 09:03:42 |
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
| 首页 | 函数Tree |
| 注解内核,赢得工具 | 下载SCCT | English |
函数名称:umc_normaddr_to_sysaddr
函数原型:int umc_normaddr_to_sysaddr(u64 norm_addr, u16 nid, u8 umc, u64 *sys_addr)
返回类型:int
参数:
| 类型 | 参数 | 名称 |
|---|---|---|
| u64 | norm_addr | |
| u16 | nid | |
| u8 | umc | |
| u64 * | sys_addr |
| 674 | base等于0 |
| 675 | cs_id等于0 |
| 676 | bool hash_enabled = false |
| 679 | 如果amd_df_indirect_read(nid, 0, 0x1B4, umc, & tmp)则转到:out_err |
| 684 | hi_addr_offset等于tmp按位与GENMASK_ULL(31, 20)的值左移8位 |
| 686 | 如果norm_addr大于等于hi_addr_offset则 |
| 687 | ret_addr减等于hi_addr_offset |
| 688 | base等于1 |
| 703 | lgcy_mmio_hole_en等于tmp按位与BIT(1) |
| 704 | intlv_num_chan等于tmp右移4位按位与0xF |
| 705 | intlv_addr_sel等于tmp右移8位按位与0x7 |
| 706 | dram_base_addr等于tmp按位与GENMASK_ULL(31, 12)的值左移16位 |
| 709 | 如果intlv_addr_sel大于3则 |
| 710 | 打印错误信息("%s: Invalid interleave address select %d.\n", __func__, intlv_addr_sel) |
| 712 | 转到:out_err |
| 719 | intlv_num_sockets等于tmp右移8位按位与0x1 |
| 720 | intlv_num_dies等于tmp右移10位按位与0x3 |
| 721 | dram_limit_addr等于tmp按位与GENMASK_ULL(31, 12)的值左移16位按位或GENMASK_ULL(27, 0) |
| 723 | intlv_addr_bit等于intlv_addr_sel加8 |
| 727 | 当:intlv_num_chan恒等于0 |
| 727 | intlv_num_chan等于0 |
| 727 | 退出 |
| 728 | 当:intlv_num_chan恒等于1 |
| 728 | intlv_num_chan等于1 |
| 728 | 退出 |
| 729 | 当:intlv_num_chan恒等于3 |
| 729 | intlv_num_chan等于2 |
| 729 | 退出 |
| 730 | 当:intlv_num_chan恒等于5 |
| 730 | intlv_num_chan等于3 |
| 730 | 退出 |
| 731 | 当:intlv_num_chan恒等于7 |
| 731 | intlv_num_chan等于4 |
| 731 | 退出 |
| 733 | 当:intlv_num_chan恒等于8 |
| 736 | 默认 |
| 737 | 打印错误信息("%s: Invalid number of interleaved channels %d.\n", __func__, intlv_num_chan) |
| 739 | 转到:out_err |
| 744 | 如果intlv_num_dies大于2则 |
| 745 | 打印错误信息("%s: Invalid number of interleaved nodes/dies %d.\n", __func__, intlv_num_dies) |
| 747 | 转到:out_err |
| 750 | num_intlv_bits加等于intlv_num_dies |
| 756 | 如果num_intlv_bits大于4则 |
| 757 | 打印错误信息("%s: Invalid interleave bits %d.\n", __func__, num_intlv_bits) |
| 759 | 转到:out_err |
| 762 | 如果num_intlv_bits大于0则 |
| 772 | 如果amd_df_indirect_read(nid, 0, 0x50, umc, & tmp)则转到:out_err |
| 775 | cs_fabric_id等于tmp右移8位按位与0xFF |
| 776 | die_id_bit等于0 |
| 779 | 如果intlv_num_chan则 |
| 785 | sock_id_bit等于die_id_bit |
| 788 | 如果intlv_num_dies或intlv_num_sockets则如果amd_df_indirect_read(nid, 1, 0x208, umc, & tmp)则 |
| 790 | 转到:out_err |
| 793 | 如果intlv_num_dies则 |
| 795 | die_id_shift等于tmp右移24位按位与0xF |
| 796 | die_id_mask等于tmp右移8位按位与0xFF |
| 798 | cs_id或等于cs_fabric_id按位与die_id_mask的值右移die_id_shift位左移die_id_bit位 |
| 802 | 如果intlv_num_sockets则 |
| 803 | socket_id_shift等于tmp右移28位按位与0xF |
| 804 | socket_id_mask等于tmp右移16位按位与0xFF |
| 806 | cs_id或等于cs_fabric_id按位与socket_id_mask的值右移socket_id_shift位左移sock_id_bit位 |
| 817 | temp_addr_y等于ret_addr按位与GENMASK_ULL(intlv_addr_bit - 1, 0) |
| 818 | temp_addr_i等于cs_id左移intlv_addr_bit位 |
| 819 | temp_addr_x等于ret_addr按位与GENMASK_ULL(63, intlv_addr_bit)的值左移num_intlv_bits位 |
| 820 | ret_addr等于temp_addr_x按位或temp_addr_i按位或temp_addr_y |
| 824 | ret_addr加等于dram_base_addr |
| 827 | 如果lgcy_mmio_hole_en则 |
| 828 | 如果amd_df_indirect_read(nid, 0, 0x104, umc, & tmp)则转到:out_err |
| 831 | dram_hole_base等于tmp按位与Create a contiguous bitmask starting at bit position @l and ending at* position @h. For example* GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.(31, 24) |
| 832 | 如果ret_addr大于等于dram_hole_base则ret_addr加等于BIT_ULL(32)减dram_hole_base |
| 836 | 如果hash_enabled则 |
| 844 | hashed_bit与等于BIT(0) |
| 846 | 如果hashed_bit不等于ret_addr右移intlv_addr_bit位按位与BIT(0)的值则ret_addr异或等于BIT(intlv_addr_bit) |
| 851 | 如果ret_addr大于dram_limit_addr则转到:out_err |
| 855 | 返回:0 |
| 857 | out_err : |
| 858 | 返回:负EINVAL |
| 源代码转换工具 开放的插件接口 | X |
|---|---|
| 支持:c/c++/esqlc/java Oracle/Informix/Mysql 插件可实现:逻辑报告 代码生成和批量转换代码 |