MCPcopy Index your code
hub / github.com/cloud-hypervisor/cloud-hypervisor / write_config_register

Method write_config_register

pci/src/configuration.rs:907–966  ·  view source on GitHub ↗
(
        &mut self,
        reg_idx: usize,
        offset: u64,
        data: &[u8],
    )

Source from the content-addressed store, hash-verified

905 }
906
907 pub fn write_config_register(
908 &mut self,
909 reg_idx: usize,
910 offset: u64,
911 data: &[u8],
912 ) -> Vec<BarReprogrammingParams> {
913 if offset as usize + data.len() > 4 {
914 return Vec::new();
915 }
916
917 // Handle potential write to MSI-X message control register
918 if let Some(msix_cap_reg_idx) = self.msix_cap_reg_idx
919 && let Some(msix_config) = &self.msix_config
920 {
921 if msix_cap_reg_idx == reg_idx && offset == 2 && data.len() == 2 {
922 msix_config
923 .lock()
924 .unwrap()
925 .set_msg_ctl(LittleEndian::read_u16(data));
926 } else if msix_cap_reg_idx == reg_idx && offset == 0 && data.len() == 4 {
927 msix_config
928 .lock()
929 .unwrap()
930 .set_msg_ctl((LittleEndian::read_u32(data) >> 16) as u16);
931 }
932 }
933
934 match data.len() {
935 1 => self.write_byte(reg_idx * 4 + offset as usize, data[0]),
936 2 => self.write_word(
937 reg_idx * 4 + offset as usize,
938 u16::from(data[0]) | (u16::from(data[1]) << 8),
939 ),
940 4 => self.write_reg(reg_idx, LittleEndian::read_u32(data)),
941 _ => (),
942 }
943
944 if let Some(param) = self.detect_bar_reprogramming(reg_idx, data) {
945 self.pending_bar_reprogram.push(param);
946 }
947
948 if !self.pending_bar_reprogram.is_empty() {
949 // Return bar reprogramming only if the MSE bit is enabled;
950 if self.read_config_register(COMMAND_REG) & COMMAND_REG_MEMORY_SPACE_MASK
951 == COMMAND_REG_MEMORY_SPACE_MASK
952 {
953 info!(
954 "BAR reprogramming parameter is returned: {:x?}",
955 self.pending_bar_reprogram
956 );
957 return self.pending_bar_reprogram.drain(..).collect();
958 }
959 info!(
960 "MSE bit is disabled. No BAR reprogramming parameter is returned: {:x?}",
961 self.pending_bar_reprogram
962 );
963 }
964

Callers

nothing calls this directly

Calls 10

newFunction · 0.85
set_msg_ctlMethod · 0.80
write_byteMethod · 0.80
write_wordMethod · 0.80
lenMethod · 0.45
write_regMethod · 0.45
pushMethod · 0.45
is_emptyMethod · 0.45
read_config_registerMethod · 0.45

Tested by

no test coverage detected