函数逻辑报告 | 
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 插件可实现:逻辑报告 代码生成和批量转换代码  |