diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/Kconfig | 4 | ||||
-rw-r--r-- | src/lib/Makefile.mk | 6 | ||||
-rw-r--r-- | src/lib/bootmem.c | 3 | ||||
-rw-r--r-- | src/lib/bootmode.c | 4 | ||||
-rw-r--r-- | src/lib/bootsplash.c | 14 | ||||
-rw-r--r-- | src/lib/coreboot_table.c | 8 | ||||
-rw-r--r-- | src/lib/edid_fill_fb.c | 7 | ||||
-rw-r--r-- | src/lib/ext_stage_cache.c | 4 | ||||
-rw-r--r-- | src/lib/fit_payload.c | 7 | ||||
-rw-r--r-- | src/lib/fmap.c | 3 | ||||
-rw-r--r-- | src/lib/fw_config.c | 4 | ||||
-rw-r--r-- | src/lib/imd_cbmem.c | 27 | ||||
-rw-r--r-- | src/lib/jpeg.c | 72 | ||||
-rw-r--r-- | src/lib/jpeg.h | 13 | ||||
-rw-r--r-- | src/lib/prog_loaders.c | 4 | ||||
-rw-r--r-- | src/lib/smbios.c | 41 | ||||
-rw-r--r-- | src/lib/string.c | 16 | ||||
-rw-r--r-- | src/lib/thread.c | 2 |
18 files changed, 142 insertions, 97 deletions
diff --git a/src/lib/Kconfig b/src/lib/Kconfig index e896704e39..2c1a93cff1 100644 --- a/src/lib/Kconfig +++ b/src/lib/Kconfig @@ -49,6 +49,10 @@ config DIMM_MAX It is multiplication of number of channel to number of DIMMs per channel +config MAX_SOCKET + int + default 1 + config DIMM_SPD_SIZE int default 256 diff --git a/src/lib/Makefile.mk b/src/lib/Makefile.mk index 56d8b1afd5..40df2b8f56 100644 --- a/src/lib/Makefile.mk +++ b/src/lib/Makefile.mk @@ -314,7 +314,11 @@ RMODULE_LDFLAGS := -z defs -Bsymbolic # rmdoule is named $(1).rmod define rmodule_link $(strip $(1)): $(strip $(2)) $$(COMPILER_RT_rmodules_$(3)) $(call src-to-obj,rmodules_$(3),src/lib/rmodule.ld) | $$(RMODTOOL) - $$(LD_rmodules_$(3)) $$(LDFLAGS_rmodules_$(3)) $(RMODULE_LDFLAGS) $($(1)-ldflags) -T $(call src-to-obj,rmodules_$(3),src/lib/rmodule.ld) -o $$@ --whole-archive --start-group $(filter-out %.ld,$(2)) --end-group +ifeq ($(CONFIG_LTO),y) + $$(CC_rmodules_$(3)) $$(CPPFLAGS_rmodules_$(3)) $$(CFLAGS_rmodules_$(3)) $$(LDFLAGS_rmodules_$(3):%=-Wl,%) $$(COMPILER_RT_FLAGS_rmodules_$(3):%=-Wl,%) $(RMODULE_LDFLAGS) $($(1)-ldflags:%=-Wl,%) -T $(call src-to-obj,rmodules_$(3),src/lib/rmodule.ld) -o $$@ -Wl,--whole-archive -Wl,--start-group $(filter-out %.ld,$(2)) -Wl,--no-whole-archive $$(COMPILER_RT_rmodules_$(3)) -Wl,--end-group +else + $$(LD_rmodules_$(3)) $$(LDFLAGS_rmodules_$(3)) $(RMODULE_LDFLAGS) $($(1)-ldflags) -T $(call src-to-obj,rmodules_$(3),src/lib/rmodule.ld) -o $$@ --whole-archive --start-group $(filter-out %.ld,$(2)) --no-whole-archive $$(COMPILER_RT_rmodules_$(3)) --end-group +endif $$(NM_rmodules_$(3)) -n $$@ > $$(basename $$@).map endef diff --git a/src/lib/bootmem.c b/src/lib/bootmem.c index 578ddac19f..ab15e85d08 100644 --- a/src/lib/bootmem.c +++ b/src/lib/bootmem.c @@ -4,6 +4,7 @@ #include <bootmem.h> #include <cbmem.h> #include <device/resource.h> +#include <drivers/efi/capsules.h> #include <symbols.h> #include <assert.h> #include <types.h> @@ -80,6 +81,8 @@ static void bootmem_init(void) /* Add memory used by CBMEM. */ cbmem_add_bootmem(); + efi_add_capsules_to_bootmem(); + bootmem_add_range((uintptr_t)_stack, REGION_SIZE(stack), BM_MEM_RAMSTAGE); bootmem_add_range((uintptr_t)_program, REGION_SIZE(program), diff --git a/src/lib/bootmode.c b/src/lib/bootmode.c index 2d5a7eb004..3cf77d6fd8 100644 --- a/src/lib/bootmode.c +++ b/src/lib/bootmode.c @@ -21,10 +21,6 @@ void gfx_set_init_done(int done) int display_init_required(void) { - /* Need display for showing splash screen. */ - if (CONFIG(BMP_LOGO)) - return 1; - /* For vboot, honor VB2_CONTEXT_DISPLAY_INIT. */ if (CONFIG(VBOOT)) { /* Must always select MUST_REQUEST_DISPLAY when using this diff --git a/src/lib/bootsplash.c b/src/lib/bootsplash.c index 38d0ce7c97..2ec0052bfa 100644 --- a/src/lib/bootsplash.c +++ b/src/lib/bootsplash.c @@ -28,8 +28,9 @@ void set_bootsplash(unsigned char *framebuffer, unsigned int x_resolution, } unsigned int image_width, image_height; - if (jpeg_fetch_size(jpeg, filesize, &image_width, &image_height) != 0) { - printk(BIOS_ERR, "Could not parse bootsplash.jpg\n"); + const char *err = jpeg_fetch_size(jpeg, filesize, &image_width, &image_height); + if (err != NULL) { + printk(BIOS_ERR, "Could not parse bootsplash.jpg: %s\n", err); return; } @@ -45,12 +46,11 @@ void set_bootsplash(unsigned char *framebuffer, unsigned int x_resolution, framebuffer += (yres - image_height) / 2 * bytes_per_line + (xres - image_width) / 2 * (fb_resolution / 8); - int ret = jpeg_decode(jpeg, filesize, framebuffer, image_width, image_height, - bytes_per_line, fb_resolution); + err = jpeg_decode(jpeg, filesize, framebuffer, image_width, image_height, + bytes_per_line, fb_resolution); cbfs_unmap(jpeg); - if (ret != 0) { - printk(BIOS_ERR, "Bootsplash could not be decoded. jpeg_decode returned %d.\n", - ret); + if (err != NULL) { + printk(BIOS_ERR, "Could not decode bootsplash.jpg: %s\n", err); return; } printk(BIOS_INFO, "Bootsplash loaded\n"); diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c index d7b6126385..e954edb822 100644 --- a/src/lib/coreboot_table.c +++ b/src/lib/coreboot_table.c @@ -536,9 +536,17 @@ static uintptr_t write_coreboot_table(uintptr_t rom_table_end) if (CONFIG(SMMSTORE_V2)) lb_smmstorev2(head); + /* Add information about firmware in form suitable for EFI updates. */ + if (CONFIG(DRIVERS_EFI_FW_INFO)) + lb_efi_fw_info(head); + /* Add board-specific table entries, if any. */ lb_board(head); + /* Possibly add UEFI capsules. */ + if (CONFIG(DRIVERS_EFI_UPDATE_CAPSULES)) + lb_efi_capsules(head); + if (CONFIG(CHROMEOS_RAMOOPS)) lb_ramoops(head); diff --git a/src/lib/edid_fill_fb.c b/src/lib/edid_fill_fb.c index e4fb08c3fd..c72b70172c 100644 --- a/src/lib/edid_fill_fb.c +++ b/src/lib/edid_fill_fb.c @@ -148,6 +148,13 @@ fb_add_framebuffer_info(uintptr_t fb_addr, uint32_t x_resolution, return info; } +/* Wrapper for Ada to have a simpler function signature */ +int fb_add_framebuffer_info_simple(uintptr_t fb_addr, uint32_t x_res, uint32_t y_res, + uint32_t bytes_per_line, uint8_t bits_per_pixel) +{ + return fb_add_framebuffer_info(fb_addr, x_res, y_res, bytes_per_line, bits_per_pixel) != NULL; +} + void fb_set_orientation(struct fb_info *info, enum lb_fb_orientation orientation) { if (!info) diff --git a/src/lib/ext_stage_cache.c b/src/lib/ext_stage_cache.c index 462a635dc8..427c9c30bb 100644 --- a/src/lib/ext_stage_cache.c +++ b/src/lib/ext_stage_cache.c @@ -16,6 +16,8 @@ static void stage_cache_create_empty(void) imd = &imd_stage_cache; stage_cache_external_region(&base, &size); + if (base == NULL || size == 0) + return; imd_handle_init(imd, (void *)(size + (uintptr_t)base)); printk(BIOS_DEBUG, "External stage cache:\n"); @@ -32,6 +34,8 @@ static void stage_cache_recover(void) imd = &imd_stage_cache; stage_cache_external_region(&base, &size); + if (base == NULL || size == 0) + return; imd_handle_init(imd, (void *)(size + (uintptr_t)base)); if (imd_recover(imd)) printk(BIOS_DEBUG, "Unable to recover external stage cache.\n"); diff --git a/src/lib/fit_payload.c b/src/lib/fit_payload.c index 21bc4e87ed..aea1ba75e9 100644 --- a/src/lib/fit_payload.c +++ b/src/lib/fit_payload.c @@ -110,8 +110,8 @@ static void add_cb_fdt_data(struct device_tree *tree) { u32 addr_cells = 1, size_cells = 1; u64 reg_addrs[2], reg_sizes[2]; - void *baseptr = NULL; - size_t size = 0; + void *baseptr; + size_t size; static const char *firmware_path[] = {"firmware", NULL}; struct device_tree_node *firmware_node = dt_find_node(tree->root, @@ -140,8 +140,7 @@ static void add_cb_fdt_data(struct device_tree *tree) /* Second is the CBMEM area (which usually includes the coreboot table). */ - cbmem_get_region(&baseptr, &size); - if (!baseptr || size == 0) { + if (cbmem_get_region(&baseptr, &size)) { printk(BIOS_WARNING, "FIT: CBMEM pointer/size not found!\n"); return; } diff --git a/src/lib/fmap.c b/src/lib/fmap.c index 75c5a9fb1c..80fb0b2be6 100644 --- a/src/lib/fmap.c +++ b/src/lib/fmap.c @@ -199,8 +199,7 @@ int fmap_locate_area(const char *name, struct region *ar) printk(BIOS_DEBUG, "FMAP: area %s found @ %x (%d bytes)\n", name, le32toh(area->offset), le32toh(area->size)); - ar->offset = le32toh(area->offset); - ar->size = le32toh(area->size); + *ar = region_create(le32toh(area->offset), le32toh(area->size)); rdev_munmap(&fmrd, area); diff --git a/src/lib/fw_config.c b/src/lib/fw_config.c index 02e2a7dadd..e03256764b 100644 --- a/src/lib/fw_config.c +++ b/src/lib/fw_config.c @@ -104,6 +104,10 @@ bool fw_config_probe_dev(const struct device *dev, const struct fw_config **matc if (!dev->probe_list) return true; + /* If the device wants to be enabled during unprovisioned fw_config */ + if (!fw_config_is_provisioned() && dev->enable_on_unprovisioned_fw_config) + return true; + for (probe = dev->probe_list; probe && probe->mask != 0; probe++) { if (!fw_config_probe(probe)) continue; diff --git a/src/lib/imd_cbmem.c b/src/lib/imd_cbmem.c index 91c86211f5..2fc54bfff7 100644 --- a/src/lib/imd_cbmem.c +++ b/src/lib/imd_cbmem.c @@ -15,17 +15,17 @@ uintptr_t _cbmem_top_ptr; static struct imd imd; -void *cbmem_top(void) +uintptr_t cbmem_top(void) { if (ENV_CREATES_CBMEM) { static uintptr_t top; if (top) - return (void *)top; + return top; top = cbmem_top_chipset(); - return (void *)top; + return top; } if (ENV_POSTCAR || ENV_RAMSTAGE) - return (void *)_cbmem_top_ptr; + return _cbmem_top_ptr; dead_code(); } @@ -55,7 +55,7 @@ static void cbmem_top_init_once(void) /* The test is only effective on X86 and when address hits UC memory. */ if (ENV_X86) - quick_ram_check_or_die((uintptr_t)cbmem_top() - sizeof(u32)); + quick_ram_check_or_die(cbmem_top() - sizeof(u32)); } void cbmem_initialize_empty_id_size(u32 id, u64 size) @@ -64,7 +64,7 @@ void cbmem_initialize_empty_id_size(u32 id, u64 size) cbmem_top_init_once(); - imd_handle_init(&imd, cbmem_top()); + imd_handle_init(&imd, (void *)cbmem_top()); printk(BIOS_DEBUG, "CBMEM:\n"); @@ -95,7 +95,7 @@ int cbmem_initialize_id_size(u32 id, u64 size) cbmem_top_init_once(); - imd_handle_init(&imd, cbmem_top()); + imd_handle_init(&imd, (void *)cbmem_top()); if (imd_recover(&imd)) return 1; @@ -193,16 +193,19 @@ void *cbmem_entry_start(const struct cbmem_entry *entry) void cbmem_add_bootmem(void) { - void *baseptr = NULL; - size_t size = 0; + void *baseptr; + size_t size; - cbmem_get_region(&baseptr, &size); + if (cbmem_get_region(&baseptr, &size)) { + printk(BIOS_ERR, "CBMEM pointer/size not found!\n"); + return; + } bootmem_add_range((uintptr_t)baseptr, size, BM_MEM_TABLE); } -void cbmem_get_region(void **baseptr, size_t *size) +int cbmem_get_region(void **baseptr, size_t *size) { - imd_region_used(&imd, baseptr, size); + return imd_region_used(&imd, baseptr, size); } #if ENV_PAYLOAD_LOADER || (CONFIG(EARLY_CBMEM_LIST) && ENV_HAS_CBMEM) diff --git a/src/lib/jpeg.c b/src/lib/jpeg.c index 242cf0ca8e..d084c1a7a5 100644 --- a/src/lib/jpeg.c +++ b/src/lib/jpeg.c @@ -1,9 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Provide a simple API around the Wuffs JPEG decoder - * Uses the heap (and lots of it) for the image-size specific - * work buffer, so ramstage-only. + * Provide a simple API around the Wuffs JPEG decoder. */ #include <stdint.h> @@ -21,38 +19,38 @@ /* ~16K is big enough to move this off the stack */ static wuffs_jpeg__decoder dec; -int jpeg_fetch_size(unsigned char *filedata, size_t filesize, unsigned int *width, - unsigned int *height) +const char *jpeg_fetch_size(unsigned char *filedata, size_t filesize, unsigned int *width, + unsigned int *height) { if (!width || !height) { - return JPEG_DECODE_FAILED; + return "invalid arg"; } wuffs_base__status status = wuffs_jpeg__decoder__initialize( &dec, sizeof(dec), WUFFS_VERSION, WUFFS_INITIALIZE__DEFAULT_OPTIONS); if (status.repr) { - return JPEG_DECODE_FAILED; + return status.repr; } wuffs_base__image_config imgcfg; wuffs_base__io_buffer src = wuffs_base__ptr_u8__reader(filedata, filesize, true); status = wuffs_jpeg__decoder__decode_image_config(&dec, &imgcfg, &src); if (status.repr) { - return JPEG_DECODE_FAILED; + return status.repr; } *width = wuffs_base__pixel_config__width(&imgcfg.pixcfg); *height = wuffs_base__pixel_config__height(&imgcfg.pixcfg); - return 0; + return NULL; } -int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic, - unsigned int width, unsigned int height, unsigned int bytes_per_line, - unsigned int depth) +const char *jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic, + unsigned int width, unsigned int height, unsigned int bytes_per_line, + unsigned int depth) { if (!filedata || !pic) { - return JPEG_DECODE_FAILED; + return "invalid arg"; } /* Relatively arbitrary limit that shouldn't hurt anybody. * 300M (10k*10k*3bytes/pixel) is already larger than our heap, so @@ -61,7 +59,7 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic, * calculations in this function. */ if ((width > 10000) || (height > 10000)) { - return JPEG_DECODE_FAILED; + return "invalid arg"; } uint32_t pixfmt; @@ -76,20 +74,38 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic, pixfmt = WUFFS_BASE__PIXEL_FORMAT__BGRA_NONPREMUL; break; default: - return JPEG_DECODE_FAILED; + return "invalid arg"; } wuffs_base__status status = wuffs_jpeg__decoder__initialize( &dec, sizeof(dec), WUFFS_VERSION, WUFFS_INITIALIZE__DEFAULT_OPTIONS); if (status.repr) { - return JPEG_DECODE_FAILED; + return status.repr; } + /* Opting in to lower quality means that we can pass an empty slice as the + * "work buffer" argument to wuffs_jpeg__decoder__decode_frame below. + * + * Decoding progressive (not sequential) JPEGs would still require dynamic + * memory allocation (and the amount of work buffer required depends on the + * image dimensions), but we choose to just reject progressive JPEGs. It is + * simpler than sometimes calling malloc (which can fail, especially for + * large allocations) and free. + * + * More commentary about these quirks is at + * https://github.com/google/wuffs/blob/beaf45650085a16780b5f708b72daaeb1aa865c8/std/jpeg/decode_quirks.wuffs + */ + wuffs_jpeg__decoder__set_quirk( + &dec, WUFFS_BASE__QUIRK_QUALITY, + WUFFS_BASE__QUIRK_QUALITY__VALUE__LOWER_QUALITY); + wuffs_jpeg__decoder__set_quirk( + &dec, WUFFS_JPEG__QUIRK_REJECT_PROGRESSIVE_JPEGS, 1); + wuffs_base__image_config imgcfg; wuffs_base__io_buffer src = wuffs_base__ptr_u8__reader(filedata, filesize, true); status = wuffs_jpeg__decoder__decode_image_config(&dec, &imgcfg, &src); if (status.repr) { - return JPEG_DECODE_FAILED; + return status.repr; } wuffs_base__pixel_config pixcfg; @@ -101,25 +117,11 @@ int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *pic, wuffs_base__make_table_u8(pic, width * (depth / 8), height, bytes_per_line), wuffs_base__empty_slice_u8()); if (status.repr) { - return JPEG_DECODE_FAILED; + return status.repr; } - uint64_t workbuf_len_min_incl = wuffs_jpeg__decoder__workbuf_len(&dec).min_incl; - uint8_t *workbuf_array = malloc(workbuf_len_min_incl); - if ((workbuf_array == NULL) && workbuf_len_min_incl) { - return JPEG_DECODE_FAILED; - } - - wuffs_base__slice_u8 workbuf = - wuffs_base__make_slice_u8(workbuf_array, workbuf_len_min_incl); status = wuffs_jpeg__decoder__decode_frame(&dec, &pixbuf, &src, - WUFFS_BASE__PIXEL_BLEND__SRC, workbuf, NULL); - - free(workbuf_array); - - if (status.repr) { - return JPEG_DECODE_FAILED; - } - - return 0; + WUFFS_BASE__PIXEL_BLEND__SRC, + wuffs_base__empty_slice_u8(), NULL); + return status.repr; } diff --git a/src/lib/jpeg.h b/src/lib/jpeg.h index d2e9e5ffcf..c5179c8c4f 100644 --- a/src/lib/jpeg.h +++ b/src/lib/jpeg.h @@ -5,12 +5,13 @@ #include <stdlib.h> -#define JPEG_DECODE_FAILED 1 +/* These functions return NULL on success and a short error message on + * failure. Callers should not free the returned pointer. */ -int jpeg_fetch_size(unsigned char *filedata, size_t filesize, unsigned int *width, - unsigned int *height); -int jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *framebuffer, - unsigned int width, unsigned int height, unsigned int bytes_per_line, - unsigned int depth); +const char *jpeg_fetch_size(unsigned char *filedata, size_t filesize, unsigned int *width, + unsigned int *height); +const char *jpeg_decode(unsigned char *filedata, size_t filesize, unsigned char *framebuffer, + unsigned int width, unsigned int height, unsigned int bytes_per_line, + unsigned int depth); #endif diff --git a/src/lib/prog_loaders.c b/src/lib/prog_loaders.c index b2abbff575..49056cc024 100644 --- a/src/lib/prog_loaders.c +++ b/src/lib/prog_loaders.c @@ -60,7 +60,7 @@ static void run_ramstage_from_resume(struct prog *ramstage) stage_cache_load_stage(STAGE_RAMSTAGE, ramstage); ramstage->cbfs_type = CBFS_TYPE_STAGE; - prog_set_arg(ramstage, cbmem_top()); + prog_set_arg(ramstage, (void *)cbmem_top()); if (prog_entry(ramstage) != NULL) { printk(BIOS_DEBUG, "Jumping to image.\n"); @@ -126,7 +126,7 @@ void __noreturn run_ramstage(void) console_time_report(); /* This overrides the arg fetched from the relocatable module */ - prog_set_arg(&ramstage, cbmem_top()); + prog_set_arg(&ramstage, (void *)cbmem_top()); prog_run(&ramstage); diff --git a/src/lib/smbios.c b/src/lib/smbios.c index ca71e3b053..9cee637b69 100644 --- a/src/lib/smbios.c +++ b/src/lib/smbios.c @@ -6,6 +6,7 @@ #include <console/console.h> #include <version.h> #include <device/device.h> +#include <device/pciexp.h> #include <device/dram/spd.h> #include <elog.h> #include <endian.h> @@ -443,6 +444,14 @@ unsigned int __weak smbios_cpu_get_voltage(void) return 0; /* Unknown */ } +unsigned int smbios_get_max_sockets(void) +{ + if (CONFIG_MAX_SOCKET == 1) + return 1; + else + return smbios_soc_get_max_sockets(); +} + static int smbios_write_type1(unsigned long *current, int handle) { struct smbios_type1 *t = smbios_carve_table(*current, SMBIOS_SYSTEM_INFORMATION, @@ -1128,6 +1137,7 @@ static int smbios_generate_type9_from_devtree(struct device *dev, int *handle, enum slot_data_bus_bandwidth bandwidth; enum misc_slot_type type; enum misc_slot_length length; + uint8_t characteristics_1 = 0, characteristics_2 = 0; if (dev->path.type != DEVICE_PATH_PCI) return 0; @@ -1148,16 +1158,31 @@ static int smbios_generate_type9_from_devtree(struct device *dev, int *handle, else bandwidth = SlotDataBusWidthUnknown; - if (dev->smbios_slot_type) + if (dev->smbios_slot_type > SlotTypeUnknown) { type = dev->smbios_slot_type; - else + if ((type >= SlotTypePciExpress && type <= SlotTypeEDSFF_E3) || + (type >= SlotTypeAgp && type <= SlotTypeM2Socket3) || + (type == SlotTypePci)) { + characteristics_1 |= SMBIOS_SLOT_3P3V; + } + if ((type >= SlotTypeAgp && type <= SlotTypeAgp8X) || + (type == SlotTypePci)) + characteristics_1 |= SMBIOS_SLOT_5V; + } else { + characteristics_1 = SMBIOS_SLOT_UNKNOWN; type = SlotTypeUnknown; + } if (dev->smbios_slot_length) length = dev->smbios_slot_length; else length = SlotLengthUnknown; + if (pci_has_pme_pin(dev)) + characteristics_2 |= SMBIOS_SLOT_PME; + if (CONFIG(PCIEXP_PLUGIN_SUPPORT) && pciexp_dev_is_slot_hot_plug_cap(dev)) + characteristics_2 |= SMBIOS_SLOT_HOTPLUG; + return smbios_write_type9(current, handle, dev->smbios_slot_designation, type, @@ -1165,8 +1190,8 @@ static int smbios_generate_type9_from_devtree(struct device *dev, int *handle, usage, length, 0, - 1, - 0, + characteristics_1, + characteristics_2, dev->upstream->segment_group, dev->upstream->secondary, dev->path.pci.devfn); @@ -1233,9 +1258,11 @@ unsigned long smbios_write_tables(unsigned long current) handle++; update_max(len, max_struct_size, smbios_write_type3(¤t, handle++)); - struct smbios_type4 *type4 = (struct smbios_type4 *)current; - update_max(len, max_struct_size, smbios_write_type4(¤t, handle++)); - len += smbios_write_type7_cache_parameters(¤t, &handle, &max_struct_size, type4); + for (unsigned int s = 0; s < smbios_get_max_sockets(); s++) { + struct smbios_type4 *type4 = (struct smbios_type4 *)current; + update_max(len, max_struct_size, smbios_write_type4(¤t, handle++)); + len += smbios_write_type7_cache_parameters(¤t, &handle, &max_struct_size, type4); + } update_max(len, max_struct_size, smbios_write_type11(¤t, &handle)); if (CONFIG(ELOG)) update_max(len, max_struct_size, diff --git a/src/lib/string.c b/src/lib/string.c index a7f8074fc7..25d37b68f0 100644 --- a/src/lib/string.c +++ b/src/lib/string.c @@ -33,22 +33,6 @@ char *strconcat(const char *s1, const char *s2) return d; } -size_t strnlen(const char *src, size_t max) -{ - size_t i = 0; - while ((*src++) && (i < max)) - i++; - return i; -} - -size_t strlen(const char *src) -{ - size_t i = 0; - while (*src++) - i++; - return i; -} - char *strchr(const char *s, int c) { do { diff --git a/src/lib/thread.c b/src/lib/thread.c index 944c75e19c..8b58ca0f3e 100644 --- a/src/lib/thread.c +++ b/src/lib/thread.c @@ -251,7 +251,7 @@ static void threads_initialize(void) set_current_thread(t); - t->stack_orig = (uintptr_t)NULL; /* We never free the main thread */ + t->stack_orig = 0; /* We never free the main thread */ t->id = 0; t->can_yield = 1; |