From edf90aec42ec97cf3f19031781a39c538b0c62cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Thu, 23 Jun 2016 13:34:47 +0200 Subject: [PATCH] wifi_drv: transition to the new base API Issue #1987. --- repos/dde_linux/lib/mk/wifi.inc | 2 +- repos/dde_linux/src/drivers/wifi/main.cc | 67 ++++++----- repos/dde_linux/src/drivers/wifi/target.mk | 2 +- repos/dde_linux/src/drivers/wifi/wpa.h | 8 +- repos/dde_linux/src/lib/wifi/dummies.cc | 11 +- repos/dde_linux/src/lib/wifi/init.cc | 36 +++--- repos/dde_linux/src/lib/wifi/lx.h | 6 +- repos/dde_linux/src/lib/wifi/lxcc_emul.cc | 122 ++++++++++++-------- repos/dde_linux/src/lib/wifi/nic.cc | 78 +++++++------ repos/dde_linux/src/lib/wifi/socket_call.cc | 23 ++-- 10 files changed, 194 insertions(+), 161 deletions(-) diff --git a/repos/dde_linux/lib/mk/wifi.inc b/repos/dde_linux/lib/mk/wifi.inc index 9bdd576969..8c54803d4e 100644 --- a/repos/dde_linux/lib/mk/wifi.inc +++ b/repos/dde_linux/lib/mk/wifi.inc @@ -20,7 +20,7 @@ SRC_CC += dummies.cc init.cc lxcc_emul.cc nic.cc socket_call.cc # lx_kit CC_OPT += -DUSE_INTERNAL_SETJMP SRC_CC += mapped_io_mem_range.cc irq.cc pci.cc malloc.cc scheduler.cc \ - work.cc timer.cc printf.cc + work.cc timer.cc printf.cc env.cc SRC_S += setjmp.S SRC_C += lxc_emul.c diff --git a/repos/dde_linux/src/drivers/wifi/main.cc b/repos/dde_linux/src/drivers/wifi/main.cc index f4cef2a07b..64daf526f9 100644 --- a/repos/dde_linux/src/drivers/wifi/main.cc +++ b/repos/dde_linux/src/drivers/wifi/main.cc @@ -5,18 +5,18 @@ */ /* - * Copyright (C) 2014 Genode Labs GmbH + * Copyright (C) 2014-2016 Genode Labs GmbH * * This file is part of the Genode OS framework, which is distributed * under the terms of the GNU General Public License version 2. */ /* Genode includes */ -#include +#include +#include +#include #include #include -#include -#include #include #include @@ -25,12 +25,10 @@ typedef long long ssize_t; -extern void wifi_init(Server::Entrypoint &, Genode::Lock &); +extern void wifi_init(Genode::Env&, Genode::Lock&); extern "C" void wpa_conf_reload(void); extern "C" ssize_t wpa_write_conf(char const *, Genode::size_t); -bool config_verbose = false; - static Genode::Lock &wpa_startup_lock() { static Genode::Lock _l(Genode::Lock::LOCKED); @@ -70,7 +68,7 @@ namespace { /** * Generate wpa_supplicant.conf file */ -static int generate_wpa_supplicant_conf(char const **p, Genode::size_t *len, char const *ssid, +static int generatewpa_supplicant_conf(char const **p, Genode::size_t *len, char const *ssid, char const *bssid, bool protection = false, char const *psk = 0) { static char const *start_fmt = "network={\n\tscan_ssid=1\n"; @@ -107,9 +105,9 @@ static int generate_wpa_supplicant_conf(char const **p, Genode::size_t *len, cha struct Wlan_configration { - Genode::Attached_rom_dataspace config_rom { "wlan_configuration" }; - Genode::Signal_rpc_member dispatcher; - Genode::Lock update_lock; + Genode::Attached_rom_dataspace config_rom { "wlan_configuration" }; + Genode::Signal_handler dispatcher; + Genode::Lock update_lock; char const *buffer; Genode::size_t size; @@ -120,7 +118,7 @@ struct Wlan_configration void _activate_configuration() { if (wpa_write_conf(buffer, size) == 0) { - PINF("reload wpa_supplicant configuration"); + Genode::log("Reload wpa_supplicant configuration"); wpa_conf_reload(); } } @@ -131,7 +129,7 @@ struct Wlan_configration */ void _active_dummy_configuration() { - generate_wpa_supplicant_conf(&buffer, &size, "dummyssid", "00:00:00:00:00:00"); + generatewpa_supplicant_conf(&buffer, &size, "dummyssid", "00:00:00:00:00:00"); _activate_configuration(); } @@ -197,20 +195,20 @@ struct Wlan_configration /* psk must be between 8 and 63 characters long */ if (use_protection && (psk.length() < MIN_PSK_LENGTH)) { - PERR("error: given psk is too short"); + Genode::error("given pre-shared key is too short"); _active_dummy_configuration(); return; } - if (generate_wpa_supplicant_conf(&buffer, &size, ssid.string(), + if (generatewpa_supplicant_conf(&buffer, &size, ssid.string(), use_bssid ? bssid.string() : 0, use_protection, psk.string()) == 0) _activate_configuration(); } - void _handle_update(unsigned) { _update_configuration(); } + void _handle_update() { _update_configuration(); } - Wlan_configration(Server::Entrypoint &ep) + Wlan_configration(Genode::Entrypoint &ep) : dispatcher(ep, *this, &Wlan_configration::_handle_update) { @@ -222,33 +220,34 @@ struct Wlan_configration struct Main { - Server::Entrypoint &_ep; - Wpa_thread *_wpa; + Genode::Env &env; + Genode::Heap heap { env.ram(), env.rm() }; - Wlan_configration *_wc; + Genode::Attached_rom_dataspace config_rom { env, "config" }; - Main(Server::Entrypoint &ep) - : - _ep(ep) + Wpa_thread *wpa; + Wlan_configration *wlan_config; + + Main(Genode::Env &env) : env(env) { - Genode::Xml_node config = Genode::config()->xml_node(); - config_verbose = config.attribute_value("verbose", config_verbose); + bool const verbose = config_rom.xml().attribute_value("verbose", false); - _wpa = new (Genode::env()->heap()) Wpa_thread(wpa_startup_lock(), config_verbose); + wpa = new (&heap) Wpa_thread(env, wpa_startup_lock(), verbose); - _wpa->start(); + wpa->start(); try { - _wc = new (Genode::env()->heap()) Wlan_configration(_ep); - } catch (...) { PWRN("could not create wlan_configration handler"); } + wlan_config = new (&heap) Wlan_configration(env.ep()); + } catch (...) { + Genode::warning("could not create Wlan_configration handler"); + } - wifi_init(ep, wpa_startup_lock()); + wifi_init(env, wpa_startup_lock()); } }; -namespace Server { - char const *name() { return "wifi_drv_ep"; } - size_t stack_size() { return 32 * 1024 * sizeof(long); } - void construct(Entrypoint &ep) { static Main server(ep); } +namespace Component { + Genode::size_t stack_size() { return 32 * 1024 * sizeof(long); } + void construct(Genode::Env &env) { static Main server(env); } } diff --git a/repos/dde_linux/src/drivers/wifi/target.mk b/repos/dde_linux/src/drivers/wifi/target.mk index 30b47ce7be..f7f2c0ac38 100644 --- a/repos/dde_linux/src/drivers/wifi/target.mk +++ b/repos/dde_linux/src/drivers/wifi/target.mk @@ -2,7 +2,7 @@ REQUIRES = x86 TARGET = wifi_drv SRC_CC = main.cc -LIBS = wifi iwl_firmware wpa_supplicant server +LIBS = wifi iwl_firmware wpa_supplicant # needed for firmware.h INC_DIR += $(REP_DIR)/src/lib/wifi/include diff --git a/repos/dde_linux/src/drivers/wifi/wpa.h b/repos/dde_linux/src/drivers/wifi/wpa.h index a1df001771..2378be5340 100644 --- a/repos/dde_linux/src/drivers/wifi/wpa.h +++ b/repos/dde_linux/src/drivers/wifi/wpa.h @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2014 Genode Labs GmbH + * Copyright (C) 2014-2016 Genode Labs GmbH * * This file is part of the Genode OS framework, which is distributed * under the terms of the GNU General Public License version 2. @@ -21,7 +21,7 @@ extern "C" int wpa_main(int); extern "C" void wpa_conf_reload(void); -class Wpa_thread : public Genode::Thread_deprecated<8 * 1024 * sizeof(long)> +class Wpa_thread : public Genode::Thread { private: @@ -31,9 +31,9 @@ class Wpa_thread : public Genode::Thread_deprecated<8 * 1024 * sizeof(long)> public: - Wpa_thread(Genode::Lock &lock, bool debug_msg) + Wpa_thread(Genode::Env &env, Genode::Lock &lock, bool debug_msg) : - Thread_deprecated("wpa_supplicant"), + Thread(env, "wpa_supplicant", 8*1024*sizeof(long)), _lock(lock), _exit(-1), _debug_msg(debug_msg) { } void entry() diff --git a/repos/dde_linux/src/lib/wifi/dummies.cc b/repos/dde_linux/src/lib/wifi/dummies.cc index be1e41e340..39e598c2cd 100644 --- a/repos/dde_linux/src/lib/wifi/dummies.cc +++ b/repos/dde_linux/src/lib/wifi/dummies.cc @@ -11,6 +11,8 @@ * under the terms of the GNU General Public License version 2. */ +/* Genode includes */ +#include #include #include @@ -18,7 +20,7 @@ extern "C" { typedef long DUMMY; enum { - SHOW_DUMMY = 1, + SHOW_DUMMY = 0, SHOW_SKIP = 0, SHOW_RET = 0, }; @@ -33,14 +35,14 @@ enum { #define DUMMY_SKIP(retval, name) \ DUMMY name(void) { \ if (SHOW_SKIP) \ - PLOG( #name " called (from %p) skipped", __builtin_return_address(0)); \ + Genode::log( #name " called (from ", __builtin_return_address(0), ") skipped"); \ return retval; \ } #define DUMMY_STOP(retval, name) \ DUMMY name(void) { \ do { \ - PWRN( #name " called (from %p) stopped", __builtin_return_address(0)); \ + Genode::warning( #name " called (from ", __builtin_return_address(0), ") stopped"); \ Genode::sleep_forever(); \ } while (0); \ return retval; \ @@ -49,7 +51,8 @@ enum { #define DUMMY_RET(retval, name) \ DUMMY name(void) { \ if (SHOW_RET) \ - PWRN( #name " called (from %p) return %d", __builtin_return_address(0), retval); \ + Genode::warning( #name " called (from ", __builtin_return_address(0), ") return ", \ + retval); \ return retval; \ } diff --git a/repos/dde_linux/src/lib/wifi/init.cc b/repos/dde_linux/src/lib/wifi/init.cc index 05fb734d67..ca38918fea 100644 --- a/repos/dde_linux/src/lib/wifi/init.cc +++ b/repos/dde_linux/src/lib/wifi/init.cc @@ -12,8 +12,8 @@ */ /* Genode includes */ -#include -#include +#include +#include /* local includes */ #include @@ -21,6 +21,7 @@ #include +#include #include #include #include @@ -45,8 +46,6 @@ extern "C" void module_krng_mod_init(void); struct workqueue_struct *system_power_efficient_wq; struct workqueue_struct *system_wq; -static bool mac80211_only = false; - struct pernet_operations loopback_net_ops; struct net init_net; @@ -100,8 +99,8 @@ static Genode::Lock *_wpa_lock; static void run_linux(void *) { - system_power_efficient_wq = alloc_workqueue("system_power_efficient_wq", 0, 0); - system_wq = alloc_workqueue("system_wq", 0, 0); + system_power_efficient_wq = alloc_workqueue("system_power_efficient_wq", 0, 0); + system_wq = alloc_workqueue("system_wq", 0, 0); core_sock_init(); core_netlink_proto_init(); @@ -117,11 +116,8 @@ static void run_linux(void *) module_aes_init(); module_arc4_init(); module_chainiv_module_init(); - // module_krng_mod_init(); - if (!mac80211_only) { - module_iwl_drv_init(); - } + module_iwl_drv_init(); _wpa_lock->unlock(); @@ -133,15 +129,9 @@ static void run_linux(void *) unsigned long jiffies; -void wifi_init(Server::Entrypoint &ep, Genode::Lock &lock) +void wifi_init(Genode::Env &env, Genode::Lock &lock) { - /** - * For testing testing only the wireless stack with wpa_supplicant, - * amongst other on linux, we do not want to load the iwlwifi drivers. - */ - mac80211_only = Genode::config()->xml_node().attribute_value("mac80211_only", mac80211_only); - if (mac80211_only) - PINF("Initalizing only mac80211 stack without any driver!"); + Lx_kit::construct_env(env); _wpa_lock = &lock; @@ -151,13 +141,13 @@ void wifi_init(Server::Entrypoint &ep, Genode::Lock &lock) Lx::scheduler(); - Lx::timer(&ep, &jiffies); + Lx::timer(&env.ep(), &jiffies); - Lx::Irq::irq(&ep, Genode::env()->heap()); - Lx::Work::work_queue(Genode::env()->heap()); + Lx::Irq::irq(&env.ep(), &Lx_kit::env().heap()); + Lx::Work::work_queue(&Lx_kit::env().heap()); - Lx::socket_init(ep); - Lx::nic_init(ep); + Lx::socket_init(env.ep(), Lx_kit::env().heap()); + Lx::nic_init(env, Lx_kit::env().heap()); /* Linux task (handles the initialization only currently) */ static Lx::Task linux(run_linux, nullptr, "linux", diff --git a/repos/dde_linux/src/lib/wifi/lx.h b/repos/dde_linux/src/lib/wifi/lx.h index 5f0ae50041..30fc3e7558 100644 --- a/repos/dde_linux/src/lib/wifi/lx.h +++ b/repos/dde_linux/src/lib/wifi/lx.h @@ -28,9 +28,11 @@ namespace Lx { - void socket_init(Server::Entrypoint &); + void emul_init(Genode::Env&, Genode::Allocator&); - void nic_init(Server::Entrypoint &); + void socket_init(Genode::Entrypoint&, Genode::Allocator&); + + void nic_init(Genode::Env&, Genode::Allocator&); Genode::Ram_dataspace_capability backend_alloc(Genode::addr_t, Genode::Cache_attribute); void backend_free(Genode::Ram_dataspace_capability); diff --git a/repos/dde_linux/src/lib/wifi/lxcc_emul.cc b/repos/dde_linux/src/lib/wifi/lxcc_emul.cc index d199a42700..08d1bf8d79 100644 --- a/repos/dde_linux/src/lib/wifi/lxcc_emul.cc +++ b/repos/dde_linux/src/lib/wifi/lxcc_emul.cc @@ -12,9 +12,9 @@ */ /* Genode includes */ -#include #include -#include +#include +#include #include #include #include @@ -28,17 +28,16 @@ #include #include +#include #include #include -static bool const verbose = false; -#define PWRNV(...) do { if (verbose) PWRN(__VA_ARGS__); } while (0) - typedef Genode::size_t size_t; typedef Genode::addr_t addr_t; + /******************** ** linux/string.h ** ********************/ @@ -404,8 +403,10 @@ void *vmalloc(unsigned long size) { size_t real_size = size + sizeof(size_t); size_t *addr; - try { addr = (size_t *)Genode::env()->heap()->alloc(real_size); } - catch (...) { return 0; } + + if (!Lx_kit::env().heap().alloc(real_size, (void**)&addr)) { + return nullptr; + } *addr = real_size; return addr + 1; @@ -417,7 +418,7 @@ void vfree(const void *addr) if (!addr) return; size_t size = *(((size_t *)addr) - 1); - Genode::env()->heap()->free(const_cast(addr), size); + Lx_kit::env().heap().free(const_cast(addr), size); } @@ -494,7 +495,7 @@ class Driver : public Genode::List::Element int driver_register(struct device_driver *drv) { - new (Genode::env()->heap()) Driver(drv); + new (&Lx_kit::env().heap()) Driver(drv); return 0; } @@ -577,12 +578,16 @@ int strict_strtoul(const char *s, unsigned int base, unsigned long *res) ** linux/delay.h ** *******************/ -static Timer::Connection _timer; +static Timer::Connection &timer_for_msleep() +{ + static Timer::Connection inst(Lx_kit::env().env()); + return inst; +} void udelay(unsigned long usecs) { - _timer.usleep(usecs); + timer_for_msleep().usleep(usecs); Lx::scheduler().current()->schedule(); } @@ -590,7 +595,7 @@ void udelay(unsigned long usecs) void usleep_range(unsigned long min, unsigned long max) { - _timer.usleep(min); + timer_for_msleep().usleep(min); Lx::scheduler().current()->schedule(); } @@ -598,7 +603,7 @@ void usleep_range(unsigned long min, unsigned long max) void msleep(unsigned int msecs) { - _timer.msleep(msecs); + timer_for_msleep().msleep(msecs); Lx::scheduler().current()->schedule(); } @@ -718,7 +723,7 @@ int request_firmware_nowait(struct module *module, bool uevent, } if (!fwl) { - PERR("Firmware '%s' is not in the firmware white list.", name); + Genode::error("firmware '", name, "' is not in the firmware white list"); return -1; } @@ -728,27 +733,26 @@ int request_firmware_nowait(struct module *module, bool uevent, Genode::Dataspace_capability ds_cap = rom.dataspace(); if (!ds_cap.valid()) { - PERR("Could not get firmware ROM dataspace"); + Genode::error("could not get firmware ROM dataspace"); return -1; } - firmware *fw = (firmware *)kzalloc(sizeof (firmware), 0); + struct firmware *fw = (struct firmware *)kzalloc(sizeof(struct firmware), 0); if (!fw) { - PERR("Could not allocate memory for firmware metadata"); + Genode::error("could not allocate memory for firmware metadata"); return -1; } - /* use Genode env because our slab only goes up to 64KiB */ - fw->data = (u8*)Genode::env()->heap()->alloc(fwl->size); - if (!fw->data) { - PERR("Could not allocate memory for firmware image"); + /* use allocator because fw is too big for slab */ + if (!Lx_kit::env().heap().alloc(fwl->size, (void**)&fw->data)) { + Genode::error("Could not allocate memory for firmware image"); kfree(fw); return -1; } - void const *image = Genode::env()->rm_session()->attach(ds_cap); + void const *image = Lx_kit::env().env().rm().attach(ds_cap); Genode::memcpy((void*)fw->data, image, fwl->size); - Genode::env()->rm_session()->detach(image); + Lx_kit::env().env().rm().detach(image); fw->size = fwl->size; @@ -759,7 +763,7 @@ int request_firmware_nowait(struct module *module, bool uevent, void release_firmware(const struct firmware *fw) { - Genode::env()->heap()->free(const_cast(fw->data), fw->size); + Lx_kit::env().heap().free(const_cast(fw->data), fw->size); kfree(fw); } @@ -775,7 +779,6 @@ void *dma_alloc_coherent(struct device *dev, size_t size, void *addr = Lx::Malloc::dma().alloc(size, 12, &dma_addr); if (!addr) { - // PERR("dma alloc: %zu failed", size); return 0; } @@ -800,10 +803,11 @@ void *dma_zalloc_coherent(struct device *dev, size_t size, void dma_free_coherent(struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle) { - if (Lx::Malloc::dma().inside((Genode::addr_t)vaddr)) + if (Lx::Malloc::dma().inside((Genode::addr_t)vaddr)) { Lx::Malloc::dma().free(vaddr); - else - PERR("vaddr: %p is not DMA memory", vaddr); + } else { + Genode::error("vaddr: ", vaddr, " is not DMA memory"); + } } @@ -811,14 +815,16 @@ dma_addr_t dma_map_page(struct device *dev, struct page *page, size_t offset, size_t size, enum dma_data_direction direction) { - if (!Lx::Malloc::dma().inside((Genode::addr_t)page->addr)) - PERR("page->page: %p not DMA address", page->addr); + if (!Lx::Malloc::dma().inside((Genode::addr_t)page->addr)) { + Genode::error(__func__, ": virtual address ", (void*)page->addr, " not an DMA address"); + } dma_addr_t dma_addr = (dma_addr_t) Lx::Malloc::dma().phys_addr(page->addr); - if (dma_addr == ~0UL) - PERR("%s: virtual address %p not registered for DMA, called from: %p", - __func__, page->addr, __builtin_return_address(0)); + if (dma_addr == ~0UL) { + Genode::error(__func__, ": virtual address ", (void*)page->addr, + " not registered for DMA"); + } return dma_addr; } @@ -828,9 +834,10 @@ dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, size_t size, { dma_addr_t dma_addr = (dma_addr_t) Lx::Malloc::dma().phys_addr(cpu_addr); - if (dma_addr == ~0UL) - PERR("%s: virtual address %p not registered for DMA, called from: %p", - __func__, cpu_addr, __builtin_return_address(0)); + if (dma_addr == ~0UL) { + Genode::error(__func__, ": virtual address ", cpu_addr, + " not registered for DMA"); + } return dma_addr; } @@ -948,7 +955,7 @@ struct page *alloc_pages(gfp_t gfp_mask, unsigned int order) page->addr = Lx::Malloc::dma().alloc(size, 12); if (!page->addr) { - PERR("alloc_pages: %zu failed", size); + Genode::error("alloc_pages: ", size, " failed"); kfree(page); return 0; } @@ -981,8 +988,8 @@ void __free_page_frag(void *addr) void __free_pages(struct page *page, unsigned int order) { if (!atomic_dec_and_test(&page->_count)) { - PWRNV("attempting to free page %p with _count: %d, called from: %p", - page, atomic_read(&page->_count), __builtin_return_address(0)); + Genode::warning("attempting to free page ", page, " with _count: ", + atomic_read(&page->_count)); return; } @@ -1016,9 +1023,8 @@ struct page *virt_to_head_page(const void *addr) unsigned long aligned_addr = (unsigned long)addr & ~0xfff; page = Addr_to_page_mapping::find_page(aligned_addr); if (!page) { - PERR("BUG: addr: %p and aligned addr: %p have no page mapping, " - " called from: %p", addr, (void*)aligned_addr, - __builtin_return_address(0)); + Genode::error("BUG: addr: ", addr, " and aligned addr: ", + (void*)aligned_addr, " have no page mapping, "); Genode::sleep_forever(); } } @@ -1036,7 +1042,7 @@ void get_page(struct page *page) void put_page(struct page *page) { if (!page) { - PWRN("put_page: page is zero called from: %p", __builtin_return_address(0)); + Genode::warning(__func__, ": page is zero"); return; } @@ -1223,15 +1229,30 @@ int request_module(char const* format, ...) ** kernel/locking/mutex.c ** ****************************/ +/* + * XXX We have to create the waiters list lazy because the way + * DEFINE_MUTEX is currently implemented does not work w/o + * a global Env that was constructed before the static ctors + * are called. + */ +static inline void __check_or_initialize_mutex(struct mutex *m) +{ + if (!m->waiters) { + m->waiters = new (&Lx_kit::env().heap()) Lx::Task::List; + } +} + + enum { MUTEX_UNLOCKED = 1, MUTEX_LOCKED = 0, MUTEX_WAITERS = -1 }; + void mutex_init(struct mutex *m) { static unsigned id = 0; m->state = MUTEX_UNLOCKED; m->holder = nullptr; - m->waiters = new (Genode::env()->heap()) Lx::Task::List; + m->waiters = nullptr; m->id = ++id; } @@ -1240,7 +1261,8 @@ void mutex_destroy(struct mutex *m) { /* FIXME potentially blocked tasks are not unblocked */ - Genode::destroy(Genode::env()->heap(), static_cast(m->waiters)); + Genode::destroy(&Lx_kit::env().heap(), + static_cast(m->waiters)); m->holder = nullptr; m->waiters = nullptr; @@ -1250,6 +1272,8 @@ void mutex_destroy(struct mutex *m) void mutex_lock(struct mutex *m) { + __check_or_initialize_mutex(m); + while (1) { if (m->state == MUTEX_UNLOCKED) { m->state = MUTEX_LOCKED; @@ -1261,7 +1285,7 @@ void mutex_lock(struct mutex *m) Lx::Task *t = reinterpret_cast(m->holder); if (t == Lx::scheduler().current()) { - PERR("Bug: mutex does not support recursive locking"); + Genode::error("BUG: mutex does not support recursive locking"); Genode::sleep_forever(); } @@ -1277,12 +1301,14 @@ void mutex_lock(struct mutex *m) void mutex_unlock(struct mutex *m) { + __check_or_initialize_mutex(m); + if (m->state == MUTEX_UNLOCKED) { - PERR("Bug: multiple mutex unlock detected"); + Genode::error("BUG: multiple mutex unlock detected"); Genode::sleep_forever(); } if (m->holder != Lx::scheduler().current()) { - PERR("Bug: mutex unlock by task not holding the mutex"); + Genode::error("BUG: mutex unlock by task not holding the mutex"); Genode::sleep_forever(); } diff --git a/repos/dde_linux/src/lib/wifi/nic.cc b/repos/dde_linux/src/lib/wifi/nic.cc index c3ca820a39..ed0e6b43f7 100644 --- a/repos/dde_linux/src/lib/wifi/nic.cc +++ b/repos/dde_linux/src/lib/wifi/nic.cc @@ -13,11 +13,11 @@ */ /* Genode includes */ +#include #include #include #include #include -#include #include #include #include @@ -32,7 +32,6 @@ # include #include -extern bool config_verbose; enum { HEAD_ROOM = 128, /* XXX guessed value but works */ @@ -63,7 +62,7 @@ class Wifi_session_component : public Nic::Session_component Packet_descriptor packet = _tx.sink()->get_packet(); if (!packet.size()) { - PWRN("Invalid tx packet"); + Genode::warning("invalid tx packet"); return true; } @@ -122,7 +121,7 @@ class Wifi_session_component : public Nic::Session_component _handle_packet_stream(); if (!_rx.source()->ready_to_submit()) { - PWRN("Not ready to receive packet"); + Genode::warning("not ready to receive packet"); return; } @@ -138,7 +137,7 @@ class Wifi_session_component : public Nic::Session_component _rx.source()->submit_packet(p); } catch (...) { - PWRN("failed to process received packet"); + Genode::warning("failed to process received packet"); } } @@ -166,7 +165,7 @@ class Root : public Genode::Root_component ram_quota - session_size) { - PERR("insufficient 'ram_quota', got %zd, need %zd", - ram_quota, tx_buf_size + rx_buf_size + session_size); + Genode::error("insufficient 'ram_quota', got ", ram_quota, " need ", + tx_buf_size + rx_buf_size + session_size); throw Genode::Root::Quota_exceeded(); } session = new (md_alloc()) Wifi_session_component(tx_buf_size, rx_buf_size, - *env()->heap(), - *env()->ram_session(), - _ep, device); + *md_alloc(), + _env.ram(), + _env.ep(), device); return session; } @@ -208,22 +207,29 @@ class Root : public Genode::Root_component(&ep.rpc_ep(), &md_alloc), - _ep(ep) + Root(Genode::Env &env, Genode::Allocator &md_alloc) + : Genode::Root_component(&env.ep().rpc_ep(), &md_alloc), + _env(env) { } - void announce() { Genode::env()->parent()->announce(_ep.rpc_ep().manage(this)); } + void announce() { _env.parent().announce(_env.ep().manage(*this)); } }; Root *Root::instance; -void Lx::nic_init(Server::Entrypoint &ep) +static Genode::Env *_env; +static Genode::Allocator *_alloc; + + +void Lx::nic_init(Genode::Env &env, Genode::Allocator &alloc) { - static Root root(ep, *Genode::env()->heap()); + static Root root(env, alloc); Root::instance = &root; + + _env = &env; + _alloc = &alloc; } @@ -253,7 +259,7 @@ class Lx::Notifier public: - Notifier() : _block_alloc(Genode::env()->heap()) { } + Notifier() : _block_alloc(_alloc) { } void register_block(struct notifier_block *nb) { @@ -395,7 +401,7 @@ class Proto_hook_list static Proto_hook_list& proto_hook_list() { - static Proto_hook_list inst(*Genode::env()->heap()); + static Proto_hook_list inst(*_alloc); return inst; } @@ -415,7 +421,7 @@ extern "C" void __dev_remove_pack(struct packet_type *pt) extern "C" struct net_device *__dev_get_by_index(struct net *net, int ifindex) { if (!Root::instance->device) { - PERR("no net device registered!"); + Genode::error("no net device registered!"); return 0; } @@ -463,8 +469,9 @@ extern "C" int dev_queue_xmit(struct sk_buff *skb) struct net_device_ops const *ops = dev->netdev_ops; int rv = NETDEV_TX_OK; - if (skb->next) - PWRN("more skb's queued"); + if (skb->next) { + Genode::warning("more skb's queued"); + } rv = ops->ndo_start_xmit(skb, dev); @@ -484,7 +491,7 @@ extern "C" int register_netdevice(struct net_device *ndev) static bool already_registered = false; if (already_registered) { - PERR("We don't support multiple network devices in one driver instance"); + Genode::error("We don't support multiple network devices in one driver instance"); return -ENODEV; } @@ -503,14 +510,20 @@ extern "C" int register_netdevice(struct net_device *ndev) /* set mac adress */ Genode::memcpy(ndev->perm_addr, ndev->ieee80211_ptr->wiphy->perm_addr, ETH_ALEN); - if (config_verbose) - PINF("mac_address: %02x:%02x:%02x:%02x:%02x:%02x", - ndev->perm_addr[0], ndev->perm_addr[1], ndev->perm_addr[2], - ndev->perm_addr[3], ndev->perm_addr[4], ndev->perm_addr[5]); + { + using namespace Genode; + log("mac_address: ", + Hex(ndev->perm_addr[0], Hex::OMIT_PREFIX, Hex::PAD), ":", + Hex(ndev->perm_addr[1], Hex::OMIT_PREFIX, Hex::PAD), ":", + Hex(ndev->perm_addr[2], Hex::OMIT_PREFIX, Hex::PAD), ":", + Hex(ndev->perm_addr[3], Hex::OMIT_PREFIX, Hex::PAD), ":", + Hex(ndev->perm_addr[4], Hex::OMIT_PREFIX, Hex::PAD), ":", + Hex(ndev->perm_addr[5], Hex::OMIT_PREFIX, Hex::PAD)); + } int err = ndev->netdev_ops->ndo_open(ndev); if (err) { - PERR("ndev->netdev_ops->ndo_open(ndev): %d", err); + Genode::error("ndo_open() failed: ", err); return err; } @@ -553,9 +566,6 @@ extern "C" void netif_carrier_on(struct net_device *dev) extern "C" void netif_carrier_off(struct net_device *dev) { - if (!dev) - PERR("!dev %p", __builtin_return_address(0)); - dev->state |= 1UL << __LINK_STATE_NOCARRIER; Wifi_session_component *session = (Wifi_session_component *)dev->lx_nic_device; @@ -616,8 +626,8 @@ extern "C" void netif_wake_subqueue(struct net_device *dev, u16 queue_index) extern "C" u16 netdev_cap_txqueue(struct net_device *dev, u16 queue_index) { if (queue_index > dev-> real_num_tx_queues) { - PERR("error: queue_index %d out of range (%d max) called from: %p", - queue_index, dev->real_num_tx_queues, __builtin_return_address(0)); + Genode::error("queue_index ", queue_index, " out of range (", + dev->real_num_tx_queues, " max)"); return 0; } @@ -673,7 +683,7 @@ extern "C" struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name kcalloc(txqs, sizeof(struct netdev_queue), GFP_KERNEL | GFP_LX_DMA); if (!tx) { - PERR("could not allocate ndev_queues"); + Genode::error("could not allocate ndev_queues"); } dev->_tx = tx; diff --git a/repos/dde_linux/src/lib/wifi/socket_call.cc b/repos/dde_linux/src/lib/wifi/socket_call.cc index e92a8f84d0..ab2c732d22 100644 --- a/repos/dde_linux/src/lib/wifi/socket_call.cc +++ b/repos/dde_linux/src/lib/wifi/socket_call.cc @@ -13,7 +13,7 @@ /* Genode includes */ #include -#include +#include /* local includes */ #include @@ -135,7 +135,7 @@ class Lx::Socket { struct socket *sock = static_cast(_call.handle->socket); if (!sock) - PERR("BUG: sock is zero"); + Genode::error("BUG: sock is zero"); return sock; } @@ -151,7 +151,7 @@ class Lx::Socket return; } - PERR("sock_create_kern failed, res: %d", res); + Genode::error("sock_create_kern failed, res: ", res); _call.socket.result = nullptr; _call.err = res; } @@ -334,7 +334,7 @@ class Lx::Socket public: - Socket(Server::Entrypoint &ep) + Socket(Genode::Entrypoint &ep) : _dispatcher(ep, *this, &Lx::Socket::_handle), _task(run_socketcall, nullptr, "socketcall", @@ -359,7 +359,7 @@ class Lx::Socket default: _call.err = -EINVAL; - PWRN("unknown opcode: %u", _call.opcode); + Genode::warning("unknown opcode: ", (int)_call.opcode); break; } @@ -376,12 +376,14 @@ class Lx::Socket static Lx::Socket *_socket; +static Genode::Allocator *_alloc; -void Lx::socket_init(Server::Entrypoint &ep) +void Lx::socket_init(Genode::Entrypoint &ep, Genode::Allocator &alloc) { static Lx::Socket socket_ctx(ep); _socket = &socket_ctx; + _alloc = &alloc; } @@ -422,7 +424,7 @@ Wifi::Socket *Socket_call::socket(int domain, int type, int protocol) if (_call.socket.result == 0) return 0; - Wifi::Socket *s = new (Genode::env()->heap()) Wifi::Socket(_call.socket.result); + Wifi::Socket *s = new (_alloc) Wifi::Socket(_call.socket.result); return s; } @@ -435,10 +437,11 @@ int Socket_call::close(Socket *s) _socket->submit_and_block(); - if (_call.err) - PWRN("error %d on close()", _call.err); + if (_call.err) { + Genode::error("closing socket failed: ", _call.err); + } - destroy(Genode::env()->heap(), s); + destroy(_alloc, s); return 0; }